Springboot 整合mybatis最完整教程
前言:
各位同学大家好,最近在学习springboot整合mybatis的知识点,正好放假有时间写了一个springboot整合mybatis的经典案例所以就分享大家,希望能帮助到同学对于springboot框架的学习,那么废话不多说我们正式开始
准备工作
1安装好idea 或者eclispe +sts开发环境
2安装maven 并配置环境
怎么使用idea 这个工具一键创建springboot工程
这些在我之前的教程都讲的很清楚 这里我就不展开细说 有兴趣的同学可以去看我以前的文章】
Springboot搭建零基础教程:https://www.jianshu.com/p/c48595fdbf39
需要用到三方库
<!--java -web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
建表语句
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.7.17-log : Database - mybdtisdemo
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybdtisdemo` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;
USE `mybdtisdemo`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`password` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`age` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`sex` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`password`,`age`,`sex`) values (2,'xuqing','xq9527','27','男');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
application.ymal 的配置 如下图:
server:
port: 8090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mybdtisdemo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
username: root
password: 123456
#配置Mapper.xml映射文件
mybatis:
mapper-locations: classpath*:mybatis/mapper/*.xml
准备按设置了utf-8编码和 serverTimezone=UTC 和时区 以及数据库账号和密码 jdbc 驱动 这些都配置好以后我们启动一下
我们看到项目正常的启动了我们打开postman工具访问一下 测试的接口
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userservice;
@RequestMapping("/index")
public Object index(){
return "部署成功";
}
我们看到有一个部署成功的字符串返回 项目整个算是正常启动成功我们需要加入一些业务逻辑代码来配合Sprigboot整合mybatis框架 来实现我们的业务需求
具体实现:
1创建bean类(数据模型)
package com.example.mybatis_demo.bean;
public class User {
private int id;
private String name;
private String password;
private String age;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
bean类里面的属性我们最好要跟我们数据库对应表中的字段保持一致
2创建 Mapper类
package com.example.mybatis_demo.dao;
import com.example.mybatis_demo.bean.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserDao {
@Select("select * from user")
public List<User>getallUser();
@Select("select * from user where id= #{id}")
public User getuserbyId(Integer id);
@Insert("insert into user (name,password, age ,sex) values (#{name},#{password},#{age},#{sex})")
int addUser(User user);
@Select("select * from user where name= #{name}")
public User getuserbyname(String name);
@Update("update user set password =#{password} where name= #{name}")
public int upDatePassword(@Param("name") String name,
@Param("password") String password);
@Delete("delete from user WHERE id = #{id}")
int deleteUser(@Param("id")Integer id);
}
我们需要用到的sql语句我们都在 Mapper类中用注解来实现 我们就不需要在Contorller中写大量的sql语句了是不是使得代码可读性和管理也方便
3创建service 层
package com.example.mybatis_demo.service;
import com.example.mybatis_demo.bean.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import java.util.List;
public interface UserService {
List<User> getallUser();
User getuserbyId(Integer id);
int addUser(User user);
User getuserbyname(String name);
String upDatePassword(String name, String password, String newpsw);
int deleteUser(Integer id);
}
service 层的接口类定义的一些方法(包括增删改查的方法)是给controller 来调用的
4处理service 层 实现层 impl层
package com.example.mybatis_demo.service.impl;
import com.example.mybatis_demo.bean.User;
import com.example.mybatis_demo.dao.UserDao;
import com.example.mybatis_demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service(value = "userService")
public class UserServiceimpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List<User> getallUser() {
return userDao.getallUser();
}
/**
* @param id
* @return
* 通过头id查询数据
*
*
*/
@Override
public User getuserbyId(Integer id) {
return userDao.getuserbyId(id);
}
/**
* @param user
* @return
* 添加数据
*/
@Override
public int addUser(User user) {
return userDao.addUser(user);
}
//通过用户名查询数据
@Override
public User getuserbyname(String name) {
return null;
}
/**
* @param name
* @param password
* @return
* 更新数据
*
*/
@Override
public String upDatePassword(String name, String password, String newpsw) {
User user=userDao.getuserbyname(name);
if(user!=null){
if(user.getPassword().equals(password)){
userDao.upDatePassword(name,newpsw);
return "success";
}else{
return "defeated";
}
}else{
return "fail";
}
}
@Override
public int deleteUser(Integer id) {
return userDao.deleteUser(id);
}
}
这一层是真正的sercvie业务逻辑的实现我们需要用Autowired 这个注解来引入刚才的 Mapper类来处理对数据库里面的数据操作(增删改查)
通常大家在使用的时候
@Autowired
UserDao userDao;
都会有红色报错提示 这个不用管 这是IDE的问题我们的代码可以正常运行的
5 controller 层具体业务逻辑实现:
####1添加数据:
@RequestMapping("/adduser")
public Object addUser(
@RequestParam (value = "name")String name,
@RequestParam (value = "password")String password,
@RequestParam (value = "age")String age,
@RequestParam (value = "sex")String sex){
Map<String,Object>map=new HashMap<>();
User user=new User();
user.setName(name);
user.setPassword(password);
user.setAge(age);
user.setSex(sex);
int addcode=userservice.addUser(user);
if(addcode==1){
map.put("code",200);
map.put("msg","添加数据成功");
}else {
map.put("code",100);
map.put("msg","添加数据失败");
}
return map;
}
我们打开postman测试一下
接口给我们返回添加数据成功,我们打开数据库可视化工具查询下
我们看到数据库里面已经插入一条数据了
2查询数据:
2.1查询所有数据
@RequestMapping("/getalluser")
public Object getAllUser(){
List<User>data=userservice.getallUser();
Map<String,Object>map=new HashMap<>();
if(data!=null&&data.size()>0){
map.put("code",200);
map.put("msg","获取数据成功");
map.put("data",data);
}else{
map.put("code",100);
map.put("msg","暂时没有数据");
}
return map;
}
我们打开postman测试请求一下
我们看到获取到数据库中所有的数据,因为只有一条所以json数组中只有一条
2.2查询单条数据
这个时候我们需要传入数据库中user表的头id来进行查询我们看代码实现
@RequestMapping("/getusetbyid")
public Object getUserById(@RequestParam (value = "id") Integer id){
User user=userservice.getuserbyId(id);
Map<String,Object>map=new HashMap<>();
if(user!=null){
map.put("code",200);
map.put("msg","获取数据成功");
map.put("user",user);
}else{
map.put("code",100);
map.put("msg","暂时没有数据");
}
return map;
}
我们来测试一下
我们可以看到通过接口我们把数据库user表中 id=2的数据查询到并且返回
3更新数据:
@RequestMapping("/updatepassword")
public Object updatePassword(@RequestParam(value = "name") String name,
@RequestParam (value = "password")String password,
@RequestParam (value = "newpsw")String newpsw) {
Map<String, Object> map = new HashMap<>();
if (TextUtils.Isempty(name) || TextUtils.Isempty(password) || TextUtils.Isempty(newpsw)) {
map.put("msg", "账号或者密码不能为空");
map.put("code", 100);
return map;
} else {
if (password.equals(newpsw)) {
map.put("msg", "新密码和旧密码不能一样");
map.put("code", 101);
return map;
} else {
String infindpsw = userservice.upDatePassword(name, password, newpsw);
if (infindpsw.equals("success")) {
map.put("msg", "修改密码成功");
map.put("code", 200);
return map;
} else if (infindpsw.equals("defeated")) {
map.put("msg", "旧密码不对");
map.put("code", 102);
return map;
} else if (infindpsw.equals("fail")) {
map.put("msg", "不存在该用户");
map.put("code", 103);
return map;
} else {
map.put("msg", "服务器错误");
map.put("code", 104);
return map;
}
}
}
}
更新password 这个字段 我们需要前端传入 name password newpsw 3个字段来处理更新操作我们先空判,然后判断新密码个旧密码不一样 ,然后我们调用service 层的更新数据的方法即可
更新前数据库数据:
我们用postman测试一下更新数据的接口
我们再次查询数据库
更新后数据库数据:
我们看到数据库中的数据已经更新过来了
4删除数据:
@RequestMapping("/deleteuser")
public Object deleteUser(@RequestParam (value = "id")Integer id){
Map<String,Object>map=new HashMap<>();
User user=userservice.getuserbyId(id);
if(user!=null){
int deletecode=userservice.deleteUser(id);
if(deletecode==1){
map.put("code",200);
map.put("msg","删除数据成功");
}else {
map.put("code",100);
map.put("msg","删除数据失败");
}
}else{
map.put("code",101);
map.put("msg","不存在该条数据");
}
return map;
}
删除数据我们需要传入user表的头id来处理删除拿一条数据,这边我们是先调用了查询的方法先查看数据库中是否存在该条数据如果不存在直接返回不存在该条数据,如果存在我再调用删除的方法删除数据库中对应id的数据
我们先查询数据库删除前的数据
然后我们调用删除数据的接口,我们打开postman测试请求一下
我们看到返回删除数据成功,我们再打开数据查询一下改条数据是否存在 (id=2的数据库)
删除后的数据:
我们可以看到数据库中id=2的数据已经不存在,已经我们用接口请求删除了 。
到此整个springboot整合mybatis 的教程就讲完了
##最后总结:
mybatis相对于过去 java web jsp和简单的SpringDataJPA 框架算是一个折中的方案,既保留了sql语句的灵活性又使得代码可阅读性更强,这里的我使用的注解的方式来写的sql语句,当然你也可以用mybatis 逆向工程xml的形势来写业务逻辑的sql语句 这里篇幅有限我就不展开讲了,我们后期会讲到, 有兴趣的同学可以底下留言, 最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦
##项目地址:
码云 :https://gitee.com/qiuyu123/mybatisdemo
github:https://github.com/xq19930522/mybatis_demo。
- 点赞
- 收藏
- 关注作者
评论(0)