CRUD是程序员最基本的素养,而springboot集成mybatis又是CRUD的基础。所以任何时候能快速集成mybatis很重要。
全文概要:
1、用Maven创建springboot工程 (参考上一篇springboot快速上手)
2、引入pom依赖(mybatis、jdbc、druid)
3、写依赖对应的配置文件(druid连接池,mybatis)
4、创建表与表对应的实体类
5、三层架构写法(dao 、service、controller)
正文内容:
由于之前已经讲过创建Springboot工程,这次从引入依赖开始讲起。
一、引入依赖
新增三个依赖,前面创建web工程的依赖不能丢。
<!--mybatis和数据库连接依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--数据库连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.5</version>
</dependency>
二、写配置文件
1、mybatis配置
2、连接池druid配置
3、重点关注的参数项
a、mybatis.type-aliases-package 指定实体类在哪个包下
b、spring.datasource.url 指定数据库中的表(网络上或者本地)
c、spring.datasource.username 和spring.datasource.password
d、spring.datasource.driver-class-name 指定数据库驱动(mysql8 有区别)
e、spring.datasource.type 指定数据连接池的数据源
三、建表与表对应的实体类
一般开发流程是先设计好数据库表,因为后期改数据库表很麻烦,所以要整体把握好项目设计好数据库表。
1、建表语句
CREATE TABLE miaosha_user(
id bigint(20) NOT NULL COMMENT '用户id,手机号码',
nickname varchar(255) NOT NULL COMMENT '用户昵称',
password varchar(64) DEFAULT NULL COMMENT 'MD5(MD5(pass明文+固定salt))',
salt varchar(10) DEFAULT NULL ,
head varchar(128) DEFAULT NULL COMMENT '头像,云存储的ID',
register_date datetime DEFAULT NULL COMMENT '注册时间',
last_login_date datetime DEFAULT NULL COMMENT '上次登录时间',
login_count int(11) DEFAULT 0 COMMENT '登录次数',
PRIMARY KEY (id)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4;
2、domain包下创建实体类
package com_item.miaosha.domain;
import java.util.Date;
public class MiaoshaUser {
private Long id; /**用户id*/
private String nickname; /**用户昵称*/
private String password; /**两场MD5后的密码*/
private String salt; /**盐值,用于MD5加密*/
private String head; /**头像*/
private Date registerDate; /** 注册日期*/
private Date lastLoginDate; /**上次登录时间*/
private Integer loginCount; /**登录次数*/
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public Date getRegisterDate() {
return registerDate;
}
public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
}
public Date getLastLoginDate() {
return lastLoginDate;
}
public void setLastLoginDate(Date lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}
public Integer getLoginCount() {
return loginCount;
}
public void setLoginCount(Integer loginCount) {
this.loginCount = loginCount;
}
}
四、三层架构写法
自顶向下的设计,然后底向上用代码实现。设计什么样的接口(controller)、提供什么样的服务(service)、写什么样的SQL(dao)。
1、自顶向下设计思想
我想写的接口 http:localhost:8080/login/db/get 从数据库的秒杀表中拿到id(手机号)是189XXX的用户的全部信息。该工工作是要放在service层完成的,controller层只需要调用service层写好的方法,最多传个参数给service层中的方法。数据一般来自数据库(大多数业务),dao层写sql语句提高获取原始数据的接口,service层再调用dao层中接口实现类的方法获取数据库中原始数据同时加上一些业务逻辑,定制我们想要的数据。
可以先写controller层,明确接口的要数据类型。
我想通过http:localhost:8080/login/db/get 拿到189XXX用户的信息,即返回MiaoshaUser对象
@RequestMapping("/login")
@RestController
public class LoginController{
@RequestMapping("/db/get")
public MiaoshaUser getMiaoshaUser(){
//调用service层方法,并且传入参数id
}
}
后面顺理成章的知道,通过service层如何写
@Service
public class MiaoshaUserService{
public MiaoshaUser getById(long id){
//调用daoc层接口实例的方法
}
}
最后再考虑dao层的MIaoshaUserDao接口需要的方法,即写sql语句
@Mapper
public interface MiaoshaUserDao{
@Select("select * from miaosha_user where id = #{id}")
public MiaoshaUser getById(@Param("id")long id); /**这是一个抽象方法,通过id查找表中用户信息*/
}
可以看到最先确定的是dao层的代码
2、自底向上代码实现
dao层已经写好了,主要是写service层,大型项目service层是比较复杂的。
@Service
public class MiaoshaUserService{
@Autowired
MiaoshaUserDao miaoshaUserDao;
public MiaoshaUser getById(long id){
return miaoshaUserDao.getById(id);
}
}
@Controller
@RequestMapping("/login")
public class LoginController{
@Autowired
MiaoshaService miaoshaService;
@ResponseBody
@RequestMapping("db/get")
public MiaoshaUser getMiaoshaUser(){
MiaoshaUse miaoshaUser = miaoshaService.getById(1898XXX);
return miaoshaUser;
}
}
结果: