一、JDBC编程有哪些问题
方法是向blog表中查询一条数据
@Test
public void testJdbc() throws IOException {
Connection conn = null;
Statement stmt = null;
Blog blog = new Blog();
try {
// 注册 JDBC 驱动
// Class.forName("com.mysql.jdbc.Driver");
// 打开连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/gp-mybatis", "root", "123456");
// 执行查询
stmt = conn.createStatement();
String sql = "SELECT bid, name, author_id FROM blog where bid = 1";
ResultSet rs = stmt.executeQuery(sql);
// 获取结果集
while (rs.next()) {
Integer bid = rs.getInt("bid");
String name = rs.getString("name");
Integer authorId = rs.getInt("author_id");
blog.setAuthorId(authorId);
blog.setBid(bid);
blog.setName(name);
}
System.out.println(blog);
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
} catch (SQLException se2) {
}
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
问题
- 当我们要对数据库做操作,会有大量对重复代码
- 资源的管理,需要我们手动创建和关闭资源
- 结果集需要一个个的获取设置
- java 代码和sql 耦合,硬编码
二、dbUtils解决哪些问题
jdbc产生的问题,促使2003年apache开发了一个dbutils(感兴趣可以去了解一下)我们看下dbutls的写法
String sql = "select * from blog where bid = ? ";
Object[] params = new Object[]{bid};
BlogDto blogDto = queryRunner.query(sql, new BeanHandler<>(BlogDto.class), params);
return blogDto;
它使用queryRunner来做查询,我们是通过传入数据用new创建它
QueryRunner queryRunner = new QueryRunner(dataSource);
- 1.我们发现代码减少了,不需要重复代码
- 2.不需要我们手动的管理资源
- 3.通过 beanHander 传入泛型,可以直接返回我们想要的对象(实际还有很多的处理器,出处理成list map等)
问题
- java和sql还是存在耦合
- 参数的设置需要参照“?” 占位符顺序参入,不够灵活,比如不能传入对象等
- 性能不够好,没有缓存等机制
三、mybaits解决了哪些问题
其实mybatis 就解决了上面的问题.
- 1.java 代码 和sql 是解耦的,sql 都是写在配置文件当中
- 2.不需要手动的管理资源
- 3.绑定了双向的映射关系,参数可以传入对象,返回结果可以是一个对象.
- 4.提供了一级缓存和二级缓存来提升我们查询的性能
mybatis的使用我们就不展开了