天天看點

SpringBoot 架構整合 (二) : MyBatis + Mapper + mybatis-generatorMapper介紹整合Mybatis-mybatis-generator自動生成代碼測試執行個體項目下載下傳

[TOC]

本文執行個體需要用Spring Tool Suite建立基本spring boot項目,具體步驟請移步到:

SpringBoot 實戰 (一) :如何建立SpringBoot項目 –入門篇

Mapper介紹

前言

使用MyBatis在我們通過xml集中配置SQL,并通過建立接口Mapper檔案來完成持久化DAO層(mybatis内部使用的是動态代理,是以我們不需要自己編寫實作類 ),不需要實作dao的實作層,系統會自動根據方法名在映射檔案中找對應的sql。。

然而在實際開發中,單表操作非常多,如果你也想像JPA、JDBC那樣做一個所謂的BaseDao。那麼可以實作一個通用Mapper來達到目的。現在有現成的通用Mapper插件,我們無需重新創造輪子(代碼是開源的,你也可以自己在其基礎上修改)。

使用通用Mapper插件

插件代碼在tk.mybatis.mapper.generator包下面,一共有如下兩個類:

MapperCommentGenerator:該類用于生成資料庫備注字段的注釋,以及實體類字段的注解。

MapperPlugin:插件的實作類,該類預設使用上面這個注釋生成器,插件屏蔽了一般的CRUD方法(保留了Example),插件可以生成實體的@Table注解。

在Maven中配置(pom.xml):

<dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>           

Mapper接口

先定義一個公用的接口類MyMapper.java:

package com.ailianshuo.mybatisxml.utility;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
 * 
 * @author ailianshuo
 * @date 2017年9月2日
 * @param <T>
 */
public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {

}
           

項目裡所有實體接口都實作公共接口。例如:

public interface UserMapper extends MyMapper<User> {
}           

一旦繼承了Mapper,繼承的Mapper就擁有了以下通用的方法:

//根據實體類不為null的字段進行查詢,條件全部使用=号and條件

List select(T record);

//根據實體類不為null的字段查詢總數,條件全部使用=号and條件

int selectCount(T record);

//根據主鍵進行查詢,必須保證結果唯一

//單個字段做主鍵時,可以直接寫主鍵的值

//聯合主鍵時,key可以是實體類,也可以是Map

T selectByPrimaryKey(Object key);

//插入一條資料

//支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)

//優先使用傳入的參數值,參數值空時,才會使用序列、UUID,自動增長

int insert(T record);

//插入一條資料,隻插入不為null的字段,不會影響有預設值的字段

//支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動> 回寫)

//優先使用傳入的參數值,參數值空時,才會使用序列、UUID,自動增長

int insertSelective(T record);

//根據實體類中字段不為null的條件進行删除,條件全部使用=号and條件

int delete(T key);

//通過主鍵進行删除,這裡最多隻會删除一條資料

//單個字段做主鍵時,可以直接寫主鍵的值

//聯合主鍵時,key可以是實體類,也可以是Map

int deleteByPrimaryKey(Object key);

//根據主鍵進行更新,這裡最多隻會更新一條資料

//參數為實體類

int updateByPrimaryKey(T record);

//根據主鍵進行更新

//隻會更新不是null的資料

int updateByPrimaryKeySelective(T record);

接口定義有以下特點:

Mapper 接口方法名和 **Mapper.xml 中定義的每個 sql 的 id 同名。

Mapper 接口方法的輸入參數類型和 **Mapper.xml 中定義的 sql 的parameterType 類型相同。

Mapper 接口的傳回類型和 **Mapper.xml 中定義的 sql 的 resultType 類型相同

配置application.properties

mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin
mapper.Mapper = tk.mybatis.mapper.common.Mapper
mybatis.type-aliases-package=com.study.model
#分子產品放
mybatis.mapper-locations=classpath:mapper/*/*.xml
mapper.mappers=com.ailianshuo.mybatisxml.utility.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL           

整合Mybatis-

配置

pom.xml

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!--這裡使用mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>           

application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=1111

           

實體類

泛型(實體類)的類型必須符合要求

實體類按照如下規則和資料庫表進行轉換,注解全部是JPA中的注解:

  1. 表名預設使用類名,駝峰轉下劃線,如UserInfo預設對應的表名為user_info.
  2. 表名可以使用@Table(name = “tableName”)進行指定,對不符合第一條預設規則的可以通過這種方式指定表名.
  3. 字段預設和@Column一樣,都會作為表字段,表字段預設為Java對象的Field名字駝峰轉下劃線形式.
  4. 可以使用@Column(name = “fieldName”)指定不符合第3條規則的字段名
  5. 使用@Transient注解可以忽略字段,添加該注解的字段不會作為表字段使用.
  6. 建議一定是有一個@Id注解作為主鍵的字段,可以有多個@Id注解的字段作為聯合主鍵.
  7. 預設情況下,實體類中如果不存在包含@Id注解的字段,所有的字段都會作為主鍵字段進行使用(這種效率極低).
  8. 實體類可以繼承使用,可以參考測試代碼中的com.github.abel533.model.UserLogin2類.
  9. 由于基本類型,如int作為實體類字段時會有預設值0,而且無法消除,是以實體類中建議不要使用基本類型.

這三種方式不能同時使用,同時存在時按照 序列>UUID>主鍵自增的優先級進行選擇.下面是具體配置方法:

  1. 使用序列可以添加如下的注解:
//可以用于數字類型,字元串類型(需資料庫支援自動轉型)的字段
@SequenceGenerator(name="Any",sequenceName="seq_userid")
@Id
private Integer id;           
  1. 使用UUID時:
//可以用于任意字元串類型長度超過32位的字段
@GeneratedValue(generator = "UUID")
private String countryname;           
  1. 使用主鍵自增:
//不限于@Id注解的字段,但是一個實體類中隻能存在一個(繼承關系中也隻能存在一個)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;           

mybatis-generator自動生成代碼

在pom.xml中添加plugin

<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.43</version>
                    </dependency>
                    <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper</artifactId>
                    <version>3.4.0</version>
                    </dependency>
                </dependencies>
            </plugin>
           
其中generatorConfig.xml的位置,大家根據實際情況自行調整
           

generatorConfig.xml配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>   


    <context id="baseset"  targetRuntime="MyBatis3Simple" defaultModelType="flat">

        <!-- 根據Mapper生成實體類,xml檔案 -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="com.ailianshuo.project.utility.MyMapper"/>
        </plugin>

        <!-- 連接配接字元串 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/test"
                            userId="root"
                            password="1111">
            </jdbcConnection>

        <!-- 指定生成“entity實體類、mybatis映射xml檔案、mapper接口”的具體位置 -->   
         <javaModelGenerator targetPackage="com.ailianshuo.mybatisxml.entity.baseset" targetProject="src/main/java" >  
            <property name="enableSubPackages" value="true"/>  
            <property name="trimStrings" value="true"/>  
        </javaModelGenerator>  

        <sqlMapGenerator targetPackage="mapper.baseset" targetProject="src/main/resources" >  
            <property name="enableSubPackages" value="true"/>  
        </sqlMapGenerator>  

        <javaClientGenerator targetPackage="com.ailianshuo.mybatisxml.mapper.baseset" targetProject="src/main/java"   type="XMLMAPPER" >  
            <property name="enableSubPackages" value="true"/>  
        </javaClientGenerator>  


        <!-- 具體要生成的表,如果有多個表,複制這一段,改下表名即可 -->
        <table   tableName="baseset_user"  domainObjectName="BasesetUser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
          <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table> 
  </context>
</generatorConfiguration>
           

運作mybatis-generator

eclipse

如果是在eclipse 中,選擇pom.xml檔案,擊右鍵先擇Run AS——>Maven Build… ——>在Goals框中輸入:mybatis-generator:generate

指令行

如果在指令行輸入Maven指令即可,注意:一定是目前項目目錄(在pom.xml這一級目錄)下運作該指令:

mvn mybatis-generator:generate

即可(前提是配置了mvn)

運作結果:

SpringBoot 架構整合 (二) : MyBatis + Mapper + mybatis-generatorMapper介紹整合Mybatis-mybatis-generator自動生成代碼測試執行個體項目下載下傳
SpringBoot 架構整合 (二) : MyBatis + Mapper + mybatis-generatorMapper介紹整合Mybatis-mybatis-generator自動生成代碼測試執行個體項目下載下傳

測試

添加mapperscan

在SpringbootMybatisxmlApplication.java (Application.java):

package com.ailianshuo.mybatisxml;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.ailianshuo.mybatisxml.mapper")
public class SpringbootMybatisxmlApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisxmlApplication.class, args);
    }
}
           

或者在Mapper接口中上面加@Mapper

這樣才可以使用注解的方式調用

建立測試類

BasesetUserTest.java

package com.ailianshuo.mybatisxml.test;

import java.util.List;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.ailianshuo.mybatisxml.SpringbootMybatisxmlApplication;
import com.ailianshuo.mybatisxml.entity.baseset.BasesetUser;
import com.ailianshuo.mybatisxml.mapper.baseset.BasesetUserMapper;

@RunWith(SpringJUnit4ClassRunner. class)
@SpringBootTest(classes=SpringbootMybatisxmlApplication. class)
public class BasesetUserTest {
    @Autowired
    protected BasesetUserMapper userMapper;
    @org.junit.Test
    public void insert() throws Exception {

        BasesetUser user = new BasesetUser();
        user.setUsername("ailianshuo");
        user.setPassword("ailianshuo");
        user.setEnable(1);
        //insert
        userMapper.insert(user);
        int id = user.getId();//獲得自動生成的主鍵

        //selectAll
        List<BasesetUser> users = userMapper.selectAll();
        for (BasesetUser _user : users) {
            System.out.println(_user.getId()+":"+_user.getUsername());
        }
 /*
        //update
        User user2=new User();
        user2.setName("wangxiaoxiao");
        user2.setId(id);
        userMapper.update(user2);

        //delete
        userMapper.delete(id);
        */
    }
}


           

執行:右擊–>Run–>Juit Test:

SpringBoot 架構整合 (二) : MyBatis + Mapper + mybatis-generatorMapper介紹整合Mybatis-mybatis-generator自動生成代碼測試執行個體項目下載下傳

執行個體項目下載下傳

請到這裡下載下傳

繼續閱讀