Spring Boot入门系列(六)如何整合Mybatis实现增删改查
前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。
今天主要讲解Springboot整合Mybatis,并实现最基本的增删改查功能。MyBatis 是现如今最流行的 ORM 框架之一,同时也支持普通的 SQL 查询,存储过程等功能的持久层框架。 MyBatis 能让开发者用很简单的代码就能实现数据库操作,非常高效。
Spring Boot整合Mybatis的方式有两种:一种是注解形式的,也就是没有Mapper.xml文件,还有一种是XML形式的。MyBatis 以前只有 XML 配置这种使用的形式,到了后来注解使用特别广泛, MyBatis 也顺应潮流提供了注解的支持,接下来给大家介绍如何使用 XML 版本。
一、整合Mybatis
1、pom.xml增加mybatis相关依赖
我们只需要加上pom.xml文件这些依赖即可。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- druid 数据库连接框架-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
2、application.properties配置数据连接
application.properties中需要增加mybatis相关的数据库配置。
############################################################
# 数据源相关配置,这里用的是阿里的druid 数据源
############################################################
spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view-servlet.allow=true ############################################################
# mybatis 相关配置
############################################################
mybatis.type-aliases-package=com.weiz.pojo
mybatis.mapper-locations=classpath:mapper/*.xml
mapper.mappers=com.weiz.utils.MyMapper #这个MyMapper 就是我之前创建的mapper统一接口。后面所有的mapper类都会继承这个接口
mapper.not-empty=false
mapper.identity=MYSQL
# 分页框架
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
这里的配置有点多,不过最基本的配置都在这。
3、在启动主类添加扫描器
在SpringBootStarterApplication 启动类中增加包扫描器。
@SpringBootApplication
//扫描 mybatis mapper 包路径
@MapperScan(basePackages = "com.weiz.mapper") // 这一步别忘了。
//扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
@ComponentScan(basePackages = {"com.weiz","org.n3r.idworker"})
public class SpringBootStarterApplication { public static void main(String[] args) {
SpringApplication.run(SpringBootStarterApplication.class, args);
} }
注意:这一步别忘了,需要在SpringBootStarterApplication 启动类中增加包扫描器,自动扫描加载com.weiz.mapper 里面的mapper 类。
以上,就把Mybatis 整合到项目中了。 接下来就是创建表和pojo类,mybatis提供了强大的自动生成功能。只需简单几步就能生成pojo 类和mapper。
二、代码自动生成工具
Mybatis 整合完之后,接下来就是创建表和pojo类,mybatis提供了强大的自动生成功能。只需简单几步就能生成pojo 类和mapper。Spring Boot有Mybatis generator自动生成代码插件,能自动生成pojo实体类、接口、mapper.xml 文件,提高开发效率。这里就不介绍怎么安装使用mybatis generator插件。介绍一个简单的GeneratorDisplay自动生成类。
1、增加generatorConfig.xml配置文件
在resources文件下创建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="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/> <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.weiz.utils.MyMapper"/>
</plugin>
<!-- 数据库连接配置-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/zwz_test"
userId="root"
password="root">
</jdbcConnection> <!-- 对于生成的pojo所在包 -->
<javaModelGenerator targetPackage="com.weiz.pojo" targetProject="src/main/java"/> <!-- 对于生成的mapper所在目录 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/> <!-- 配置mapper对应的java映射 -->
<javaClientGenerator targetPackage="com.weiz.mapper" targetProject="src/main/java"
type="XMLMAPPER"/> <table tableName="sys_user"></table> </context>
</generatorConfiguration>
2、数据库User表
需要在数据库中创建相应的表。这个表结构很简单,就是普通的用户表sys_user。
CREATE TABLE `sys_user` (
`id` varchar(32) NOT NULL DEFAULT '',
`username` varchar(32) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL,
`nickname` varchar(64) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
`job` int(11) DEFAULT NULL,
`face_image` varchar(6000) DEFAULT NULL,
`province` varchar(64) DEFAULT NULL,
`city` varchar(64) DEFAULT NULL,
`district` varchar(64) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`auth_salt` varchar(64) DEFAULT NULL,
`last_login_ip` varchar(64) DEFAULT NULL,
`last_login_time` datetime DEFAULT NULL,
`is_delete` int(11) DEFAULT NULL,
`regist_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
3、增加统一的mapper接口
在utils包中创建一个统一的mapper接口,
后面所有的mapper类都会继承这个接口
package com.weiz.utils; import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper; /**
* 继承自己的MyMapper
*
* @author weiz
* @since 2019-09-06 21:53
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
//TODO
//FIXME 特别注意,该接口不能被扫描到,否则会出错
}
MyMapper类是我自定义封装的Maper接口,它集成Mybatis的Mapper<T>, MySqlMapper<T>接口,这里面包含了默认的增删改查的方法。代码生成器自动生成的mapper类,都会统一集成MyMapper接口。
特别注意:该接口不能被扫描到,否则会出错。所以我把这个接口放在了utils包中。
4、创建GeneratorDisplay类
package com.weiz.utils; import java.io.File;
import java.util.ArrayList;
import java.util.List; import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback; public class GeneratorDisplay { public void generator() throws Exception{ List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 逆向工程配置文件
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null); } public static void main(String[] args) throws Exception {
try {
GeneratorDisplay generatorSqlmap = new GeneratorDisplay();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
} }
}
这个其实也是调用mybatis generator实现的。跟mybatis generator安装插件是一样的。
注意:利用Mybatis Generator自动生成代码,对于已经存在的文件会存在覆盖和在原有文件上追加的可能性,不宜多次生成。如需重新生成,需要删除已生成的源文件。
5、Mybatis Generator自动生成pojo和mapper
运行GeneratorDisplay 如下图所示,即可自动生成相关的代码。
三、实现增删改查
在项目中整合了Mybatis并通过自动生成工具生成了相关的mapper和配置文件之后,下面就开始项目中的调用。
1、在service包下创建UserService及UserServiceImpl接口实现类
创建com.weiz.service包,添加UserService接口类
package com.weiz.service; import com.weiz.pojo.SysUser; import java.util.List; public interface UserService { public void saveUser(SysUser user) throws Exception; public void updateUser(SysUser user); public void deleteUser(String userId); public SysUser queryUserById(String userId); public List<SysUser> queryUserList(SysUser user); public List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize); public void saveUserTransactional(SysUser user);
}
创建com.weiz.service.impl包,并增加UserServiceImpl实现类,并实现增删改查的功能,由于这个代码比较简单,这里直接给出完整的代码。
package com.weiz.service.impl; import com.github.pagehelper.PageHelper;
import com.weiz.mapper.SysUserMapper;
import com.weiz.mapper.SysUserMapperCustom;
import com.weiz.pojo.SysUser;
import com.weiz.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;
import tk.mybatis.mapper.entity.Example; import java.util.List; @Service
public class UserServiceImpl implements UserService { @Autowired
private SysUserMapper userMapper; @Override
public void saveUser(SysUser user) throws Exception {
userMapper.insert(user);
} @Override
public void updateUser(SysUser user) {
userMapper.updateByPrimaryKeySelective(user);
} @Override
public void deleteUser(String userId) {
userMapper.deleteByPrimaryKey(userId);
} @Override
public SysUser queryUserById(String userId) {
return userMapper.selectByPrimaryKey(userId);
} @Override
public List<SysUser> queryUserList(SysUser user) {
return null;
} @Override
public List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize) {
// 分页功能实现
PageHelper.startPage(page,pageSize);
Example example = new Example(SysUser.class);
Example.Criteria criteria = example.createCriteria(); if (!StringUtils.isEmptyOrWhitespace(user.getUsername())) {
criteria.andLike("username", "%" + user.getUsername() + "%");
} if (!StringUtils.isEmptyOrWhitespace(user.getNickname())) {
criteria.andLike("nickname", "%" + user.getNickname() + "%");
} List<SysUser> userList = userMapper.selectByExample(example); return userList;
} @Override
public void saveUserTransactional(SysUser user) { }
}
2、编写controller层,增加MybatisController控制器
package com.weiz.controller; import com.weiz.utils.JSONResult;
import com.weiz.pojo.SysUser;
import com.weiz.service.UserService;
import org.n3r.idworker.Sid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.Date;
import java.util.List; @RestController
@RequestMapping("mybatis")
public class MyBatisCRUDController { @Autowired
private UserService userService; @Autowired
private Sid sid; @RequestMapping("/saveUser")
public JSONResult saveUser() throws Exception {
// 自动生成ID,也可以直接用uuid
String userId = sid.nextShort(); SysUser user = new SysUser();
user.setId(userId);
user.setUsername("spring boot" + new Date());
user.setNickname("spring boot" + new Date());
user.setPassword("abc123");
user.setIsDelete(0);
user.setRegistTime(new Date()); userService.saveUser(user); return JSONResult.ok("保存成功");
} @RequestMapping("/updateUser")
public JSONResult updateUser() { SysUser user = new SysUser();
user.setId("10011001");
user.setUsername("10011001-updated" + new Date());
user.setNickname("10011001-updated" + new Date());
user.setPassword("10011001-updated");
user.setIsDelete(0);
user.setRegistTime(new Date()); userService.updateUser(user); return JSONResult.ok("保存成功");
} @RequestMapping("/deleteUser")
public JSONResult deleteUser(String userId) { userService.deleteUser(userId); return JSONResult.ok("删除成功");
} @RequestMapping("/queryUserById")
public JSONResult queryUserById(String userId) { return JSONResult.ok(userService.queryUserById(userId));
} @RequestMapping("/queryUserList")
public JSONResult queryUserList() { SysUser user = new SysUser();
user.setUsername("spring boot");
user.setNickname("lee"); List<SysUser> userList = userService.queryUserList(user); return JSONResult.ok(userList);
} @RequestMapping("/queryUserListPaged")
public JSONResult queryUserListPaged(Integer page) {
if (page == null) {
page = 1;
} int pageSize = 10; SysUser user = new SysUser(); List<SysUser> userList = userService.queryUserListPaged(user, page, pageSize); return JSONResult.ok(userList);
} @RequestMapping("/queryUserByIdCustom")
public JSONResult queryUserByIdCustom(String userId) { return JSONResult.ok(userService.queryUserByIdCustom(userId));
} @RequestMapping("/saveUserTransactional")
public JSONResult saveUserTransactional() { String userId = sid.nextShort(); SysUser user = new SysUser();
user.setId(userId);
user.setUsername("lee" + new Date());
user.setNickname("lee" + new Date());
user.setPassword("abc123");
user.setIsDelete(0);
user.setRegistTime(new Date()); userService.saveUserTransactional(user); return JSONResult.ok("保存成功");
} }
3、测试
在浏览器输入controller里面定义的路径即可。只要你按照上面的步骤一步一步来,基本上就没问题,是不是特别简单。
最后
以上,就把Spring Boot整合Mybatis及实现增删改查介绍完了,Spring Boot 整合Mybatis 是整个Spring Boot 非常重要的功能,也是非常核心的基础功能,希望大家能够熟练掌握。后面会深入介绍Spring Boot的各个功能和用法。
这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号(架构师精进),回复:springboot源码。获取这个系列课程的完整源码。
Spring Boot入门系列(六)如何整合Mybatis实现增删改查的更多相关文章
- 上手spring boot项目(三)之spring boot整合mybatis进行增删改查的三种方式。
1.引入依赖. <!--springboot的web起步依赖--><dependency> <groupId>org.springframework.boot< ...
- 上手spring boot项目(三)之spring boot整合mybatis进行增删改查
使用mybatis框架进行增删改查大致有两种基础方式,一种扩展方式.两种基础方式分别是使用xml映射文件和使用方法注解.扩展方式是使用mybatis-plus的方式,其用法类似于spring-data ...
- Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!
之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...
- Spring Boot入门系列(十六)使用pagehelper实现分页功能
之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...
- Spring Boot入门系列(十三)如何实现事务
前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1 ...
- Spring Boot入门系列(二十)快速打造Restful API 接口
spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...
- 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建
salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建 VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...
- springmvc+spring3+hibernate4框架简单整合,简单实现增删改查功能
转自:https://blog.csdn.net/thinkingcao/article/details/52472252 C 所用到的jar包 数据库表 数据库表就不用教大家了,一张表,很简 ...
- 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...
随机推荐
- 虚拟机apache启动
/usr/local/apache2/bin/apachectl restart 重启 当启动也行 尝试过进入目录运行,比较奇怪,www目录竟然不一致,直接使用 server httpd start ...
- deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
1. 传统的边缘检测(比如Sobel)手工设计了3*3的filter(或者叫kernel)的9个权重,在深度学习中,这9个权重都是学习出来的参数,会比手工设计的filter更好,不但可以提取90度.0 ...
- [LC] 232. Implement Queue using Stacks
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
- 吴裕雄--天生自然Android开发学习:1.2.2 使用Android Studio开发Android APP
1.下载Android Studio 官网下载:Android Studio for Window ... :http://developer.android.com/sdk/installing/s ...
- 三步教你实现MyEclipse的debug远程调试
MyEclipse远程调试程序是个神奇的东西,有时一个项目本地运行没问题可放到服务器上,同样的条件就是结果不一样:有时服务器上工程出点问题需要远程调测.于是就灰常想看一下程序在远程运行时候的状态,希望 ...
- 吴裕雄--天生自然HTML学习笔记:HTML 表格
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- JS Style Guide_1
当你在回调函数里要使用函数表达式时,尽量使用箭头函数,比如数组中的 Map.filter.reduce等的回调函数中 [1,2,3].map((x) => { let y = x + 1; re ...
- 吴裕雄--天生自然 R语言开发学习:回归(续二)
#------------------------------------------------------------# # R in Action (2nd ed): Chapter 8 # # ...
- mybatis 添加后获得该新增数据自动生成的 id
// useGeneratedKeys默认值为false,keyProperty的值对应的是User类中的主键字段名 // mybatis 写法如下 <insert id="inser ...
- zookeeper 客户端连接报: Will not attempt to authenticate using SASL
解决方法:我在学习zk的时候,用客户端连接zk,发现接收不到watch通知,并且报 如图所示错误: 后查看服务没问题:图示 后查看防火墙状态,关闭防火墙 连接后正常: 如果查看防火墙状态是dead,s ...