1. 程式人生 > >Spring Boot集成MyBatis實現通用Mapper

Spring Boot集成MyBatis實現通用Mapper

TBase cti 自動生成代碼 port sig max 添加 記錄 connect

前言

MyBatis
關於MyBatis,大部分人都很熟悉。MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
不管是DDD(Domain Driven Design,領域驅動建模)還是分層架構的風格,都會涉及到對數據庫持久層的操作,本文將會講解Spring Boot集成MyBatis如何實現通用Mapper。


Spring Boot集成MyBatis
引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>

復制代碼可以看到如上關於Mybatis引入了mybatis-spring-boot-starter,由Mybatis提供的starter。
數據庫配置
在application.yml中增加如下配置:
spring:
datasource:
hikari:
connection-test-query: SELECT 1
minimum-idle: 1
maximum-pool-size: 5
pool-name: dbcp1
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf-8

username: user
password: pwd
type: com.zaxxer.hikari.HikariDataSource
schema[0]: classpath:/init.sql
initialize: true
復制代碼可以看到,我們配置了hikari和數據庫的基本信息。在應用服務啟動時,會自動初始化classpath下的sql腳本。
CREATE TABLE IF NOT EXISTS test (
id bigint(20) unsigned NOT NULL,
local_name varchar(128) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
復制代碼在sql腳本中,我們創建了一張test表。
到這裏,後面我們一般需要配置Mybatis映射的xml文件和實體類的路徑。根據mybatis generator 自動生成代碼。包括XXMapper.java,XXEntity.java, XXMapper.xml。這裏我們就不演示了,直接進入下一步的通用Mapper實現。
通用Mapper的使用
引入依賴
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.0</version>
</dependency>
復制代碼通用Mapper的作者abel533,有興趣可閱讀源碼。
配置通用Mapper
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tk.mybatis.spring.mapper.MapperScannerConfigurer;

import java.util.Properties;

@Configuration
public class MyBatisMapperScannerConfig {@Bean
br/>@Bean
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.blueskykong.mybatis.dao");//掃描該路徑下的dao
Properties properties = new Properties();
properties.setProperty("mappers", "com.blueskykong.mybatis.config.BaseDao");//通用dao
properties.setProperty("notEmpty", "false");
properties.setProperty("IDENTITY", "MYSQL");
mapperScannerConfigurer.setProperties(properties);
return mapperScannerConfigurer;
}
}
復制代碼在配置中,設定了指定路徑下的dao,並指定了通用dao。需要註意的是,MapperScannerConfigurer來自於tk.mybatis.spring.mapper包下。
BaseDao
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

public interface BaseDao<T> extends Mapper<T>,MySqlMapper<T>{

}復制代碼通用Mapper接口,其他接口繼承該接口即可。
創建實體
我們需要添加test表對應的實體。
@Data
br/>復制代碼通用Mapper接口,其他接口繼承該接口即可。
創建實體
我們需要添加test表對應的實體。
@Data
br/>@AllArgsConstructor
public class TestModel {

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

private String localName;

}
復制代碼其中,@Table(name = "test")註解指定了該實體對應的數據庫表名。
配置文件
mybatis:
configuration:
map-underscore-to-camel-case: true
復制代碼為了更好地映射Java實體和數據庫字段,我們指定下劃線駝峰法的映射配置。
TestDao編寫
public interface TestDao extends BaseDao<TestModel> {

@Insert("insert into test(id, local_name) values(#{id}, #{localName})")
Integer insertTestModel(TestModel testModel);

}
復制代碼TestDao繼承自BaseDao,並指定了泛型為對應的TestModel。TestDao包含繼承的方法,如:
int deleteByPrimaryKey(Integer userId);

int insert(User record);

int insertSelective(User record);

User selectByPrimaryKey(Integer userId);

int updateByPrimaryKeySelective(User record);

int updateByPrimaryKey(User record);

復制代碼還可以自定義一些方法,我們在上面自定義了一個insertTestModel方法。
Service層和控制層
本文略過這兩層,比較簡單,讀者可以參見本文對應的源碼地址。
結果驗證
我們在插入一條數據之後,查詢對應的實體。對應執行的結果也都是成功,可以看到控制臺的如下日誌信息:
c.b.mybatis.dao.TestDao.insertTestModel : ==> Preparing: insert into test(id, local_name) values(?, ?)
c.b.mybatis.dao.TestDao.insertTestModel : ==> Parameters: 5953(Integer), testName(String)
c.b.mybatis.dao.TestDao.insertTestModel : <== Updates: 1
c.b.m.dao.TestDao.selectByPrimaryKey : ==> Preparing: SELECT id,local_name FROM test WHERE id = ?
c.b.m.dao.TestDao.selectByPrimaryKey : ==> Parameters: 5953(Integer)
c.b.m.dao.TestDao.selectByPrimaryKey : <== Total: 1
復制代碼Spring Boot集成MyBatis實現通用Mapper到此就大功告成。

總結

MyBatis是持久層非常常用的組件,Spring Boot倡導約定優於配置,特別是很多xml的配置。當然還有很多同學使用Spring Data。相比而言,我覺得MyBatis的SQL比Spring Data更加靈活,至於具體比較不在此討論。

Spring Boot集成MyBatis實現通用Mapper