博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot集成MyBatis实现通用Mapper
阅读量:7112 次
发布时间:2019-06-28

本文共 5132 字,大约阅读时间需要 17 分钟。

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

引入依赖

org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
mysql
mysql-connector-java
org.projectlombok
lombok
com.zaxxer
HikariCP
复制代码

可以看到如上关于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的使用

引入依赖

tk.mybatis
mapper
3.4.0
复制代码

通用Mapper的作者,有兴趣可阅读源码。

配置通用Mapper

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import tk.mybatis.spring.mapper.MapperScannerConfigurer;import java.util.Properties;@Configurationpublic class MyBatisMapperScannerConfig {    @Bean    public MapperScannerConfigurer mapperScannerConfigurer() {        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
extends Mapper
,MySqlMapper
{}复制代码

通用Mapper接口,其他接口继承该接口即可。

创建实体

我们需要添加test表对应的实体。

@Data@Table(name = "test")@AllArgsConstructor@NoArgsConstructorpublic 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
{ @Insert("insert into test(id, local_name) values(#{id}, #{localName})") Integer insertTestModel(TestModel testModel);}复制代码

TestDao继承自BaseDao,并指定了泛型为对应的TestModelTestDao包含继承的方法,如:

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: 1c.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更加灵活,至于具体比较不在此讨论。

本文对应的源码地址:

订阅最新文章,欢迎关注我的公众号

参考

转载地址:http://hjmhl.baihongyu.com/

你可能感兴趣的文章
FreeBSD 安装JDK+tomcat
查看>>
透视学理论(一)
查看>>
Uber App设计(一)
查看>>
我的友情链接
查看>>
P2P流媒体系统
查看>>
在不同浏览器中调试javaScript代码(三)
查看>>
Memcached管理与监控工具 MemAdmin
查看>>
CentOS 7.4 中时间服务器同步
查看>>
ShaderLab学习小结(十七)草帽团的旗子
查看>>
C++实现快速排序
查看>>
OPEN×××安装配置教程总结 centosX64
查看>>
Quality of Service (QoS)
查看>>
关于suse系统忘记密码后,无法登入的解决办法
查看>>
桌面支持--Win7下安装域管理工具
查看>>
redhat配置yum工具
查看>>
Android异步从网络下载图片并且缓存图片到本地的demo
查看>>
Visual Studio 20周年,我和VS不得不说的故事(内含福利)
查看>>
JVM系列(二)—JVM内存结构
查看>>
Redis存储
查看>>
IO Foundation 6-解压缩zip文件
查看>>