DBUtils
如果项目中操作数据库比较少,使用DBUtils
DbUtils 提供了一个QueryRunner类它对数据库的增删改查的方法进行了封装,那么我们操作数据库就可以直接使用它提供的方法。
queryRunner = new QueryRunner(dataSource);
在 QueryRunner的构造函数里面,我们又可以传入一个数据源,比如在这里我们Hikari,这样我们就不需要再去写各种创建和释放连接的代码了。
调用 QueryRunner 的查询方法,传入这个 Handler,它就可以 自动把结果集转换成实体类 Bean 或者 List 或者 Map。
String sql = "select * from blog";
List<BlogDto> list = queryRunner.query(sql, new BeanListHandler<>(BlogDto.class));
DbUtils 要求数据库的字段跟对象 的属性名称完全一致,才可以实现自动映射。
Spring JDBC
第一个,我们不再需要去关心资源管理的问题。
第二个,对于结果集的处理,Spring JDBC 也提供了一个 RowMapper 接口,可以
把结果集转换成 Java 对象。
比如我们要把结果集转换成 Employee 对象,就可以针对一个 Employee
创建一个 RowMapper 对象,实现 RowMapper 接口,并且重写 mapRow()方法。我们 在 mapRow()方法里面完成对结果集的处理。
public class EmployeeRowMapper implements RowMapper {
@Override
public Object mapRow(ResultSet resultSet, int i) throws SQLException {
Employee employee = new Employee();
employee.setEmpId(resultSet.getInt("emp_id"));
employee.setEmpName(resultSet.getString("emp_name"));
employee.setEmail(resultSet.getString("emial"));
return employee;
}
}
DBUtils 和Spring JDBC对比
无论是 QueryRunner 还是 JdbcTemplate,都可以传入一个数据源进行初始 化,也就是资源管理这一部分的事情,可以交给专门的数据源组件去做,不用 我们手动创建和关闭;
对操作数据的增删改查的方法进行了封装;
可以帮助我们映射结果集,无论是映射成 List、Map 还是实体类。
缺点
- SQL 语句都是写死在代码里面的,依旧存在硬编码的问题;
- 参数只能按固定位置的顺序传入(数组),它是通过占位符去替换的, 不能自动映射;
- 在方法里面,可以把结果集映射成实体类,但是不能直接把实体类映射 成数据库的记录(没有自动生成 SQL 的功能);
- 查询没有缓存的功能。
MyBatis
特性
- 使用连接池对连接进行管理
- SQL 和代码分离,集中管理
- 结果集映射
- 参数映射和动态 SQL
- 重复 SQL 的提取
- 缓存管理
- 插件机制
对象 | 生命周期 |
---|---|
SqlSessionFactoryBuiler | 方法局部(method) |
SqlSessionFactory(单例) | 应用级别(application) |
SqlSession | 请求和操作(request/method) |
Mapper | 方法(method) |
问题
- resultType 和 resultMap 的区别?
- resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。对于单表查询的话用resultType是最合适的
- resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。
2、collection 和 association 的区别?