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结果。
注意:
- 要使用带资源的try语句来获取和释放资源。
- 使用事务时要正确提交或回滚。
在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 框架的原因。
与其他访问数据库方法的区别:
| JDBC | Hibernate | JPA | MyBatis |
|---|---|---|---|
| DataSource | SessionFactory | EntityManagerFactory | SqlSessionFactory |
| Connection | Session | EntityManager | SqlSession |
和Hibernate、JPA不同的是(它们都用Javabean来映射),MyBatis使用Mapper来实现映射,Mapper是接口。
在Mapper接口中定义访问数据库中的表的方法,而且要在方法上添上对应的注解,注解中就是sql语句(手写)。