前几天分享了如何在docker上部署mysql,今天我们把它运用起来,通过springboot对mysql和mybatis进行整合
相关文章
1、docker上部署mysql
2、CentOS 7 安装mysql 8.0 图文教程
GitHub地址
点击进入→ Springboot整合mysql和mybatis Github Demo地址
准备阶段
1、安装好mysql后,新建一个库,执行下面的初始化脚本
-- ----------------------------
-- Table structure for user_info 是否使用utf8mb4自己决定
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`sex` int(1) NULL DEFAULT NULL COMMENT '性别',
`create_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建日期',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_info
-- ----------------------------
INSERT INTO `user_info` VALUES (1, '小王', 0, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (2, '小明', 0, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (4, '小红', 1, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (8, '小孙', 0, '2019-11-05 10:02:20');
INSERT INTO `user_info` VALUES (9, '三叶', 1, '2019-11-05 10:06:36');
INSERT INTO `user_info` VALUES (10, '梨花', 1, '2019-11-05 10:47:52');
2、先展示项目的代码整体结构,如下图
3、新建springboot工程
4、配置pom文件和mysql参数
pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.0.RELEASE
com.example.demo
springboot-mysql-mybatis-demo
0.0.1-SNAPSHOT
springboot-mysql-mybatis-demo
Mysql And Mybatis Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
8.0.11
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
application.properties
PS:如果mybatis.mapper-locations需要匹配多个路径,可以用','分割,例如mybatis.mapper-locations=classpath:mybatis/mapper/*.xml,classpath:mybatis/mapper/**/*.xml 代表扫描mapper目录下的xml文件和mapper下一级目录下的xml文件,达到多级扫描效果
server.port=8066
#mysql相关
#如果使用的是mysql 5.X版本使用com.mysql.jdbc.Driver,6以后使用com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#MySQL6.X版本以上必须配置如果设定serverTimezone参数,在设定时区的时候,如果设定serverTimezone=UTC,会比中国时间早8个小时,如果在中国,可以选择Asia/Shanghai或者Asia/Hongkong
spring.datasource.url:jdbc:mysql://你的数据库IP:端口号/库名称?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username:你的数据库账号
spring.datasource.password:你的数据库密码
# hikari数据库连接池相关 可以不配置
#数据源类型
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#连接池名称,默认HikariPool-1
spring.datasource.hikari.pool-name=TestHikariPool
#最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=20
#连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
spring.datasource.hikari.connection-timeout=60000
#最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=5
#空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
# 只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
spring.datasource.hikari.idle-timeout=180000
#连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.max-lifetime=200000
#mybatis相关
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
#如果需要匹配多个路径,可以用','分割,例如mybatis.mapper-locations=classpath:mybatis/mapper/*.xml,classpath:mybatis/mapper/**/*.xml 代表扫描mapper目录下的xml文件和mapper下一级目录下的xml文件,达到多级扫描效果
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.example.demo.smm.mapper.entity
5、配置mapper.xml
mybatis-config.xml
UserInfoMapper.xml sql管理文件
id, user_name, sex, create_date
select
from user_info
where id = #{id}
select
from user_info
and user_name like CONCAT('%',#{userName,jdbcType=VARCHAR},'%')
and sex = #{sex,jdbcType=INTEGER}
insert into user_info(
user_name, sex, create_date
)
values(
#{userName, jdbcType=VARCHAR}, #{sex, jdbcType=INTEGER}, NOW()
)
select last_insert_id()
insert into user_info(
user_name,
sex,
)
values(
#{userName, jdbcType=VARCHAR},
#{sex, jdbcType=INTEGER},
)
6、创建user_info表的mapper和entity
UserInfo.java 用户信息表entity
package com.example.demo.smm.mapper.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 用户信息表entity
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
public class UserInfo implements Serializable {
/**
* id
*/
private Long id;
/**
* 名字
*/
private String userName;
/**
* 年龄
*/
private Integer sex;
/**
* 创建时间
*/
private Date createDate;
/**
* 创建时间字符串,用来做简单的时间转换测试,demo暂不新建其他vo
*/
private String createDateStr;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public String getCreateDateStr() {
return createDateStr;
}
public void setCreateDateStr(String createDateStr) {
this.createDateStr = createDateStr;
}
}
UserInfoDao.java 用户信息mapper映射,此处建议准守阿里Java规约使用UserInfoDao.java作为名称
package com.example.demo.smm.mapper.dao;
import com.example.demo.smm.mapper.entity.UserInfo;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 用户信息mapper映射
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
@Repository
public interface UserInfoDao {
UserInfo getUserInfoById(Long id);
ListgetUserInfoList(UserInfo userInfo);
int insertUserInfo(UserInfo userInfo);
int insertUserInfoCondition(UserInfo userInfo);
}
7、创建业务处理层和控制层
UserInfoService.java 用户信息接口
package com.example.demo.smm.service;
import com.example.demo.smm.mapper.entity.UserInfo;
import java.util.List;
/**
* 用户信息接口
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
public interface UserInfoService {
/**
* 根据id查询用户
* @param id
* @return
* @throws Exception
*/
UserInfo getUserInfoById(Long id) throws Exception;
/**
* 查询用户列表
* @param userInfo
* @return
*/
ListgetUserInfoList(UserInfo userInfo);
/**
* 插入用户信息
* @param userInfo
* @return
*/
Long insertUserInfo(UserInfo userInfo);
/**
* 动态插入用户信息
* @param userInfo
* @return
*/
Long insertUserInfoCondition(UserInfo userInfo);
/**
* 插入用户信息,异常回滚测试方法
* @param userInfo
* @return
*/
Long insertUserInfoExceptionRollBack(UserInfo userInfo);
/**
* 插入用户信息,异常不回滚测试方法
* @param userInfo
* @return
*/
Long insertUserInfoExceptionNoRollBack(UserInfo userInfo);
}
UserInfoServiceImpl.java 用户信息业务实现类
package com.example.demo.smm.service.impl;
import com.example.demo.smm.mapper.dao.UserInfoDao;
import com.example.demo.smm.mapper.entity.UserInfo;
import com.example.demo.smm.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
/**
* 用户信息业务实现类
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoDao userInfoDao;
@Override
public UserInfo getUserInfoById(Long id) throws Exception {
UserInfo userInfo = userInfoDao.getUserInfoById(id);
if(null == userInfo) {
throw new Exception("没有查询到数据");
}
//此处简单做下转换验证时间格式是否正常
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userInfo.setCreateDateStr(sdf.format(userInfo.getCreateDate()));
return userInfo;
}
@Override
public ListgetUserInfoList(UserInfo userInfo) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Listlist = userInfoDao.getUserInfoList(userInfo);
list.forEach(u -> u.setCreateDateStr(sdf.format(u.getCreateDate())));
return list;
}
@Transactional
@Override
public Long insertUserInfo(UserInfo userInfo){
int result = userInfoDao.insertUserInfo(userInfo);
if(result < 1) {
throw new RuntimeException("插入失败");
}
return userInfo.getId();
}
@Transactional
@Override
public Long insertUserInfoCondition(UserInfo userInfo){
int result = userInfoDao.insertUserInfoCondition(userInfo);
if(result < 1) {
throw new RuntimeException("插入失败");
}
return userInfo.getId();
}
@Transactional
@Override
public Long insertUserInfoExceptionRollBack(UserInfo userInfo){
int result = userInfoDao.insertUserInfo(userInfo);
throw new RuntimeException("强制抛出异常,insertUserInfoExceptionRollBack回滚");
}
@Override
public Long insertUserInfoExceptionNoRollBack(UserInfo userInfo){
int result = userInfoDao.insertUserInfo(userInfo);
throw new RuntimeException("强制抛出异常,insertUserInfoExceptionNoRollBack不回滚");
}
}
UserInfoController.java 用户信息控制层
package com.example.demo.smm.controller;
import com.example.demo.smm.mapper.entity.UserInfo;
import com.example.demo.smm.service.UserInfoService;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.util.List;
/**
* 用户信息控制层
*
* @author longzhang.wang
* @Date 2019年11月5日
*/
@RequestMapping("/user")
@RestController
public class UserInfoController {
@Autowired
private UserInfoService userInfoService;
/**
* 根据id查询用户
* @param id
* @return
* @throws Exception
*/
@RequestMapping("/getUserInfoById")
public UserInfo getUserInfoById(Long id) throws Exception {
return userInfoService.getUserInfoById(id);
}
/**
* 查询用户列表
* @param userInfo
* @return
*/
@RequestMapping("/getUserInfoList")
public ListgetUserInfoById(UserInfo userInfo) {
return userInfoService.getUserInfoList(userInfo);
}
/**
* 插入用户信息
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfo")
public Long insertUserInfo(UserInfo userInfo){
Long result = userInfoService.insertUserInfo(userInfo);
return result;
}
/**
* 动态插入用户信息
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfoCondition")
public Long insertUserInfoCondition(UserInfo userInfo){
return userInfoService.insertUserInfoCondition(userInfo);
}
/**
* 插入用户信息,异常回滚测试方法
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfoExceptionRollBack")
public Long insertUserInfoExceptionRollBack(UserInfo userInfo){
return userInfoService.insertUserInfoExceptionRollBack(userInfo);
}
/**
* 插入用户信息,异常不回滚测试方法
* @param userInfo
* @return
*/
@RequestMapping("/insertUserInfoExceptionNoRollBack")
public Long insertUserInfoExceptionNoRollBack(UserInfo userInfo) {
return userInfoService.insertUserInfoExceptionNoRollBack(userInfo);
}
}
测试阶段
1、启动springboot,看是否有启动正常。
2、在浏览器上输入:http://localhost:8066/user/getUserInfoById?id=2 预期返回值为:
{
"id":2,
"userName":"小明",
"sex":0,
"createDate":"2019-11-05T02:06:36.000+0000",
"createDateStr":"2019-11-05 10:06:36"
}
3、在浏览器上输入:http://localhost:8066/user/getUserInfoList?userName=小&sex=0 预期返回值为:
[
{
"id":1,
"userName":"小王",
"sex":0,
"createDate":"2019-11-05T02:06:36.000+0000",
"createDateStr":"2019-11-05 10:06:36"
},
{
"id":2,
"userName":"小明",
"sex":0,
"createDate":"2019-11-05T02:06:36.000+0000",
"createDateStr":"2019-11-05 10:06:36"
},
{
"id":8,
"userName":"小孙",
"sex":0,
"createDate":"2019-11-05T02:02:20.000+0000",
"createDateStr":"2019-11-05 10:02:20"
}
]
4、在浏览器上输入:http://localhost:8066/user/insertUserInfo?userName=插入测试
33
#返回插入Id
5、根据自己的需求对数据进行修改和添加,看是否符合预期
以上为springboot整合mysql和mybatis实例,希望可以帮助到大家,如果小伙伴们还需要整合druid,可以参考:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter