基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis
SpringBoot 整合 Mybatis 有两种常用的方式,一种就是我们常见的 xml 的方式 ,还有一种是全注解的方式。我觉得这两者没有谁比谁好,在 SQL 语句不太长的情况下,我觉得全注解的方式一定是比较清晰简洁的。但是,复杂的 SQL 确实不太适合和代码写在一起。
下面就开始吧!
目录:
一 开发前的准备
1.1 环境参数
- 开发工具:IDEA
- 基础工具:Maven+JDK8
- 所用技术:SpringBoot+Mybatis
- 数据库:MySQL
- SpringBoot版本:2.1.0
1.2 创建工程
创建一个基本的 SpringBoot 项目,我这里就不多说这方面问题了,具体可以参考下面这篇文章:
https://blog.csdn.net/qq_34337272/article/details/79563606
1.3 创建数据库和 user 用户表
我们的数据库很简单,只有 4 个字段:用户 id、姓名、年龄、余额,如下图所示:
添加了“余额money”字段是为了给大家简单的演示一下事务管理的方式。
建表语句:
- CREATE TABLE `user` (
- `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键',
- `name` varchar(33) DEFAULT NULL COMMENT '姓名',
- `age` int(3) DEFAULT NULL COMMENT '年龄',
- `money` double DEFAULT NULL COMMENT '账户余额',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1.4 配置 pom 文件中的相关依赖
由于要整合 springboot 和 mybatis 所以加入了artifactId 为 mybatis-spring-boot-starter 的依赖,由于使用了Mysql 数据库 所以加入了artifactId 为 mysql-connector-java 的依赖。
- <dependencies>
- <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.2</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
1.5 配置 application.properties
由于我使用的是比较新的Mysql连接驱动,所以配置文件可能和之前有一点不同。
- server.port=8333
- spring.datasource.url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
- spring.datasource.username=root
- spring.datasource.password=153963
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意:我们使用的 mysql-connector-java 8+ ,JDBC 连接到mysql-connector-java 6+以上的需要指定时区 serverTimezone=GMT%2B8
。另外我们之前使用配置 Mysql数据连接是一般是这样指定driver-class-name=com.mysql.jdbc.Driver
,但是现在不可以必须为 否则控制台下面的异常:
- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
上面异常的意思是:com.mysql.jdbc.Driver
被弃用了。新的驱动类是 com.mysql.cj.jdbc.Driver
。驱动程序通过SPI自动注册,手动加载类通常是不必要。
如果你非要写把com.mysql.jdbc.Driver
改为com.mysql.cj.jdbc.Driver
即可。
1.6 创建用户类 Bean
- public class User {
- private int id;
- private String name;
- private int age;
- private double money;
- ...
- 此处省略getter、setter以及 toString方法
- }
二 全注解的方式
先来看一下 全注解的方式,这种方式和后面提到的 xml 的方式的区别仅仅在于 一个将 sql 语句写在 java 代码中,一个写在 xml 配置文件中。全注方式解转换成 xml 方式仅需做一点点改变即可,我在后面会提到。
项目结构:
2.1 Dao 层开发
UserDao.java
- @Mapper
- public interface UserDao {
- /**
- * 通过名字查询用户信息
- */
- @Select("SELECT * FROM user WHERE name = #{name}")
- User findUserByName(@Param("name") String name);
- /**
- * 查询所有用户信息
- */
- @Select("SELECT * FROM user")
- List<User> findAllUser();
- /**
- * 插入用户信息
- */
- @Insert("INSERT INTO user(name, age,money) VALUES(#{name}, #{age}, #{money})")
- void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money);
- /**
- * 根据 id 更新用户信息
- */
- @Update("UPDATE user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}")
- void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
- @Param("id") int id);
- /**
- * 根据 id 删除用户信息
- */
- @Delete("DELETE from user WHERE id = #{id}")
- void deleteUser(@Param("id") int id);
- }
2.2 service 层
- @Service
- public class UserService {
- @Autowired
- private UserDao userDao;
- /**
- * 根据名字查找用户
- */
- public User selectUserByName(String name) {
- return userDao.findUserByName(name);
- }
- /**
- * 查找所有用户
- */
- public List<User> selectAllUser() {
- return userDao.findAllUser();
- }
- /**
- * 插入两个用户
- */
- public void insertService() {
- userDao.insertUser("SnailClimb", 22, 3000.0);
- userDao.insertUser("Daisy", 19, 3000.0);
- }
- /**
- * 根据id 删除用户
- */
- public void deleteService(int id) {
- userDao.deleteUser(id);
- }
- /**
- * 模拟事务。由于加上了 @Transactional注解,如果转账中途出了意外 SnailClimb 和 Daisy 的钱都不会改变。
- */
- @Transactional
- public void changemoney() {
- userDao.updateUser("SnailClimb", 22, 2000.0, 3);
- // 模拟转账过程中可能遇到的意外状况
- int temp = 1 / 0;
- userDao.updateUser("Daisy", 19, 4000.0, 4);
- }
- }
2.3 Controller 层
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- private UserService userService;
- @RequestMapping("/query")
- public User testQuery() {
- return userService.selectUserByName("Daisy");
- }
- @RequestMapping("/insert")
- public List<User> testInsert() {
- userService.insertService();
- return userService.selectAllUser();
- }
- @RequestMapping("/changemoney")
- public List<User> testchangemoney() {
- userService.changemoney();
- return userService.selectAllUser();
- }
- @RequestMapping("/delete")
- public String testDelete() {
- userService.deleteService(3);
- return "OK";
- }
- }
2.4 启动类
- //此注解表示SpringBoot启动类
- @SpringBootApplication
- // 此注解表示动态扫描DAO接口所在包,实际上不加下面这条语句也可以找到
- @MapperScan("top.snailclimb.dao")
- public class MainApplication {
- public static void main(String[] args) {
- SpringApplication.run(MainApplication.class, args);
- }
- }
2.5 简单测试
上述代码经过测试都没问题,这里贴一下根据姓名查询的测试的结果。
三 xml 的方式
项目结构:
相比于注解的方式主要有以下几点改变,非常容易实现。
3.1 Dao 层的改动
我这里只演示一个根据姓名找人的方法。
UserDao.java
- @Mapper
- public interface UserDao {
- /**
- * 通过名字查询用户信息
- */
- User findUserByName(String name);
- }
UserMapper.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">
- <mapper namespace="top.snailclimb.dao.UserDao">
- <select id="findUserByName" parameterType="String" resultType="top.snailclimb.bean.User">
- SELECT * FROM user WHERE name = #{name}
- </select>
- </mapper>
3.2 配置文件的改动
配置文件中加入下面这句话:
mybatis.mapper-locations=classpath:mapper/*.xml
基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis的更多相关文章
- SpringBoot(十一):springboot2.0.2下配置mybatis generator环境,并自定义字段/getter/settetr注释
Mybatis Generator是供开发者在mybatis开发时,快速构建mapper xml,mapper类,model类的一个插件工具.它相对来说对开发者是有很大的帮助的,但是它也有不足之处,比 ...
- springboot2.0+mysql整合mybatis,发现查询出来的时间比数据库datetime值快了8小时
参考:https://blog.csdn.net/lx12345_/article/details/82020858 修改后查询数据正常
- 零基础IDEA整合SpringBoot + Mybatis项目,及常见问题详细解答
开发环境介绍:IDEA + maven + springboot2.1.4 1.用IDEA搭建SpringBoot项目:File - New - Project - Spring Initializr ...
- 使用RESTful风格整合springboot+mybatis
说明: 本文是springboot和mybatis的整合,Controller层使用的是RESTful风格,数据连接池使用的是c3p0,通过postman进行测试 项目结构如下: 1.引入pom.xm ...
- SpringBoot2.0之整合Kafka
maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...
- SpringBoot2.0之整合ElasticSearch
就类比数据库到时候去实现 服务器端配置 集群名字 与yml名字一致 pom: <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...
- SpringBoot2.0之整合ActiveMQ(发布订阅模式)
发布订阅模式与前面的点对点模式很类似,简直一毛一样 注意:发布订阅模式 先启动消费者 公用pom: <project xmlns="http://maven.apache.org/PO ...
- SpringBoot2.0之整合ActiveMQ(点对点模式)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- SpringBoot2.0之整合Dubbo
Dubbo支持协议 Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的. Sprin ...
随机推荐
- 使用redis作为调度中心的celery时启动多个queue,报错Probably the key ('_kombu.binding.reply.celery.pidbox') has been removed from the Redis database
我今天在使用celery启动多个queue时遇到一个问题,当启动第二个queue是,第一个启动的queue日志报了下面一段错误 [2019-12-16 14:40:25,736: ERROR/Main ...
- Why React Is Favored by Front-End Specialists
In this section, we will discuss some of the features that make React a superior choice for front-en ...
- java获取调用当前方法的方法名和行数
java获取调用当前方法的方法名和行数String className = Thread.currentThread().getStackTrace()[2].getClassName();//调用的 ...
- C#工具类MySqlHelper,基于MySql.Data.MySqlClient封装
源码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- 15、VUEX-Store
1.什么是VUEX Vuex是管理vue的组件状态的工具. 个人理解:vuex是管理组件之间通信的一个插件. 2.为什么要用VUEX 我们知道组件之间是独立的,组件之间想要实现通信,我目前知道的就只有 ...
- axios模块封装
1.新建文件夹 network 在文件新建 request.js request.js: import axios from 'axios' export function request (conf ...
- RabbitMQ系列(二)环境搭建
参考: https://www.cnblogs.com/ericli-ericli/p/5902270.html https://blog.csdn.net/weixin_30619101/artic ...
- doucment的获取节点的信息
document.activeElement 返回当前获取焦点元素 document.addEventListener() 向文档添加句柄 document.adoptNode(node) 从另外一个 ...
- android开发中json与java对象相互转换
json与java对象的相互转换.(使用com.google.gson) 在Android开发过程中,客户端总是需要从服务器获取数据,包括XML和json格式,目前json格式的数据使用较为普遍,所以 ...
- logger(三)log4j2简介及其实现原理
一.log4j2简介 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug, ...