概述
MyBatis,相信大家在项目中应该都接触过,轻量级ORM框架。名词解释参考百度、bing等。
传统数据库操作
我们在没使用ORM框架的时候,是如何做数据库连接和操作的呢?下面以一个基于SpringBoot的Demo项目演示一下:
※sql文件使用之前SpringBoot系列文章中的Demo数据库。
- 在pom.xml里加入mysql依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 创建model类SysAdminUser
public class SysAdminUser {
private Integer adminUserId;
private String userName;
private String email;
private String nickName;
private Integer deptId;
//...省略getter setter
}
- 测试数据库连接和操作,创建启Chapter1DemoApplication.java
package com.zhlab.mybatisdemo.chapter1;
import com.zhlab.mybatisdemo.web.entity.SysAdminUser;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName Chapter1DemoApplication
* @Description //Chapter1DemoApplication
* @Author singleZhang
* @Email 405780096@qq.com
* @Date 2020/12/29 0029 上午 10:15
**/
@SpringBootApplication
public class Chapter1DemoApplication {
public static void main(String[] args) throws Exception {
/*
* 存储持久化数据常常会用到数据库
* 传统数据库操作:
* 加载驱动程序包
* 与数据库建立连接
* 拼装和执行 SQL语句
* 获取数据库结果,数据转化操作
* 关闭连接
* */
String url = "jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC";
String userName = "root";
String password = "root";
SysAdminUser userParam = new SysAdminUser();
userParam.setDeptId(5);
// 第一步:加载驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
// 第二步:获得数据库的连接
Connection conn = DriverManager.getConnection(url, userName, password);
// 第三步:创建语句并执行
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery("SELECT * FROM `sys_admin_user` WHERE dept_id = " + userParam.getDeptId() + ";");
// 第四步:处理数据库操作结果
List<SysAdminUser> userList = new ArrayList<>();
while(resultSet.next()){
SysAdminUser user = new SysAdminUser();
user.setAdminUserId(resultSet.getInt("admin_user_id"));
user.setUserName(resultSet.getString("user_name"));
user.setEmail(resultSet.getString("email"));
user.setNickName(resultSet.getString("nick_name"));
user.setDeptId(resultSet.getInt("dept_id"));
userList.add(user);
}
// 第五步:关闭连接
stmt.close();
for (SysAdminUser user : userList) {
System.out.println("userName : " + user.getUserName() + " ; email : " + user.getEmail());
}
}
}
如上,传统的数据库操作步骤繁琐,而且容易让业务代码变得复杂不易维护,如果遇到业务复杂的场景,对SQL的维护更有难度,ORM框架就是为解决上述问题而产生的,MyBatis是一款轻量优秀的ORM框架。
MyBatis
MyBatis的使用非常灵活,支持多种配置方式
- 完全代码配置
- 基于 XML的配置
- 基于外部框架配置,如Spring、SpringBoot(在之前的使用过程中,我们就使用过MybatisConfig.java代码配置)
接下来就在SpringBoot的项目中使用MyBatis
- 在pom.xml中加入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
※mybatis-spring-boot-starter,可以观察到里边包含了:mybatis、mybatis-spring、mybatis-spring-boot-autoconfigure等包,有兴趣的同学可以在项目里查看。
※mybatis3.5目录
我们可以看到加载进来的mybatis版本是3.5的,我们在pom文件中并没有指定mybatis版本。这是因为,在mybatis-spring-boot-starter的pom文件里,它的parent依赖是:mybatis-spring-boot-starter,在进入看,可以看到它已经指定了mybatis的版本:
<properties>
<mybatis.version>3.5.2</mybatis.version>
<mybatis-spring.version>2.0.2</mybatis-spring.version>
<mybatis-freemarker.version>1.2.0</mybatis-freemarker.version>
<mybatis-velocity.version>2.1.0</mybatis-velocity.version>
<mybatis-thymeleaf.version>1.0.1</mybatis-thymeleaf.version>
<spring-boot.version>2.1.6.RELEASE</spring-boot.version>
</properties>
- 修改application.properties文件
server.port=8081
#database
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
- 创建com.zhlab.mybatisdemo.chapter2包,并创建Chapter2DemoApplication、MainController、SysAdminUserMapper三个类,如下:
Chapter2DemoApplication.java
package com.zhlab.mybatisdemo.chapter2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName Chapter2DemoApplication
* @Description //Chapter2DemoApplication
* @Author singleZhang
* @Email 405780096@qq.com
* @Date 2020/12/29 0029 上午 10:15
**/
@SpringBootApplication
public class Chapter2DemoApplication {
public static void main(String[] args){
SpringApplication.run(Chapter2DemoApplication.class,args);
System.out.println("http://localhost:8081 this demo is running");
}
}
MainController.java
package com.zhlab.mybatisdemo.chapter2;
import com.zhlab.mybatisdemo.web.entity.SysAdminUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/")
public class MainController {
@Autowired
private SysAdminUserMapper sysAdminUserMapper;
@RequestMapping("/list")
public Object list() {
SysAdminUser userParam = new SysAdminUser();
userParam.setDeptId(5);
List<SysAdminUser> userList = sysAdminUserMapper.getUserList(userParam);
for (SysAdminUser user : userList) {
System.out.println("name : " + user.getNickName() + " ; email : " + user.getEmail());
}
return userList;
}
}
SysAdminUserMapper.java
package com.zhlab.mybatisdemo.chapter2;
import com.zhlab.mybatisdemo.web.entity.SysAdminUser;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SysAdminUserMapper {
List<SysAdminUser> getUserList(SysAdminUser user);
}
- 在resource下创建文件夹:com/zhlab/mybatisdemo/chapter2,并创建对应mapper的SysAdminUserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhlab.mybatisdemo.chapter2.SysAdminUserMapper">
<resultMap id="BaseResultMap" type="com.zhlab.mybatisdemo.web.entity.SysAdminUser">
<id column="admin_user_id" jdbcType="INTEGER" property="adminUserId" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="nick_name" jdbcType="VARCHAR" property="nickName" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="dept_id" jdbcType="INTEGER" property="deptId" />
</resultMap>
<select id="getUserList" resultMap="BaseResultMap">
SELECT * FROM `sys_admin_user`
<if test="deptId != null">
WHERE dept_id = #{deptId}
</if>
</select>
</mapper>
5.启动chapter2项目,并访问
启动chapter2
访问结果
userList
※以上是最简单的demo,跟之前的项目里有所不同的是没有任何配置,都是默认的。
分析
通过chapter1和chapter2对比,可以看到在获取用户列表对象的时候
mybatis只用一个Mapper接口里的方法就可以了
List<SysAdminUser> getUserList(SysAdminUser user);
而用JDBC操作数据库的话则需要多个步骤查询数据库,遍历返回结果并组装成列表对象
//...前面省略
// 第三步:创建语句并执行
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery("SELECT * FROM `sys_admin_user` WHERE dept_id = " + userParam.getDeptId() + ";");
// 第四步:处理数据库操作结果
List<SysAdminUser> userList = new ArrayList<>();
while(resultSet.next()){
SysAdminUser user = new SysAdminUser();
user.setAdminUserId(resultSet.getInt("admin_user_id"));
user.setUserName(resultSet.getString("user_name"));
user.setEmail(resultSet.getString("email"));
user.setNickName(resultSet.getString("nick_name"));
user.setDeptId(resultSet.getInt("dept_id"));
userList.add(user);
}
// 第五步:关闭连接
stmt.close();
//....后面省略
其中的映射关系如下图所示:
映射关系- 映射文件中的 SQL语句与映射接口中的抽象方法建立了映射
- SQL 语句的输入参数与方法输入参数建立了映射
- SQL语句的输出结果与方法结果建立了映射
总结
可以看出MyBatis的核心功能就是映射各类关系,在接下来的源码阅读中,就要围绕它的核心功能,阅读相关代码,理解MyBatis是如何工作的。
网友评论