6、Spring Boot 2.x 集成 MyBatis
2024-09-05 04:22:17
1.6 Spring Boot 2.x 集成 MyBatis
简介
- 详细介绍如何在Spring Boot中整合MyBatis,并通过注解方式实现映射。
- 完整源码:
1.6.1 创建 spring-boot-mybatis 项目
- pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hw</groupId>
<artifactId>spring-boot-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-mybatis</name>
<description>Demo project for Spring Boot MyBatis</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里不引入spring-boot-starter-jdbc依赖,是由于mybatis-spring-boot-starter中已经包含了此依赖
- application.yml 配置数据库连接
spring:
datasource:
username: root
url: jdbc:mysql://localhost:3306/test
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
- 创建user表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
1.6.2 使用MyBatis注解方式
因为最初设计时,MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。而到了 MyBatis 3,就有新选择了。MyBatis 3 构建在全面且强大的基于 Java 语言的配置 API 之上。这个配置 API 是基于 XML 的 MyBatis 配置的基础,也是新的基于注解配置的基础。注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。
1.6.2.1 User实体类
package com.hw.springbootmybatis.entity;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/19 1:10
* @Version 1.0
*/
public class User {
private Long id;
private String name;
private Integer age;
// get set 方法
}
1.6.2.2 创建User映射的操作UserMapper
package com.hw.springbootmybatis.mapper;
import com.hw.springbootmybatis.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/19 1:14
* @Version 1.0
*/
@Mapper
public interface UserMapper {
@Select("SELECT * FROM USER WHERE NAME = #{name}")
User findByName(@Param("name") String name);
@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);
}
1.6.2.3 创建单元测试
package com.hw.springbootmybatis;
import com.hw.springbootmybatis.entity.User;
import com.hw.springbootmybatis.mapper.UserMapper;
import org.junit.Assert;
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.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootMybatisApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void contextLoads() {
}
@Test
@Rollback
public void findByName() throws Exception {
userMapper.insert("AAA", 20);
User u = userMapper.findByName("AAA");
Assert.assertEquals(20, u.getAge().intValue());
}
}
1.6.2.4 源码地址
不幸的是,Java 注解的的表达力和灵活性十分有限。尽管很多时间都花在调查、设计和试验上,最强大的 MyBatis 映射并不能用注解来构建——并不是在开玩笑,的确是这样。比方说,C#属性就没有这些限制,因此 MyBatis.NET 将会比 XML 有更丰富的选择。也就是说,基于 Java 注解的配置离不开它的特性。
1.6.3 使用MyBatis XML方式
1.6.3.1 yml文件:
spring:
datasource:
username: root
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=GMT%2B8
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.hw.springbootmybatisxml.entity
1.6.3.2 创建配置文件mybatis-config.xml
在resource目录下创建config目录并创建mybatis-config.xml文件
<?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="callSettersOnNulls" value="true"/>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<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>
1.6.3.3 在resource创建 mapper/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.hw.springbootmybatisxml.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.hw.springbootmybatisxml.entity.User">
<id column="id" property="id" jdbcType="NUMERIC"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="NUMERIC"/>
</resultMap>
<sql id="Base_Column_List">
id, name, age
</sql>
<select id="findByName" parameterType="java.lang.String" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM user
WHERE name = #{name}
</select>
<!--如果涉及多个类型那就必须去掉parameterType;
第二个是#{id}...及后面的参数写法也是错误的,
因为在MyBatis3中不会识别这样的参数,所以应该改成#{arg0},{arg1}这样的形式。-->
<insert id="insert">
INSERT INTO
user
(name,age)
VALUES
(#{arg0}, #{arg1})
</insert>
</mapper>
1.6.3.4 User实体类
package com.hw.springbootmybatisxml.entity;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/19 1:10
* @Version 1.0
*/
public class User {
private Long id;
private String name;
private Integer age;
// get set 方法
}
1.6.3.5 创建User映射的操作UserMapper
package com.hw.springbootmybatisxml.mapper;
import com.hw.springbootmybatisxml.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/19 1:36
* @Version 1.0
*/
@Mapper
public interface UserMapper {
User findByName(String name);
void insert(String name,int age);
}
1.6.3.6 创建测试类
package com.hw.springbootmybatisxml;
import com.hw.springbootmybatisxml.entity.User;
import com.hw.springbootmybatisxml.mapper.UserMapper;
import org.junit.Assert;
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.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootMybatisXmlApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void contextLoads() {
}
@Test
@Rollback
public void findByName() throws Exception {
userMapper.insert("ccc", 20);
User u = userMapper.findByName("ccc");
Assert.assertEquals(20, u.getAge().intValue());
}
}
1.6.3.7 源码
最新文章
- C++学习笔记(3)
- flash 定义二维数组
- ToolkitScriptManager, ScriptManager AjaxControlToolkit 出错
- nyoj 252 01串 动态规划( java)
- PHP 常量
- 如何配置CentOS或者RedHat5.X、6.X、7.X的网络yum源
- C++C++中构造函数与析构函数的调用顺序
- 在Tomcat里使用配置连接池连接数据库
- HTML DOM简介
- dede 单表模型动态浏览设置 arclistsg arc.sglistview.class.php
- 解决CSDN的code功能,无法git clone多个项目的问题
- forward_list例子
- Codeforces 616E - Sum of Remainders
- dump iot表
- Unable to locate package错误解决办法
- HDOJ 5147 Sequence II 树阵
- 使用Mapper专用的MyBatis Generator插件
- 【转】解决Android 6.0 NoSuchContextException 和WEBVIEW_undefined 的问题
- Python logging系统
- xxx.jar或者xxx.war中没有主清单属性和spring-boot-maven-plugin的作用
热门文章
- PHP之即点即改
- 初始STM32
- 2019版UI学习路线(含大纲+视频+工具+网盘+面试题)
- 写文章 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!
- (十)SpringBoot之web 应用开发-Servlets, Filters, listeners
- cli create ssl certkey
- POJ2729 Robocode(离散化与模拟-----提醒曾经爱玩游戏的自己没做出这个
- 关于el-select 单选与多选切换的时候报错的解决办法
- selenium实现登录百度(自动识别简单验证码)
- [基础累积] C#计算时间差