在之前的 Spring学习之旅(十二)--持久化框架 中我们介绍了 JPA 的使用,今天我们就来了解下另一种持久化框架 Mybatis

一、集成 Mybatis

1.1 准备工作

新建用户表

CREATE TABLE `sys_user` (
`user_id` bigint(21) NOT NULL COMMENT '用户编码',
`user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
`age` int(3) DEFAULT NULL COMMENT '年龄',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

添加依赖

<dependencies>
......
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>

新建实体类:

@Data
public class SysUser {
private Long userId;
private String userName;
private int age;
private String email;
}

1.2注解形式

@Mapper
public interface SysUserAnnotationMapper { @Insert("INSERT INTO sys_user VALUES(#{userId},#{userName},#{age},#{email})")
int add(SysUser sysUser); @Select("SELECT * FROM sys_user")
@Results({
@Result(property = "userId", column = "user_id", javaType = Long.class),
@Result(property = "userName", column = "user_name"),
@Result(property = "age", column = "age"),
@Result(property = "email", column = "email")
}) List<SysUser> getAll();
}

新建测试类:

@SpringBootTest
public class AnnotationMapperTest { @Autowired
private SysUserAnnotationMapper userMapper; // JUnit5 开始 @Before 和@After被 @BeforeEach 和 @AfterEach给替代
@BeforeEach
public void setUp() {
testDelete();
} @Test
public void test() {
testAdd();
testGetList();
} private void testDelete() {
userMapper.delete();
List<SysUser> result = userMapper.getAll();
Assert.assertTrue(result.size() == 0);
} private void testAdd() {
SysUser user = getOneUser();
int result = userMapper.add(user);
Assert.assertEquals(1, result);
} private void testGetList() {
SysUser user = getOneUser();
List<SysUser> userList = userMapper.getAll();
Assert.assertTrue(userList.size() > 0);
Assert.assertEquals(user, userList.get(0));
} private SysUser getOneUser() {
SysUser user = new SysUser();
user.setUserId(new Long("1572228567336"));
user.setUserName("MarkLogZhu");
user.setAge(26);
user.setEmail("marklogzhu@163.com");
return user;
}
}

1.3 传统 XML 形式

application.yml 文件中指定 XML 和配置文件文件位置

mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis//mapper/*.xml

resources/mybatis 目录下新建配置文件

<?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>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer"/>
<typeAlias alias="Long" type="java.lang.Long"/>
<typeAlias alias="HashMap" type="java.util.HashMap"/>
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
<typeAlias alias="ArrayList" type="java.util.ArrayList"/>
<typeAlias alias="LinkedList" type="java.util.LinkedList"/>
</typeAliases>
</configuration>

resources/mybatis/mapper 目录下新建 SysUserXmlMapper.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.learm.springboot.dao.SysUserXmlMapper">
<resultMap id="BaseResultMap" type="com.learm.springboot.domain.entity.SysUser">
<id column="user_id" property="userId" jdbcType="BIGINT"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
</resultMap> <select id="getAll" resultMap="BaseResultMap">
SELECT * FROM sys_user
</select> <insert id="add" parameterType="com.learm.springboot.domain.entity.SysUser">
INSERT INTO sys_user
VALUES(#{userId},#{userName},#{age},#{email})
</insert> <delete id="delete">
DELETE FROM sys_user
</delete> </mapper>

新建 SysUserXmlMapper.java 文件

@Mapper
public interface SysUserXmlMapper {
int add(SysUser sysUser); List<SysUser> getAll(); int delete();
}

新建测试类:

@SpringBootTest
public class XmlMapperTest {
@Autowired
private SysUserXmlMapper userMapper; // JUnit5 开始 @Before 和@After被 @BeforeEach 和 @AfterEach给替代
@BeforeEach
public void setUp() {
testDelete();
} @Test
public void test() {
testAdd();
testGetList();
} private void testDelete() {
userMapper.delete();
List<SysUser> result = userMapper.getAll();
Assert.assertTrue(result.size() == 0);
} private void testAdd() {
SysUser user = getOneUser();
int result = userMapper.add(user);
Assert.assertEquals(1, result);
} private void testGetList() {
SysUser user = getOneUser();
List<SysUser> userList = userMapper.getAll();
Assert.assertTrue(userList.size() > 0);
Assert.assertEquals(user, userList.get(0));
} private SysUser getOneUser() {
SysUser user = new SysUser();
user.setUserId(new Long("1572228567336"));
user.setUserName("MarkLogZhu");
user.setAge(26);
user.setEmail("marklogzhu@163.com");
return user;
}
}

1.4 两种方式选择

单表操作可以直接使用注解形式,多表操作采用 XML 形式。

二、通用 Mapper

2.1 为什么使用通用 Mapper

原生的 mybatis 就算最基本的单表 CRUD 也需要我们先手工生成大量的文件,如 pojo 类 、 mapper文件以及dao类 。Mybati 为了方便我们特地提供了 mybatis generator 工具来自动生成这些文件,而 通用 Mapper 是对mybatis generator 升级改造,解决了使用 mybatis-generator 可能需要大量重构的问题,并且在这个基础上加入了一些新的功能。 另一种改造方向的技术是 Mybatis-Plus, 它不仅能够根据数据库表快速生成 pojo 实体类,还封装了大量 CRUD 方法,使用 Wrapper 解决了复杂条件构造等问题,更是根据开发中常见的问题给出了一系列解决方案。

2.2 集成 通用 Mapper

导入依赖

<dependencies>
......
<!-- 通用 mybatis 依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
</dependencies>

设置扫描注解

@SpringBootApplication
@MapperScan("com.learm.springboot")
public class SpringbootApplication extends SpringBootServletInitializer {
......
}

2.3 通用 Mapper 专用代码生成器

通用 Mapper 支持 Java 代码和插件两种形式生成文件,我们这边采用插件的形式。

1.在 pom.xml 文件中添加插件

<build>
<finalName>SpringBoot</finalName>
<plugins>
...... <!--通用 Mapper 代码生成插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-generator</artifactId>
<version>1.1.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>

2.在 resources/generator 目录下新建 generatorConfig.xml 文件

<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!--配置文件-->
<properties resource="generator/config.properties"/> <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/> <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
<!--增加 lombok 注解-->
<property name="lombok" value="Getter,Setter,ToString"/>
</plugin> <!--数据库连接-->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection> <!--实体-->
<javaModelGenerator targetPackage="${packageName}.domain.entity.${moduleName}"
targetProject="src/main/java"/> <!--mapper.xml 文件-->
<sqlMapGenerator targetPackage="mybatis/mapper/${moduleName}"
targetProject="src/main/resources"/> <!--mapper.Dao-->
<javaClientGenerator targetPackage="${packageName}.dao.${moduleName}"
targetProject="src/main/java"
type="XMLMAPPER"/> <!--要生成的表-->
<table tableName="${tableName}">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>

3.在resources/generator 目录下新建 config.properties 文件

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
jdbc.user=root
jdbc.password=sa000
packageName=com.learm.springboot
moduleName=system
tableName=sys_user

4.执行 Mavne 插件,生成文件

2.3 测试

@SpringBootTest
public class MapperTest { @Autowired
private SysUserMapper sysUserMapper; @Test
public void testAdd() {
SysUser user = new SysUser();
user.setUserId(new Long(new Date().getTime()));
user.setAge(25);
user.setUserName("lulu");
user.setEmail("lulu@163.com");
int result = sysUserMapper.insertSelective(user);
Assert.assertTrue(result > 0);
} @Test
public void testSelectAll() {
List<SysUser> userList = sysUserMapper.selectAll();
Assert.assertNotNull(userList);
Assert.assertTrue(userList.size() > 0);
} }

SpringBoot之持久化框架的更多相关文章

  1. 浅谈Mybatis持久化框架在Spring、SSM、SpringBoot整合的演进及简化过程

    前言 最近开始了SpringBoot相关知识的学习,作为为目前比较流行.用的比较广的Spring框架,是每一个Java学习者及从业者都会接触到一个知识点.作为Spring框架项目,肯定少不了与数据库持 ...

  2. 几种.NET平台数据持久化框架介绍

    原文连接:http://yuxnet.blog.163.com/blog/static/164863495201131532223362/ 在.NET平台下,关于数据持久层框架非常多,本文主要对如下几 ...

  3. 基于apt实现的Android快速持久化框架:AptPreferences

    AptPreferences是基于面向对象设计的快速持久化框架,目的是为了简化SharePreferences的使用,减少代码的编写.可以非常快速地保存基本类型和对象.AptPreferences是基 ...

  4. 持久化框架Hibernate 开发实例(一)

    1 Hibernate简介 Hibernate框架是一个非常流行的持久化框架,其中在web开发中占据了非常重要的地位, Hibernate作为Web应用的底层,实现了对数据库操作的封装.HIberna ...

  5. 【持久化框架】Mybatis与Hibernate的详细对比

        前言 这篇博文我们重点分析一下Mybatis与hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Myba ...

  6. MVC之实体框架(数据持久化框架)EntityFrameWork(EF)

    EF - EntityFrameWork 中文名:实体框架(数据持久化框架) 1.使用EF查询(Linq to EF) 1.1使用标准查询运算符来查询 OumindBlogEntities db = ...

  7. android数据库持久化框架

    android数据库持久化框架

  8. hibernate持久化框架

    Hibernate是一个优秀的持久化框架 瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态 持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态 持久化: ...

  9. android数据库持久化框架, ormlite框架,

    前言 Android中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样 ...

随机推荐

  1. redis源码分析之数据结构--dictionary

    本文不讲hash算法,而主要是分析redis中的dict数据结构的特性--分步rehash. 首先看下数据结构:dict代表数据字典,每个数据字典有两个哈希表dictht,哈希表采用链式存储. typ ...

  2. 阶段3 2.Spring_09.JdbcTemplate的基本使用_4 JdbcTemplate的CRUD操作

    复制demo起名3 保存 update delete selct 有这么多的重载方法 如何去定位 可变参数是JDK1.5版本之后才有的东西 RowMapper 实现RowMapper这个接口.然后实现 ...

  3. ALV程序设计

    ALV 全称SAP LIST VIEW, 是SAP所提供的一个强大的数据报表显示工具. ALV显示格式分为GRID及LIST两种,两者所显示数据一致, GRID模式在每个输出字段提供选择按钮,允许用 ...

  4. 关于js函数闭包的理解

    在开始之前我们先来了解一下函数的变量作用域 JavaScript 变量可以是局部变量或全局变量. 私有变量可以用到闭包. 全局变量 函数可以访问由函数内部定义的变量,如: 实例1 function m ...

  5. <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)

    首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...

  6. MSF魔鬼训练营第一章 初识Metasploit

    1.1.4渗透测试过程环节 PTES标准7个阶段 1.前期交互阶段      收集客户需求.准备测试计划.定义测试范围与边界.定义业务目标.项目管理与规划等 2.情报搜集阶段      公开来源信息查 ...

  7. 第九周课程总结&实验报告

    实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. public c ...

  8. HDU 1087 Super Jumping! Jumping! Jumping! (动态规划、最大上升子序列和)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. mysql的高可用之rounter

    参考: https://segmentfault.com/a/1190000011970688

  10. 迭代器与iterable

    迭代器与iterable 最近在学习ES6,有两个概念一直纠缠不清,就是迭代器与iterable,查阅了一些资料,简单来说迭代器就是包含next方法的对象,而iterable是包含可以在其值上迭代的迭 ...