dao


JDBC

  • JDBC,是java程序访问数据库的标准接口。

  • java代码通过jdbc接口来访问数据库,而jdbc接口通过jdbc驱动(即实现了这些接口的类)实现对数据库真正的访问。

  • jdbc接口是java标准库提供的,而jdbc驱动是数据库厂商提供的。

jdbc连接

Connection代表一个JDBC连接,它相当于Java程序到数据库的连接(通常是TCP连接)。

jdbc事务

JDBC提供了事务的支持,使用Connection可以开启、提交或回滚事务。

jdbc连接池

数据库连接池是一种复用Connection的组件,它可以避免反复创建新连接,提高JDBC代码的运行效率:

连接池内部维护了若干个Connection实例

总结

使用jbdc接口访问关系数据库的方法:

  • 创建全局DataSource实例,表示数据库连接池;
  • 在需要读写数据库的方法内部,按如下步骤访问数据库:
    • 从全局DataSource实例获取Connection实例;
    • 通过Connection实例创建PreparedStatement实例;
    • 执行SQL语句,如果是查询,则通过ResultSet读取结果集,如果是修改,则获得int结果。

注意:

  1. 要使用带资源的try语句来获取和释放资源。
  2. 使用事务时要正确提交或回滚。

在Spring中访问数据库

使用JDBC

JdbcTemplate

  • 属于spring-jdbc依赖

  • 通过IoC容器创建并管理一个DataSource实例,然后,Spring提供了一个JdbcTemplate,可以方便地让我们操作JDBC,因此,通常情况下,我们会实例化一个JdbcTemplate。

  • JdbcTemplate通过一写方法简化了jdbc的一系列操作,目的是避免繁琐的try语句。

使用声明式事务

  • Spring提供了一个PlatformTransactionManager来表示事务管理器,所有的事务都由它负责管理。而事务由TransactionStatus表示。
  • 通过@EnableTransactionManagement和@Transactional注解,可以开启对指定方法的事务支持。
  • 原理:aop代理,即构造一个提供事务支持的子类。

使用DAO模式

  • Spring提供了JdbcDaoSupport来便于我们实现DAO模式。

  • 子类直接从JdbcDaoSupport继承后,可以随时调用getJdbcTemplate()获得JdbcTemplate的实例。

  • 做具体项目,加一个dao子包

  • 可以创建一个继承自jdbcDaoSupport的使用泛型的抽象类,然后其他的dao类继承该抽象类,这样就可以少写很多代码了。

集成Hibernate

  • ORM:把关系数据库的表记录映射为Java对象的过程
  • Hibernate作为ORM框架,它可以替代JdbcTemplate
  • 在Spring中集成Hibernate需要配置的Bean如下:
    • DataSource;
    • LocalSessionFactoryBean,注入DataSource,它会再自动创建SessionFactory,每次操作数据库时,SessionFactiory(一个封装了DataSource的实例)会创建一个新的Session(一个封装了jdbc Connection的实例);
    • HibernateTransactionManager,注入SessionFactory(相当于注入了DataSource);
    • HibernateTemplate,注入SessionFactory(相当于注入了DataSource)(推荐)。
  • 注意:使用Hibernate时,不要使用基本类型的属性,总是使用包装类型,如Long或Integer。
  • 对JavaBean使用的注解均来自javax.persistence(JPA规范的一部分)
  • Session的load()方法和get()方法:
    • load()方法采用延迟加载,返回的对象不是实体,而是实体类的代理对象(子类对象),所有属性采用默认值。只有真正要用到数据时,才去数据库中读取数据。
    • get()方法返回的是实体。

集成JPA

  • JPA是orm的一个标准。
  • JPA只是接口,所以,还需要选择一个实现产品,跟JDBC接口和MySQL驱动一个道理。
  • 在Spring中集成JPA需要配置的Bean如下:
    • DataSource
    • LocalContainerEntityManagerFactoryBean,注入DataSource,并且它会再自动创建一个EntityManagerFactory
    • JpaTransactionManager,注入EntityManagerFactory
  • 使用JPA与Hibernate类似,但注入的核心资源是带有@PersistenceContext注解的EntityManager代理类。

集成MyBatis

ORM的缓存管理

  • 一级缓存:指在一个Session范围内的缓存

    User user1 = session.load(User.class, 123);
    User user2 = session.load(User.class, 123);

    上述两次查询返回同一实例。

  • 二级缓存:指跨Session的缓存(二级缓存默认关闭,如要使用,需手动设置)

    // 线程1读取:
    User user1 = session1.load(User.class, 123);
    ...
    // 一段时间后,线程2读取:
    User user2 = session2.load(User.class, 123);

    当二级缓存生效的时候,两个线程读取的User实例是一样的。但是容易出现并发访问的问题,很不稳定。

  • JdbcTemplate没有缓存,每次读取操作一定是数据库操作而不是缓存操作,缺点是代码比较繁琐。

Mybatis

  • Mybatis是半自动ORM框架。

  • Mybatis 只能将数据表映射到 Java 对象上,却不能将 Java 对象映射到数据表上,所以数据只能从数据表自动提取到 Java 对象中,反之则不行。要想将 Java 对象中的数据存储数据表中,开发人员需要手动编写 SQL 语句,依然非常麻烦,这就是 MyBatis 被称为半自动 ORM 框架的原因。

  • 与其他访问数据库方法的区别:

JDBCHibernateJPAMyBatis
DataSourceSessionFactoryEntityManagerFactorySqlSessionFactory
ConnectionSessionEntityManagerSqlSession
  • 和Hibernate、JPA不同的是(它们都用Javabean来映射),MyBatis使用Mapper来实现映射,Mapper是接口。

  • 在Mapper接口中定义访问数据库中的表的方法,而且要在方法上添上对应的注解,注解中就是sql语句(手写)。


文章作者: 淡夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 淡夜 !
评论
  目录