一、MyBatis介绍
以下来自官方介绍:
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 https://mybatis.org/mybatis-3/zh/index.html
说简单点,MyBatis是一个持久化框架,用于Java程序高效访问数据库,不用我们去访问原生相对繁琐的JDBC等Api,提升开发效率。
二、MyBatis环境准备
作为这一系列文章的第1篇,今天先讲述MyBatis的使用。
使用前先做下环境准备,以 Mysql为例,先创建数据库,假设名字为mybatis,然后创建表,表结构如下:
代码语言:javascript复制CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
很简单的一张表,包含几个字段:姓名,手机和创建时间
可以再加点数据:
代码语言:javascript复制INSERT INTO `user` VALUES ('1', 'edward', '13612345678', '2020-10-28 10:20:30');
INSERT INTO `user` VALUES ('2', 'howard', '13912345678', '2020-10-28 10:20:40');
三、具体使用步骤
1、引入jar包
代码语言:javascript复制 <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
使用的版本为3.3.0,后续都以这个版本讲述。
2、编写主配置文件
使用Xml描述,命名随意,根据公司规范,如mybatis-config.xml,以下为样例:
代码语言:javascript复制<?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>
<settings>
<setting name="lazyLoadingEnabled" value="false"/>
</settings>
<typeAliases>
</typeAliases>
<mappers>
<mapper resource="dal/mapper/UserMapper.xml"/>
</mappers>
</configuration>
可以看到Xml中顶层节点为configuration,有以下子元素:settings、typeAliases、mappers,当然还可以有其它子节点,后面单独讲述。
其中settings用来配置一些参数,mappers设置mapper文件, mapper文件就是我们编写Sql的地方,后面会讲。
3、配置数据源
可以在上面的主文件中配,以下为例:
代码语言:javascript复制<?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="dev" >
<environment id="dev">
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
</configuration>
如果是SpringBoot的程序一般在application.properties中配置,Spring会自动帮我们装配:
代码语言:javascript复制spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username = root
spring.datasource.password =123456
4、编写实体类
用于返回数据
代码语言:javascript复制public class UserEntity {
private Long id;
private String name;
private Date createTime;
private String phone;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
5、编写接口类
代码语言:javascript复制@Repository
public interface UserMapper {
List<UserEntity> listAllUser();
}
上面我们只定义了一个方法。
6、编写Sql
前面我们在主配置文件中引入的Mapper文件:
代码语言:javascript复制 <mappers>
<mapper resource="dal/mapper/UserMapper.xml"/>
</mappers>
现在相应目录编写文件内容:
代码语言:javascript复制<?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.liujh.mapper.UserMapper">
<sql id="userFields">
id,name, phone,create_time
</sql>
<select id="listAllUser" resultType="com.liujh.entity.UserEntity" >
select
<include refid="userFields"/>
from user
</select>
</mapper>
Mapper文件的顶层节点为mapper,其中namespace属性对应第4步编写的接口类的命名空间。
每一个sql语句都有相应的节点,查询语句对应select节点,其中重点的属性为id,和第4步编写的接口对应的方法:
代码语言:javascript复制List<UserEntity> listAllUser();
这里为了重用把查询字段单独用一个节点表示。
resultType表示查询结果返回的类型,对应前面定义的UserEntity。
四、测试
代码语言:javascript复制 @Resource
private UserMapper userMapper;
@Test
public void testMapper(){
List<UserEntity> userEntities = userMapper.listAllUser();
Assert.assertEquals(userEntities.size(), 2);
}
在一个测试类中注入UserMapper,当然可以手动new一个也行,然后debug下就可以看到userEntities的数据了