SpringBoot tk-MyBatis 整合
# tk-MyBatis 整合
由于MyBatis的使用会出现一些功能上的问题,和大量的xml文件。当库表结构进行改动,则实体和xml文件都需要重新更改。因此为了避免以上情况 ,应用 tk-MyBatis框架
使用前注意事项:
- tk-MyBatis依赖引入 后就无需再引入MyBatis依赖
- 支持 驼峰、下划线 命名方式,需要手动纠正
- 实体类中 主键一定要映射
@GeneratedValue
注解 映射主键策略(该字段自增、...等其他索引约束) - 类与表不匹配的情况,使用 jpa注解 纠正(名相同无需添加注解)
- 类名 ≠ 表名 ,在类上添加
@Table
注解 name参数为 纠正的表名 - 属性名 ≠ 字段名,在属性上添加
@Column
注解 name参数为 纠正的字段名
- 类名 ≠ 表名 ,在类上添加
- 如果 前面有导入 MyBatis构件的类 ,需要更改为 tk-mybatis构件的类
- 接口一旦继承了
tk.mybatis.mapper.common.Mapper
接口 就可实现以下Mapper通用方法
Mapper通用方法
返回 | 方法 | 说明 |
---|---|---|
List<T> | select(T record) | 查询 根据实体类属性值进行查询 |
T | selectByPrimaryKey(Object key) | 查询 根据主键进行查询 |
List<T> | selectAll() | 查询 所有结果 |
T | selectOne(T record) | 查询 根据实体类属性值进行查询,只能返回一个,多个则异常 |
int | selectCount(T record) | 查询 表中的总条数 |
int | insert(T record) | 插入 一个实体类 ,null属性值也会保存,而不是库中的默认值 |
int | insertSelective(T record) | 插入 一个实体类 ,null属性值不会保存,而应用库中的默认值 |
int | updateByPrimaryKey(T record) | 更新 根据主键更新所有字段,null属性值也会被更新 |
int | updateByPrimaryKeySelective(T record) | 更新 根据主键更新字段,null属性值不会被更新 |
int | delete(T record) | 删除 根据实体类属性值进行条件删除 |
int | deleteByPrimaryKey(Object key) | 删除 根据主键进行删除 |
List<T> | selectByExample(Object example) | 查询 根据Example条件进行查询 |
int | selectByExample(Object example) | 查询 根据Example条件进行查询总条数 |
int | updateByExample(@Param("record") T record, @Param("example") Object example) | 更新 根据Example条件进行更新为 record实体类 全部属性,null属性值也会被更新 |
int | updateByExampleSelective(@Param("record") T record, @Param("example") Object example) | 更新 根据Example条件进行更新为 record实体类 全部属性,null属性值不会被更新 |
int | deleteByExample(Object example) | 删除 根据Example条件进行删除 |
# 应用实现
以下应用实例:
数据库展示
tb_user
表 (其他数据自行引入)
字段名 | 类型 | 主键 |
---|---|---|
id | bigint | T |
user_name | varchar | F |
password | varchar | F |
name | varchar | F |
age | int | F |
sex | int | F |
birthday | date | F |
引入依赖
pom.xml
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.2</version> </dependency>
创建 User实体类 (指定库中的表列属性信息)
package com.pojo; import javax.persistence.*; import java.io.Serializable; import java.util.Date; @Table(name = "tb_user") public class User implements Serializable { //主键 ,主键策略为 自增 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 用户名 @Column(name = "user_name") private String userName; // 密码 private String password; // 姓名 private String name; // 年龄 private Integer age; // 性别,1男性,2女性 private Integer sex; // 出生日期 private Date birthday; //省略 get 、 set 和 toString }
创建
UserMapping
接口 ,全限定名 com.mapping.UserMapping (继承接口即可实现Mapper通用方法)package com.mapping; import com.domain.User; import tk.mybatis.mapper.common.Mapper; public interface UserMapping extends Mapper<User> { }
不要忘记应用的是 tk.mybatis.mapper.common.Mapper接口 构件
使用 @MapperScan注解 扫描的包 在
@SpringBootApplication
注解下的启动类,添加@MapperScan注解 value参数为 扫描的包路径package com; // import org.mybatis.spring.annotation.MapperScan; import tk.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 启动类 @SpringBootApplication @MapperScan("com.mapping") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class , args); } }
不要忘记应用的是 tk.mybatis.mapper.common.Mapper接口 构件
测试
package com.mapping; import com.domain.User; import junit.framework.TestCase; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import tk.mybatis.mapper.entity.Example; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class UserMappingTest extends TestCase { @Autowired private UserMapping userMapping; //查所有 @Test public void testFindAll() { userMapping.selectAll().forEach(user -> { System.out.println(user); }); } //查id @Test public void testFindById() { User user = userMapping.selectByPrimaryKey(5); System.out.println("user : " + user); } //插入 @Test public void testInsert(){ User user = new User(); user.setUserName("lishi"); user.setName("李四"); user.setPassword("1"); user.setAge(21); user.setSex(1); int i = userMapping.insertSelective(user); System.out.println("插入结果 : " + i); } // Example条件查询 @Test public void testFindByExample() { Example example = new Example(User.class); // 展示1 // SQL:SELECT * FROM tb_user WHERE ( name like '%张%' ) example.createCriteria().andLike("name","%张%"); // 展示2 // SQL:SELECT * FROM tb_user WHERE ( name like '%张%' and password = '1' ) // example.createCriteria().andLike("name","%张%").andEqualTo("password","1"); userMapping.selectByExample(example).forEach(user -> { System.out.println(user); }); } }
# 自定义映射文件查询
自定义映射文件用于进行复杂的SQL语句进行对库编辑
应用前说明:
- 应用后 驼峰、下划线 命名失效
应用实现 在以上代码原有的基础上进行编辑!
在SpringBoot的 全局属性(application.properties文件) 添加参数
# mybatis 别名扫描 mybatis.type-aliases-package=com.pojo # mapper.xml文件位置 (使用在有映射的前提) mybatis.mapper-locations=classpath:mappers/*.xml
创建
UserMapper.xml
文件 资源路径 resources/mappers/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.mapping.UserMapping"> <select id="findByUser" resultType="user"> SELECT * FROM tb_user <where> <if test="name != null"> name like '%${name}%' </if> <if test="password != null"> and password like '%${password}%' </if> </where> </select> </mapper>
注意 mapper节点 映射指定的接口路径
编辑
UserMapping
接口 ,全限定名 com.mapping.UserMappingpackage com.mapping; import com.domain.User; import tk.mybatis.mapper.common.Mapper; import java.util.List; public interface UserMapping extends Mapper<User> { // 自定义复杂sql方法 public List<User> findByUser(User user); }
测试, 在 UserMappingTest测试类 中
// 自定义方法 @Test public void testfindByUser() { User user = new User(); user.setName("张"); // user.setPassword("1");g userMapping.findByUser(user).forEach(u -> { System.out.println(u); }); }