在上篇文章中咱们介绍了spring-data-jpa的一些经常使用方法,在这篇文章中咱们在介绍关于mybatis与Spring Boot 的集成,及一些经常使用方法html
这里有两种方式,一种是常规的Spring 应用的集成方式,一种就是Spring Boot 的应用的集成方式,本篇文章所使用的方式为第二种:(想了解第一种的同窗能够点击我)java
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency>
1).包扫描:mysql
@SpringBootApplication @MapperScan("cn.sunxyz.mapper") public class SpringBootMybatisApplication { public static void main(String[] args) { SpringApplication.run(SpringBootMybatisApplication.class, args); } }
2).注解声明:linux
@Mapper public interface UserMapper { }
两者任选其一便可,建议使用包扫描的方式。git
1).经过yml配置github
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文件spring
#使用 xml的方式 mybatis: config-location: mybatis-config.xml
<2>.再配置mybatis-config.xmlsql
<?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。数据库
(也许称为三种会更好些)
实体类对象segmentfault
public class User { private Integer id; private String name; private String password; /**省略set/get**/ }
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(); } }
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配置方式 进行混合查询
添加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