常见的 ORM 框架

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对比

  1. 无论是 QueryRunner 还是 JdbcTemplate,都可以传入一个数据源进行初始 化,也就是资源管理这一部分的事情,可以交给专门的数据源组件去做,不用 我们手动创建和关闭;

  2. 对操作数据的增删改查的方法进行了封装;

  3. 可以帮助我们映射结果集,无论是映射成 List、Map 还是实体类。

缺点

  1. SQL 语句都是写死在代码里面的,依旧存在硬编码的问题;
  2. 参数只能按固定位置的顺序传入(数组),它是通过占位符去替换的, 不能自动映射;
  3. 在方法里面,可以把结果集映射成实体类,但是不能直接把实体类映射 成数据库的记录(没有自动生成 SQL 的功能);
  4. 查询没有缓存的功能。

MyBatis

特性

  1. 使用连接池对连接进行管理
  2. SQL 和代码分离,集中管理
  3. 结果集映射
  4. 参数映射和动态 SQL
  5. 重复 SQL 的提取
  6. 缓存管理
  7. 插件机制
对象 生命周期
SqlSessionFactoryBuiler 方法局部(method)
SqlSessionFactory(单例) 应用级别(application)
SqlSession 请求和操作(request/method)
Mapper 方法(method)

问题

  1. resultType 和 resultMap 的区别?
  • resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。对于单表查询的话用resultType是最合适的
  • resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。

2、collection 和 association 的区别?


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