Spring Boot集成MyBatis及MySQL

Spring Boot集成MyBatis及MySQL


MyBatis的特点

MyBatis是优秀的持久层框架,支持定制化SQL、存储过程和高级映射。

MyBatis两大核心模块分别是ConfigurationExecutor ——
Configuration用于读取mybatis-config.xmlmapper配置文件,根据这些信息创建SqlSessionFactory对象;
Executor用于和SqlSession交互,连接数据库,预编译、执行对应的SQL语句,并将数据库返回的结果集进行封装,返回用户指定的POJO


通过mybatis-spring-boot-starter使用MyBatis

详细代码可见https://github.com/DragonBaby308/Spring-in-Action/tree/master/spring_boot_mybatis

pom.xml导入相关依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!--  引入spring-boot-starter-parent  -->
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- 导入依赖 -->
<dependencies>
<!-- Spring Boot依赖,版本由parent决定 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- MyBatis相关依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- JDBC相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL相关依赖:我是用的MySQL5.5,所以mysql-connector-java选择了5.1.6 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>

<!-- 非必需依赖 -->
<!-- 金额:joda-money -->
<dependency>
<groupId>org.joda</groupId>
<artifactId>joda-money</artifactId>
<version>LATEST</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

创建实体类

1
2
3
4
5
6
7
8
9
10
11
12
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Coffee {
private Long id;
private String name;
//joda-money类型 金额,需要通过TypeHandler进行转换
private Money price;
private Date createdTime;
private Date updatedTime;
}

创建类型处理类

类型处理器TypeHandler需要继承BaseTypeHandler<T>,用于不同类型之间的转换,比如此处就将joda-money的Money类型与Long相互转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//所有TypeHandler都要继承BaseTypeHandler<T>,其中T是你要处理的数据类型
public class MoneyTypeHandler extends BaseTypeHandler<Money> {
// 将Money类型转换为Long类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Money money, JdbcType jdbcType) throws SQLException {
preparedStatement.setLong(i, money.getAmountMinorLong());
}

// 将Long类型转换为Money类型
@Override
public Money getNullableResult(ResultSet resultSet, String s) throws SQLException {
return toMoney(resultSet.getLong(s));
}

@Override
public Money getNullableResult(ResultSet resultSet, int i) throws SQLException {
return toMoney(resultSet.getLong(i));
}

@Override
public Money getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return toMoney(callableStatement.getLong(i));
}

//Long类型转Money类型
private Money toMoney(Long value) {
//生成joda-money
return Money.of(CurrencyUnit.of("CNY"),
value / 100.0);
}
}

application.properties配置MySQL & MyBatis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# MyBatis相关配置:

# Mapper扫描路径(@Mapper接口 or com.bat.mapper.xml文件)
#mybatis.com.bat.mapper-locations=

# 类型别名的包名,将Entity路径配置上
#mybatis.type-aliases-package=

# TypeHandler路径
mybatis.type-handlers-package=com.bat.handler

# 将下划线&驼峰进行映射
mybatis.configuration.map-underscore-to-camel-case=true

# MySQL相关配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis
spring.datasource.username=root
spring.datasource.password=******
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

创建Mapper,进行ORM

MaBatis提供两种创建Mapper、进行ORM的方式,一种是传统的XML文件,另一种则是Java注解。

1.resources目录下创建mappers文件夹,编写mapper.xml

在下一节会介绍MyBatis Generator自动生成mapper.xml,所以这里不赘述。

2.@Mapper接口

创建Mapper接口,使用@Mapper注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//使用@Mapper进行ORM,另一种方式是使用XML
@Mapper
public interface CoffeeMapper {
@Insert("insert into coffee(id,name,price,create_time,update_time)" +
" values(#{id},#{name},#{price},now(),now())")
//自增主键
@Options(useGeneratedKeys = true)
int save(Coffee coffee);

@Select("select * from coffee where id = #{id}")
//返回
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "create_time", property = "createdTime")
})
Coffee findById(Long id);
}

在启动类中通过@MapperScan将Mapper路径导入

1
2
3
4
@SpringBootApplication
//导入MyBatis Mapper
@MapperScan("com.bat.mapper")
public class MyBatisDemoApplication implements ApplicationRunner {...}

运行结果如下:

1
2
3
2019-08-04 10:33:08.074  INFO 11164 --- [           main] com.bat.MyBatisDemoApplication           : Save 1 Coffee: Coffee(id=1, name=espresso, price=CNY 20.00, createdTime=null, updatedTime=null)
2019-08-04 10:33:08.078 INFO 11164 --- [ main] com.bat.MyBatisDemoApplication : Save 1 Coffee: Coffee(id=2, name=latte, price=CNY 25.00, createdTime=null, updatedTime=null)
2019-08-04 10:33:08.089 INFO 11164 --- [ main] com.bat.MyBatisDemoApplication : Find Coffee: Coffee(id=2, name=latte, price=CNY 25.00, createdTime=Sun Aug 04 10:33:08 CST 2019, updatedTime=null)

可以看到Coffee表中插入了两条数据:
Coffee中插入了两条数据

-------------本文结束感谢您的阅读-------------

本文标题:Spring Boot集成MyBatis及MySQL

文章作者:DragonBaby308

发布时间:2019年08月02日 - 21:21

最后更新:2019年11月25日 - 21:30

原始链接:http://www.dragonbaby308.com/mybatis-spring-boot/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%