1.SpringJDBC
在Spring框架平台下,也提供的有JDBC的封装操作,在Spring中提供了一个模板方法 JdbcTemplate,里面封装了各种各样的 execute,query和update方法。 复制代码
JdbcTemplate这个类是JDBC的核心包的中心类,简化了JDBC的操作,可以避免常见的异常,它封装了JDBC的核心流程,应用只要提供SQL语句,提取结果集就可以了,它是线程安全的。
1.1 初始配置
在SpringJdbcTemplate的使用中,我们依然要配置对应的数据源,然后将JdbcTemplate对象注入到IoC容器中。 复制代码
@Configuration @ComponentScan public class SpringConfig { @Bean public DataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUsername("root"); dataSource.setPassword("123456"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf-8&serverTimezone=UTC"); return dataSource; } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource){ JdbcTemplate template = new JdbcTemplate(); template.setDataSource(dataSource); return template; } } 复制代码
1.2 CRUD操作
在我们具体操作数据库中数据的时候,我们只需要从容器中获取JdbcTemplate实例即可 复制代码
@Repository public class UserDao { @Autowired private JdbcTemplate template; public void addUser(){ int count = template.update("insert into t_user(user_name,real_name)values(?,?)","bobo","波波老师"); System.out.println("count = " + count); } public void query1(){ String sql = "select * from t_user"; List<User> list = template.query(sql, new RowMapper<User>() { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setUserName(rs.getString("user_name")); user.setRealName(rs.getString("real_name")); return user; } }); for (User user : list) { System.out.println(user); } } public void query2(){ String sql = "select * from t_user"; List<User> list = template.query(sql, new BeanPropertyRowMapper<>(User.class)); for (User user : list) { System.out.println(user); } } } 复制代码
2.Hibernate
前面介绍的Apache DBUtils和SpringJdbcTemplate虽然简化了数据库的操作,但是本身提供的功能还是比较简单的(缺少缓存,事务管理等),所以我们在实际开发中往往并没有直接使用上述技术,而是用到了Hibernate和MyBatis等这些专业的ORM持久层框架。 复制代码
2.1 ORM介绍
ORM( Object Relational Mapping) ,也就是对象与关系的映射,对象是程序里面的对象,关系是它与数据库里面的数据的关系,也就是说,ORM框架帮助我们解决的问题是程序对象和关系型数据库的相互映射的问题 复制代码
O:对象
M:映射
R:关系型数据库
2.2 Hibernate的使用
Hibernate是一个很流行的ORM框架,2001年的时候就出了第一个版本。使用步骤如下 复制代码
2.2.1 创建项目
创建一个Maven项目并添加相关的依赖即可,我们在此处直接通过 SpringDataJpa的依赖处理 复制代码
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 复制代码
2.2.2 配置文件
在使用Hibernate的使用,我们需要为实体类创建一些hbm的xml映射文件 复制代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'> <hibernate-mapping> <class name="com.boge.model.User" table="t_user"> <id name="id" /> <property name="userName" column="user_name"></property> <property name="realName" column="real_name"></property> </class> </hibernate-mapping> 复制代码
以及Hibernate的配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> com.mysql.cj.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&serverTimezone=UTC </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="User.hbm.xml"/> </session-factory> </hibernate-configuration> 复制代码
2.2.3 CRUD 操作
然后在程序中我们可以通过Hibernate提供的 Session对象来实现CRUD操作 复制代码
public class HibernateTest { /** * Hibernate操作案例演示 * @param args */ public static void main(String[] args) { Configuration configuration = new Configuration(); // 默认使用hibernate.cfg.xml configuration.configure(); // 创建Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 创建Session Session session = factory.openSession(); // 获取事务对象 Transaction transaction = session.getTransaction(); // 开启事务 transaction.begin(); // 把对象添加到数据库中 User user = new User(); user.setId(666); user.setUserName("hibernate"); user.setRealName("持久层框架"); session.save(user); transaction.commit(); session.close(); } } 复制代码
2.2.4 其他方式
在映射文件的位置,我们也可以通过注解的方式来替换掉映射文件 复制代码
@Data @Entity @Table(name = "t_user") public class User { @Id @Column(name = "id") private Integer id; @Column(name = "user_name") private String userName; @Column(name = "real_name") private String realName; @Column(name = "password") private String password; @Column(name = "age") private Integer age; @Column(name = "i_id") private Integer dId; } 复制代码
在Spring中给我们提供的JPA对持久层框架做了统一的封装,而且本质上就是基于
HibernateJPA来实现的,所以我们在使用的时候也可以通过SpringDataJPA的API来操作
dao的接口只需要继承JpaRepository接口即可
public interface IUserDao extends JpaRepository<User,Integer> { } 复制代码
service层正常处理
import java.util.List; @Service public class UserServiceImpl implements IUserService { @Autowired private IUserDao dao; @Override public List<User> query() { return dao.findAll(); } @Override public User save(User user) { return dao.save(user); } } 复制代码
2.3 Hibernate总结
Hibernate的出现大大简化了我们的数据库操作,同时也能够更好的应对更加复杂的业务场景,Hibernate具有如下的特点 复制代码
- 根据数据库方言自定生成SQL,移植性好
- 自动管理连接资源
- 实现了对象和关系型数据的完全映射,操作对象就想操作数据库记录一样
- 提供了缓存机制
Hibernate在处理复杂业务的时候同样也存在一些问题 复制代码
- 比如API中的get(),update()和save()方法,操作的实际上是所有的字段,没有办法指定部分字段,换句话说就是不够灵活
- 自定生成SQL的方式,如果要基于SQL去做一些优化的话,也是非常困难的。
3.不支持动态SQL,比如分表中的表名,条件,参数变化等,无法根据条件自动生成SQL
因此我们需要一个更为灵活的框架
3.MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 复制代码
“半自动”的ORM框架能够很好的解决上面所讲的Hibernate的几个问题,半自动化”是相对于Hibernate的全自动化来说的。它的封装程度没有Hibernate那么高,不会自动生成全部的SQL语句,主要解决的是SQL和对象的映射问题。 复制代码
MyBatis的前身是ibatis,2001年开始开发,是“internet”和“abatis ['æbətɪs](障碍物)”两个单词的组合。04年捐赠给Apache。2010年更名为MyBatis。 复制代码
在MyBatis里面,SQL和代码是分离的,所以会写SQL基本上就会用MyBatis,没有额外的学习成本。