(二)自定义 mybatis 之原生jdbc案例
前言
本文为个人技术总结,不够全面,瑕疵是有的,有用的话参考一下吧
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。 今天我们使用的是mysql的驱动mysql-connectorjava-5.1.39-bin.jar。
一、JDBC规范(掌握四个核心对象)
- DriverManager:用于注册驱动
- Connection: 表示与数据库创建的连接
- Statement: 操作数据库sql语句的对象
- ResultSet: 结果集或一张虚拟表
二、JDBC原理
Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
三、原生jdbc开发步骤
- 注册驱动.
- 获得连接.
- 获得执行sql语句的对象
- 执行sql语句,并返回结果
- 处理结果
- 释放资源.
四、原生jdbc案例
- 查询user表
- 以List集合形式返回
- 编写pojo类 (User)
- domain,pojo本质都是相同的
4.1 建库建表
CREATE DATABASE mybatis;
USE mybatis;
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`birthday` date DEFAULT NULL COMMENT '生日',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '小妖', '0', '1996-07-10', '西安');
INSERT INTO `user` VALUES ('2', '狐狸', '1', '1996-07-10', '西安');
INSERT INTO `user` VALUES ('3', '虫子', '1', '1996-07-10', '北京');
INSERT INTO `user` VALUES ('4', '咕子', '1', '1996-07-10', '甘肃');
4.2 创建pojo对象
public class User {
private Integer id;
private String userName;
private String sex;
private Date birthday;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
4.3 jdbc代码
/**
* 原生jdbc
*
* @Author: CYL
* @Date: 2021/4/19 10:18
*/
public class UserDaoImpl implements UserDao {
private String driverClass = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf-8";
private String username = "root";
private String password = "root";
/**
* 查询数据库 中的所有用户信息 并封装成一个 List<User>集合
*
* @return
* @author cyl
* @date 2021/4/19 10:19
*/
@Override
public List<User> queryUserList()throws Exception {
// 注册驱动
Class.forName(driverClass);
// 获取连接
Connection connection = DriverManager.getConnection(url, username, password);
// sql
String sql = "select id, username, sex, birthday, address from user;";
// 获取SQL语句执行平台statement对象
// Statement statement = connection.createStatement();
PreparedStatement statement = connection.prepareStatement(sql); // prepareStatement(预处理)
// 执行sql
ResultSet resultSet = statement.executeQuery();
List<User> list = new ArrayList<>();
User user = null;
// 解析结果集
while (resultSet.next()) {
user = new User();
int id = resultSet.getInt("id");
String userName = resultSet.getString("username");
String sex = resultSet.getString("sex");
Date birthday = resultSet.getDate("birthday");
String address = resultSet.getString("address");
user.setId(id);
user.setUserName(userName);
user.setSex(sex);
user.setBirthday(birthday);
user.setAddress(address);
list.add(user);
}
// 关闭资源
resultSet.close();
statement.close();
connection.close();
return list;
}
}
4.4 测试程序
public class MainTest {
@Test
public void testJDBC() throws Exception {
UserDao userDao = new UserDaoImpl();
List<User> list = userDao.queryUserList();
list.forEach(System.out::println);
}
}
4.5 原生jdbc存在的问题
- 频繁连接,释放数据库资源,降低系统性能
- SQL语句硬编码,难以维护
- 参数和占位符对应问题
- 结果集解析复杂,列名硬编码
原生jdbc也可以写一个JDBCUtils优化,这里不再过多赘述,此篇文章目的是为下篇《自定义 mybatis 之手写一个简单的Mybatis》做铺垫,Mybatis是对jdbc的封装,下面来看一下如何自定义一个简单的Mybatis:《自定义 mybatis 之手写一个简单的Mybatis》