导读:
在上篇文章中我们介绍了spring-data-jpa的一些常用方法,在这篇文章中我们在介绍关于mybatis与Spring Boot 的集成,及一些常用方法
集成:
这里有两种方式,一种是常规的Spring 应用的集成方式,一种就是Spring Boot 的应用的集成方式,本篇文章所使用的方式为第二种:(想了解第一种的同学可以点击我)
1.添加pom依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
2.两种集成方式
a.通过注解:
1).包扫描:
@SpringBootApplication
@MapperScan("cn.sunxyz.mapper")
public class SpringBootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisApplication.class, args);
}
}
2).注解声明:
@Mapper
public interface UserMapper {
}
二者任选其一即可,建议使用包扫描的方式。
b.通过配置文件
1).通过yml配置
spring:
datasource:
##导入指定的sql
schema: import.sql
url: jdbc:mysql://localhost:3306/spring-boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
platform: mysql
#使用 yml的方式
mybatis:
type-aliases-package: cn.sunxyz.domain
mapper-locations: ['mapper/UserMapper.xml']
属性mybatis.xml的同学也可以通过xml配置
2).通过xml配置
<1>.先配置yml文件
#使用 xml的方式
mybatis:
config-location: mybatis-config.xml
<2>.再配置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>
<typeAliases>
<package name="cn.sunxyz.domain"/>
</typeAliases>
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
<!--<package name="cn.sunxyz.mapper"/>-->
</mappers>
</configuration>
注意:b.1,b.2中 XXXMapper对象需要添加@Mapper托管给Spring Boot方能正常使用。
建议:a与b任选其一,建议使用a.通过注解 的方式使用,当然如果习惯xml配置的方式也可以使用xml。
使用:
两种sql查询的方式:
(也许称为三种会更好些)
实体类对象
public class User {
private Integer id;
private String name;
private String password;
/**省略set/get**/
}
a.注解
1).普通查询(简单查询):
@Mapper
public interface UserMapper {
// 获取主键
@Insert("INSERT INTO user(name,password) VALUES (#{name}, #{password}) ")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Delete("DELETE FROM user WHERE id = #{id}")
int delete(@Param("id") Integer id);
@Update("UPDATE user SET name = #{name}, password = #{password} WHERE id = #{id}")
int update(User user);
@Select("SELECT id, name, password FROM user WHERE id = #{id}")
@Results(id = "userMap", value = { @Result(column = "id", property = "id", javaType = Integer.class),
@Result(column = "name", property = "name", javaType = String.class),
@Result(column = "password", property = "password", javaType = String.class) })
User findById(Integer id);
@Select("SELECT * FROM user")
@ResultMap("userMap")
List<User> fingAll();
}
2).复杂查询(动态sql):
mappper对象:
@Mapper
public interface UserMapper {
// 动态生成sql
@SelectProvider(type = UserMapperProvider.class, method = "findByNameLike")
List<User> findByNameLike(String name);
//多参使用map
@SelectProvider(type = UserMapperProvider.class, method = "findByNameAndPassword")
List<User> findByNameAndPassword(String name, String password);
@InsertProvider(type = UserMapperProvider.class, method = "insert")
int insertUser(User user);
@DeleteProvider(type = UserMapperProvider.class, method = "delete")
int deleteUser(Integer id);
}
mappperProvider对象:
public class UserMapperProvider {
// 动态生成sql
public String findByName(String name) {
String sql = "SELECT * FROM user";
if (StringUtils.isEmpty(name)) {
return sql;
}
sql += " WHERE name LIKE '%" + name + "%'";
return sql;
}
// 使用工具类来准备相同的 SQL 语句
public String findByNameLike(String name) {
return new SQL() {
{
SELECT("id, name, password");
FROM("user");
WHERE("name LIKE '%" + name + "%'");
}
}.toString();
}
public String findByNameAndPassword(Map<String, Object> map) {
String name = (String) map.get("param1");
String password = (String) map.get("param2");
return new SQL() {
{
SELECT("id, name, password");
FROM("user");
WHERE("name = " + name);
AND();
WHERE("password = " + password);
}
}.toString();
}
public String update(User user) {
return new SQL() {
{
if (!StringUtils.isEmpty(user.getId())) {
UPDATE("user");
if (!StringUtils.isEmpty(user.getName())) {
SET("name = #{name}");
}
if (user.getPassword() != null) {
SET("password = #{password}");
}
WHERE("id = #{id}");
}
}
}.toString();
}
public String insert(User user) {
return new SQL() {
{
INSERT_INTO("user");
VALUES("name", "#{name}");
VALUES("password", "#{password}");
}
}.toString();
}
public String delete(Integer id) {
return new SQL() {
{
DELETE_FROM("user");
WHERE("id = #{id}");
}
}.toString();
}
}
b).xml的方式:
3.xml配置方式:
mapper对象:
@Mapper
public interface UserMapper {
int insertUserXml(User user);
}
mapper.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">
<!-- 指定工作空间,要与接口名相同,源代码没有去看,猜测应该是通过"这里的namespace.下边方法的id"来定位方法的 -->
<mapper namespace="cn.sunxyz.mapper.UserMapper">
<!-- 若不需要自动返回主键,将useGeneratedKeys="true" keyProperty="id"去掉即可(当然如果不需要自动返回主键,直接用注解即可) -->
<insert id="insertUserXml" parameterType="User" keyProperty="id" useGeneratedKeys="true">
<![CDATA[
INSERT INTO USER
(
name,
password
)
VALUES
(
#{name, jdbcType=VARCHAR},
#{password, jdbcType=VARCHAR}
)
]]>
</insert>
</mapper>
混合:
4).注解/xml 混合
这两种方式可以配合使用比如:
@Mapper
public interface UserMapper {
int insertUserXml(User user);
@Delete("DELETE FROM user WHERE id = #{id}")
int delete(@Param("id") Integer id);
}
省略mapper.xml文件
建议: 一般情况下不建议用混合,如果有简单的查询和复杂的查询,建议1).普通查询(简单查询) 与 3.xml配置方式 进行混合查询
分页:
使用PageHelper:
添加pom依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
添加配置:
@Configuration
public class MyBatisConfiguration {
@Bean
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
p.setProperty("reasonable", "true");
pageHelper.setProperties(p);
return pageHelper;
}
}
使用:
public void contextLoads() {
PageHelper.startPage(1,2);//无法与 注解生成动态sql同步使用
List<User> users = userMapper.fingAll();
// List<User> users = userMapper.findByNameLike("user");
logger.info(users.toString());
}
坑: 在使用2).复杂查询(动态sql) 进行查询时会出现异常,如果你正打算使用PageHelper一定要多加留意。
结语:
拖了好久终于又开动了,这篇文章中还有许多内容没有讲到,MyBatis中还有很多东西与细节需要留意,如果在开发中不会有太多的负责查询建议使用Spring Data JPA 。
参考资料:
Spring Boot整合MyBatis
第五章 springboot + mybatis
SpringBoot集成mybatis 推荐里面有一些关于MyBatis内容的扩展
Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
学习资料:
官方文档
MyBatis入门学习教程(推荐)
Mybatis操作MySql数据库
mybaits学习文档(推荐参考后面的注解文档)
彩蛋
之前写的一个例子 spring-boot-mybatis
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。