什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。详细介绍可参考中文官网:https://mybatis.net.cn/
MyBatis 是目前比较流行的持久层框架,下面就用一个简单的 demo 来作为这款框架的入门介绍吧。
数据库数据准备
我这里选择是的Mysql 8.0.23 版本的数据库。
首先,创建一个数据库,创建模板语句如下
CREATE DATABASE IF NOT EXISTS <数据库名>
DEFAULT CHARACTER SET <字符集名>]
DEFAULT COLLATE <校对规则名>];
我使用的创建语句
CREATE DATABASE IF NOT EXISTS hukan
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
然后,创建用户表,表名:mybatis-user,SQL 如下:
create table mybatis_user
(
id int auto_increment
primary key,
name varchar(30) not null,
pwd varchar(32) not null
)
comment 'mybatis-用户表';
最后,像用户表中插入几条数据供后面程序使用
insert into mybatis_user (id, name, pwd)
values (1,'胡侃','123');
insert into mybatis_user (id, name, pwd)
values (1,'张三','123');
insert into mybatis_user (id, name, pwd)
values (1,'李四','235');
这样我们案例中需要使用到的数据库数据就准备完成了,接下里开始编写代码。
MyBatis 入门案例开发
我这里使用 idea 作为开发的工具
先创建一个不使用骨架的 Maven 工程,删除里面的 src 文件夹,该工程我们作为父工程使用,不需要放置代码。然后添加今天案例使用的模块。创建完成后的项目如图:
创建父工程的目的是为了方便管理多个子模块的 jar 包依赖。
向父工程中的 pom.xml(上图中下面那个) 文件添加项目需要的 jar。文件依赖内容如下:
<dependencies>
<!-- 导入 MyBatis 依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- 导入 Junit 依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 导入 Mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
</dependencies>
编写 User 实体类 ,这里需要注意的是 User 类的属性需要和数据库中字段名保持一致。代码如下:
package com.hukanmasheng.pojo;
public class User {
private Integer id;
private String name;
private String pewd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pewd='" + pewd + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPewd() {
return pewd;
}
public void setPewd(String pewd) {
this.pewd = pewd;
}
}
接下来编写 User 的数据访问层接口,在 Mybatis 中更喜欢用 mapper 来表示数据层。代码如下:
package com.hukanmasheng.mapper;
import com.hukanmasheng.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> findAll();
}
前面的代码完成以后,现在我们要进入今天的主题:MyBatis ,这部分可以参考 https://mybatis.net.cn/ 入门部分。
在 main->resources 目录中新增 MyBatis 核心配置文件 mybatis-config.xml,* 号的内容根据自己环境填写,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库引擎 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 数据库地址 -->
<property name="url" value="***"/>
<!-- 用户名 -->
<property name="username" value="***"/>
<!-- 密码 -->
<property name="password" value="***"/>
</dataSource>
</environment>
</environments>
</configuration>
在 main->resources 目录中新建 mapper 文件夹,在该文件夹中新增 UserMapper.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.hukanmasheng.mapper.UserMapper">
<select id="findAll" resultType="com.hukanmasheng.pojo.User">
select * from mybatis_user
</select>
</mapper>
这里的 namespace 指向 User 的数据访问接口 UserMapper。mapper 标签内可以理解为接口的具体实现。 id 和接口方法名保持一致,resultType 为接口返回数据类型。注意这里都要使用全限定类名。
那么怎么调用 UserMapper.xml 呢?这里就需要获取SqlSession 对象,这里我将获取SqlSession 的方法封装了一个工具类。代码如下:
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static{
String resource="mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 获取 SqlSession
* */
public static SqlSession getSqlSession()
{
return sqlSessionFactory.openSession();
}
}
如果到这里你就以为全部搞定,那就大错特错了。我们需要在 mybatis-config.xml 文件中注册 UserMapper.xml 文件。不然运行测试代码的时候会报如下错误:
Type interface com.hukanmasheng.mapper.UserMapper is not known to the MapperRegistry.
添加 mappers 标签, mybatis-config.xml 文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库引擎 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 数据库地址 -->
<property name="url" value="jdbc:mysql://localhost:3306/hukan?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<!-- 用户名 -->
<property name="username" value="root"/>
<!-- 密码 -->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
编写测试类代码。测试代码放在 test 文件夹下面。代码如下:
package com.hukanmasheng.mapper;
import com.hukanmasheng.pojo.User;
import com.hukanmasheng.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void test()
{
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.findAll();
sqlSession.close();
System.out.println(all);
}
}
运行测试代码,控制台即可打印出查询出的数据:
虽然结果正确打印了,但还是有个小问题,你可能会遇到:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
这行提示。这个就是希望我们使用更新的 com.mysql.cj.jdbc.Driver
将这个的 value 替换即可。再次运行,文字消失了。
到这里我们就完成了和MyBatis的第一次见面。