mybatis mysql demo_Springboot整合mysql和mybatis实例代码 附github demo下载直接运行

前几天分享了如何在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、先展示项目的代码整体结构,如下图

ad17f974e26f72590eae3860bf084625.png

3、新建springboot工程

125189efa58446137ab46a41b46e8af6.png

84ea592c2840354d4b3d571d37bdb8c2.png

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


版权声明:本文为weixin_42100188原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。