为什么要用MyBatis-JDBC 连接数据库

在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API。我们先来回顾一下使用JDBC 的方式,我们是怎么操作数据库的。

// 注册JDBC 驱动
Class.forName("com.mysql.jdbc.Driver");
// 打开连接
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
// 执行查询
stmt = conn.createStatement();
String sql= "SELECT bid, name, author_id FROM blog";
ResultSet rs = stmt.executeQuery(sql);
// 获取结果集
while(rs.next()){
	int bid = rs.getInt("bid");
	String name = rs.getString("name");
	String authorId = rs.getString("author_id");
}

首先,我们在maven 中引入MySQL 驱动的依赖(JDBC 的包在java.sql 中)。

第一步,注册驱动,第二步,通过DriverManager 获取一个Connection,参数里面填数据库地址,用户名和密码。

第三步,我们通过Connection 创建一个Statement 对象。

第四步,通过Statement 的execute()方法执行SQL。当然Statement 上面定义了非常多的方法。execute()方法返回一个ResultSet 对象,我们把它叫做结果集。

第五步,我们通过ResultSet 获取数据。转换成一个POJO 对象。

最后,我们要关闭数据库相关的资源,包括ResultSet、Statement、Connection,它们的关闭顺序和打开的顺序正好是相反的。

这个就是我们通过JDBC 的API 去操作数据库的方法,这个仅仅是一个查询。如果我们项目当中的业务比较复杂,表非常多,各种操作数据库的增删改查的方法也比较多的话,那么这样代码会重复出现很多次。

在每一段这样的代码里面,我们都需要自己去管理数据库的连接资源,如果忘记写close()了,就可能会造成数据库服务连接耗尽。

另外还有一个问题就是处理业务逻辑和处理数据的代码是耦合在一起的。如果业务流程复杂,跟数据库的交互次数多,耦合在代码里面的SQL 语句就会非常多。如果要修改业务逻辑,或者修改数据库环境(因为不同的数据库SQL 语法略有不同),这个工作量是也是难以估计的。

还有就是对于结果集的处理,我们要把ResultSet 转换成POJO 的时候,必须根据字段属性的类型一个个地去处理,写这样的代码是非常枯燥的:

int bid = rs.getInt("bid");
String name = rs.getString("name");
String authorId = rs.getString("author_id");
blog.setAuthorId(authorId);
blog.setBid(bid);
blog.setName(name);

也正是因为这样,我们在实际工作中是比较少直接使用JDBC 的。那么我们在Java程序里面有哪些更加简单的操作数据库的方式呢?

Apache DbUtils

https://commons.apache.org/proper/commons-dbutils/

DbUtils 解决的最核心的问题就是结果集的映射, 可以把ResultSet 封装成JavaBean。它是怎么做的呢?

首先DbUtils 提供了一个QueryRunner 类,它对数据库的增删改查的方法进行了封装,那么我们操作数据库就可以直接使用它提供的方法。

在QueryRunner 的构造函数里面,我们又可以传入一个数据源,比如在这里我们Hikari,这样我们就不需要再去写各种创建和释放连接的代码了。

queryRunner = new QueryRunner(dataSource);

那我们怎么把结果集转换成对象呢?比如实体类Bean 或者List 或者Map?在DbUtils 里面提供了一系列的支持泛型的ResultSetHandler。

我们只要在DAO 层调用QueryRunner 的查询方法,传入这个Handler,它就可以自动把结果集转换成实体类Bean 或者List 或者Map。

String sql = "select * from blog";
List<BlogDto> list = queryRunner.query(sql, new BeanListHandler<>(BlogDto.class));

没有用过DbUtils 的同学,可以思考一下通过结果集到实体类的映射是怎么实现的?也就是说,我只传了一个实体类的类型,它怎么知道这个类型有哪些属性,每个属性是什么类型?然后创建这个对象并且给这些字段赋值的?答案正是反射。

大家也可以去看一下源码映证一下是不是这样。

问题:输出的结果中,authorId 为什么是空的?DbUtils 要求数据库的字段跟对象的属性名称完全一致,才可以实现自动映射。

BlogDto{bid=3, name='MyBatis 源码分析', authorId='null'}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值