文章目录
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>
<!-- 第一种方式,直接定义到resource路径下的某一个文件
<mapper resource="com.zhou.springbootmybatis01.mapper/UserMapper.xml"/> -->
<!--
第二种方式,以包为单位,将包下所有的映射文件引入核心配置文件
注意:
1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下
2. mapper接口要和mapper映射文件的名字一致
-->
<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;
/**
* @author DELL
* @version 1.0
* @Description
* @date 2022/5/9 15:39
*/
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>
<!-- #{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号-->
<delete id="deleteUser">
delete from user where id = #{id}
</delete>
<!-- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号,如下-->
<update id="updateUser">
update user set name = '李四' where id = '${id}'
</update>
<!--createTime与数据库create_time不对应,所以会查不出来-->
<select id="selectUserById" resultType="com.zhou.springbootmybatis01.entity.UserEntity">
select * from user where id = #{id}
</select>
<!--createTime与数据库create_time不对应,所以会查不出来-->
<select id="selectUserListById" resultType="com.zhou.springbootmybatis01.entity.UserEntity">
select * from user
</select>
</mapper>
测试
@Test
void contextLoads() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过代理模式创建UserMapper接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
//int result = userMapper.insertUser();
//int result = userMapper.deleteUser(1);
//int result = userMapper.updateUser(2);
UserEntity userEntity = userMapper.selectUserById(2);
List userList= userMapper.selectUserListById();
//提交事务
//sqlSession.commit();
System.out.println("result:" + 1);
}
自定义映射resultMap
- id:表示自定义映射的唯一标识,不能重复
- type:查询的数据要映射的实体类的类型
- 子标签:
- id:设置主键的映射关系
- result:设置普通字段的映射关系
- 子标签属性:
- property:设置映射关系中实体类中的属性名
- column:设置映射关系中表中的字段名
- 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射,也就是全部属性都要列出来
将下面这一段放到src/main/resources/com/zhou/springbootmybatis01/mapper/UserMapper.xml中
<!--
1.id必须唯一
2.result property="实体名" column="数据库名"
-->
<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>
<!--将create_time转换成createTime,所以会查出来-->
<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();