Spring boot整合Mybatis
前言
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
搭建项目
通过idea创建一个项目,项目结构如下
pom.xml中添加必须的几个依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置mybatis
路径resources/mybatis-config.xml 在配置文件中需要引入两个必须要的配置项,第一个为数据库的连接字符串,第二个为映射文件 映射文件的引入有两种方式
- 第一种方式,直接定义到resource路径下的某一个文件
- 第二种方式,以包为单位,将包下所有的映射文件引入核心配置文件
<?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="text">
<environment id="text">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.2:3306/mybatis?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.zhou.springbootmybatis01.mapper"/>
</mappers>
</configuration>
类型处理器(typeHandlers)
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。
创建一个实体
路径com.zhou.springbootmybatis01.entity.UserEntitty.java 这个实体对应数据库表的字段和类型,与数据库字段类型的对应关系见上一段类型处理器(typeHandlers)
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
private Integer id;
private String name;
private String password;
private String age;
private String email;
private Date createTime;
private Date updateTime;
private Integer version;
private Integer deleted;
}
创建一个mapper接口
路径com.zhou.springbootmybatis01.mapper.UserMapper.java 这个mapper接口不需要实现,配置好后直接与映射文件对应
package com.zhou.springbootmybatis01.mapper;
import com.zhou.springbootmybatis01.entity.UserEntity;
import java.util.List;
public interface UserMapper {
int insertUser();
int deleteUser(int id);
int updateUser(int id);
UserEntity selectUserById(int id);
List selectUserListById();
}
编写映射文件
路径src/main/resources/com/zhou/springbootmybatis01/mapper/UserMapper.xml
- MyBatis中可以面向接口操作数据,所以,不管是insert、delete、update、select后面的id必须=UserMapper接口中的对应接口名称,如果不进行对应,在调用接口的时候会报错
- 下面第五行的namespace,必须是Mapper接口的对应路径
- select的时候必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系
- resultType:自动映射,用于属性名和表中字段名一致的情况
- resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
- mybatis接收传值方式有两种: #{}和${}
- #{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。具体实现见下面的deleteUser
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号。具体实现见下面的updateUser
<?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.zhou.springbootmybatis01.mapper.UserMapper">
<insert id="insertUser">
insert into user(name,age) values('张三','12')
</insert>
<delete id="deleteUser">
delete from user where id = #{id}
</delete>
<update id="updateUser">
update user set name = '李四' where id = '${id}'
</update>
<select id="selectUserById" resultType="com.zhou.springbootmybatis01.entity.UserEntity">
select * from user where id = #{id}
</select>
<select id="selectUserListById" resultType="com.zhou.springbootmybatis01.entity.UserEntity">
select * from user
</select>
</mapper>
测试
@Test
void contextLoads() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserEntity userEntity = userMapper.selectUserById(2);
List userList= userMapper.selectUserListById();
System.out.println("result:" + 1);
}
自定义映射resultMap
- id:表示自定义映射的唯一标识,不能重复
- 子标签:
- id:设置主键的映射关系
- result:设置普通字段的映射关系
- 子标签属性:
- property:设置映射关系中实体类中的属性名
- 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射,也就是全部属性都要列出来
将下面这一段放到src/main/resources/com/zhou/springbootmybatis01/mapper/UserMapper.xml中
<resultMap id="resultUser" type="com.zhou.springbootmybatis01.entity.UserEntity">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="createTime" column="create_time"></result>
</resultMap>
<select id="selectResultUser" resultMap="resultUser">
select * from user
</select>
将下面一段插入com.zhou.springbootmybatis01.mapper.UserMapper.java
List selectResultUser();
将下面这一段放到 @Test void contextLoads() throws IOException {} 进行测试
List resultUser=userMapper.selectResultUser();
|