Spring Boot [集成-MyBatis]

導讀:

在上篇文章中咱們介紹了spring-data-jpa的一些經常使用方法,在這篇文章中咱們在介紹關於mybatis與Spring Boot 的集成,及一些經常使用方法html

集成:

這裏有兩種方式,一種是常規的Spring 應用的集成方式,一種就是Spring Boot 的應用的集成方式,本篇文章所使用的方式爲第二種:(想了解第一種的同窗能夠點擊我java

1.添加pom依賴:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.2.0</version>
</dependency>

2.兩種集成方式

a.經過註解:

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

b.經過配置文件

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。數據庫

使用:

兩種sql查詢的方式:

(也許稱爲三種會更好些)
實體類對象segmentfault

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

相關文章
相關標籤/搜索