MyBatis —— 第二十二章 MyBatis 简介
1. 原始 JDBC 操作
查询数据:
// Register driver
Class.forName("com.mysql.cj.jdbc.Driver");
// Get the connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
// Get statment
PreparedStatement ps = conn.preparedStatement("select id, username, password from user");
// Execute query
ResultSet rs = ps.executeQuery();
// Traversal result set
while( rs.next() ) {
// Encapsulation entity
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
// Release resources
rs.close();
ps.close();
conn.close();
插入数据
// Simulate entity objects
User user = new User();
user.setId(2);
user.setUsername("XiaoMing");
user.setPassword("123456");
// Register driver
Class.forName("com.mysql.cj.jdbc.Driver");
// Get the connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
// Get statment
PreparedStatement ps = conn.preparedStatement("insert into user(id, username, password) values(?, ?, ?)");
// Set placeholder parameters
ps.setInt(1, user.getId);
ps.setString(2, user.getUsername);
ps.setString(3. user.getPassword);
// Execute query
ResultSet rs = ps.executeQuery();
// Release resources
ps.close();
conn.close();
2. 原始 JDBC 操作的分析
原始 JDBC 开发存在的问题如下:
- 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
- SQL 语句在代码中硬编码,造成代码不易维护,实际应用 SQL 变化的可能较大,SQL 变动需要改变 Java 代码
- 查询操作时,需要手动将结果集中的数据封装到实体中。插入操作时,需要手动将实体的数据设置到 SQL 语句的占位符位置
应对上述问题给出的解决方案:
- 使用数据库连接池初始化连接资源
- 将 SQL 语句抽取到 XML 配置文件或者是注解中
- 使用反射、内省等底层技术,自动将实体与表进行属性与字段的映射
3. 什么是 MyBatis
- MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要花费精力去处理加载驱动、创建链接、创建
statement
等繁杂过程。 - MyBatis 通过 XML 或者是注解的方式将要执行的各种
statement
配置起来,并通过 Java 对象和statement
中的动态参数进行映射,生成最终执行的 SQL 语句。 - 最后,MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。采用 ORM(对象关系映射)思想解决了实体和数据库的映射问题,对 JDBC 进行了封装,屏蔽了 JDBC API 底层访问细节,使我们不用与 JDBC API 打交道,就可以完成对数据库的持久操作。