springboot整合mybatis+druid(详解)
一、创建一个SpringBoot项目添加部分依赖:二、引入相关依赖:需要的依赖预览:记忆方式:mysql数据库驱动–>druid数据库连接池–>mybatis进行增删改查①连接mysql数据库的驱动:mysql数据库驱动依赖mysql-connector-java②使用druid和springboot整合的数据库连接池的:druid-spring-boot-starter③进行数据库的
目录
带动态查询的mybatis案例请参考:
https://blog.csdn.net/weixin_38568503/article/details/121381914.
项目结构:
一、创建一个SpringBoot项目
项目名称:springboot-mybatis-druid
添加部分依赖:
二、pom中引入相关依赖:
需要的依赖预览:
记忆方式:mysql数据库驱动–>druid数据库连接池–>mybatis进行增删改查
①连接mysql数据库的驱动:mysql数据库驱动依赖mysql-connector-java
②使用druid和springboot整合的数据库连接池的:druid-spring-boot-starter
③进行数据库的增删改查的mybatis和springboot的整合依赖:mybatis-spring-boot-starter
web核心依赖:spring-boot-starter-web
注意:这里为了大家更加专注mybatis的使用,所以不使用thymeleaf模板进行页面渲染。
这里我也没有使用druid依赖,因为druid依赖需要多些一个配置文件config,在配置文件中配置druid监控等各种bean,比较麻烦。而使用druid-spring-boot-starter则不需要单独配置各种bean
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-mybatis-druid</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mybatis-druid</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--spring-boot-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--对应自己电脑安装的mysql版本-->
<version>8.0.22</version>
</dependency>
<!--druid-spring-boot连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<!--mybatis-spring-boot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--spring-boot-starter-web核心模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.0</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--spring-boot-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--打包插件(spring-boot-maven的打包方式)-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
依赖分析:(有些博主还导入spring-boot-starter-jdbc,其实用了mybatis后就没必要导入了,多此一举)
三、编写application.yml:
首先删除掉自带的application.properties.
然后在resources文件夹下新建File文件application.yml
因为我们依赖导入了数据库驱动等,所以需要在yml中进行数据库连接信息的配置,以及mybatis的一些配置。
application.yml:
spring:
#数据库的连接信息:5项,这里我是mysql8的连接信息
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
password: root
username: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
#以下省略druid的监控的一些配置。
mybatis:
#匹配sql语句的映射文件的位置,classpat代表在resources下
mapper-locations: classpath:mybatis/mapper/*.xml
#以下两个配置可以省略,然后在mapper映射文件中配置也是可以的。
#使用type-aliases-package中指定entity扫描包类让mybatis自定扫描到自定义的entity
type-aliases-package: com.example.entity
configuration:
# 开启驼峰uName自动映射到u_name
map-underscore-to-camel-case: true
(1)yml配置说明:为了省事,我们可以在yml中只配置mybatis.mapper-locations来指明sql语句位置即可,开启驼峰命名匹配可以在mybatis的mapper映射文件中配置,而resultType直接使用实体类的全限定名即可。
(2)type-aliases-package使用说明:
方式一:直接使用实体类的全限定名:
mapper.xml文件中resultType或者parameterType会使用JavaBean作为返回结果或者参数需要使用完全限定名来指定引用。
例如
<select id="getUsers" resultType="com.example.entity.User">
方式二:yml中进行配置,然后使用类名来直接代替全限定名:
又或者你可以通过在application.properties中指定POJO扫描包来让mybatis自动扫描到自定义POJO:
application.properties中的配置:
mybatis.type-aliases-package=com.example.entity
mapper中可以写成
<select id="getUsers" resultType="User">
到此配置完毕。我们开始写代码:
四、准备数据库和表t_book:
本人机器上安装的是mysql8.0.22版本:
我们可以创建一个test数据库,然后在test数据库中创建一个表t_book
这里我使用sqlyog,也可以使用navcat等
然后点击保存即可。
可以先保存一两条数据备用;
五、创建一个实体类Book:
entity.Book:
package com.example.springbootmybatisdruid.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book{
private int id;
private String name;
private String author;
//两个参数的构造方法
public Book(String name,String author){
this.name = name;
this.author = author;
}
}
六、编写mapper接口:
在不使用mybatis之前我们一般是dao层–>service层–>controller层。
使用了mybatis之后,我们的dao层被演变成了两个东西:
(1)java包下的mapper接口(mapper接口和实体类,controller等包同级)。
(2)resources类路径下的mapper映射文件(写sql语句的)。
注意:这里我们先测试一个查询的方法,其他增删改查的方法在文章末尾补充。
mapper.BookMapper:
package com.example.springbootmybatisdruid.mapper;
import com.example.springbootmybatisdruid.entity.Book;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper//指定这是一个操作数据库的mapper
@Repository
public interface BookMapper {
//增加,修改,删除图书,都返回int,用于判断是否增加成功等
/*
public int addBook(Book book);
//删除图书
public int delBook(int id);
//修改图书
public int updateBook(Book book);
*/
//查询图书
public Book queryBook(int id);
}
项目结构:
七、编写sql映射文件:
注意此sql映射文件对应于mapper接口.
在resources目录下新建mybatis/mapper目录,并在这个目录下新建BookMapper.xml文件:
注意:sql映射文件的位置是根据yml中的约定路径来写的。
注意:
1.namespace中需要与使用@Mapper的接口对应
2.BookMapper.xml文件名称必须与使用@Mapper的接口名一致
3.标签中的id必须与@Mapper的接口中的方法名一致,且参数一致
BookMapper.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">
<!--namespace对应mapper接口所在的位置-->
<mapper namespace="com.example.springbootmybatisdruid.mapper.BookMapper">
<!--对应mapper接口中的方法public Book queryBook(int id);-->
<select id="queryBook" resultType="book">
select * from t_book where id = #{id}
</select>
</mapper>
八、编写service层:
(1)service接口:service.BookService
service接口中不需要任何注解,只是一些方法的声明。
package com.example.springbootmybatisdruid.service;
import com.example.springbootmybatisdruid.entity.Book;
public interface BookService {
//复制mapper接口中的方法到这里
public Book queryBook(int id);
}
(2)写接口的实现类: service.impl.BookServiceImpl 实现刚才的接口BookService
注意:需要在接口实现类中使用@Service注解,才能被SpringBoot扫描,使用@Authwired/@Resource注入
package com.example.springbootmybatisdruid.service.impl;
import com.example.springbootmybatisdruid.entity.Book;
import com.example.springbootmybatisdruid.mapper.BookMapper;
import com.example.springbootmybatisdruid.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
@Override
public Book queryBook(int id) {
Book book = bookMapper.queryBook(id);
return book;
}
}
九、编写controller层:
controller.BookController:
package com.example.springbootmybatisdruid.controller;
import com.example.springbootmybatisdruid.entity.Book;
import com.example.springbootmybatisdruid.service.BookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController//返回json字符串
@Slf4j//日志打印
public class BookController {
@Autowired
private BookService bookService;//这里注入接口,实际使用的是实现类
//1.通过id获取book所有信息
// http://localhost:8080/queryBook/1(此处1为要获取的id)
@RequestMapping(value = "/queryBook/{id}",method = RequestMethod.GET)//使用restful风格传参数
public Book queryBook(@PathVariable("id") Integer id){
Book book = bookService.queryBook(id);
log.info("查询结果:{}",book);
return book;//@RestController使得返回的是book实体类的字符串形式
}
}
十、在启动类中添加对@MapperScan的扫描:
注意:如果启动类中使用了@MapperScan,可以在mapper接口中不用使用@Mapper注解
package com.example.springbootmybatisdruid;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.springbootmybatisdruid.mapper")//使用MapperScan批量扫描所有的Mapper接口;
public class SpringbootMybatisDruidApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisDruidApplication.class, args);
}
}
项目结构:
十、运行测试:
启动运行springboot项目:
看控制台打印:发现使用druid数据源:
浏览器测试:
控制台打印出:
附录(其他增删改查方法):
同理:测试新增等方法:
1.mapper.BookMapper接口:
@Mapper//指定这是一个操作数据库的mapper
@Repository
public interface BookMapper {
//增加,修改,删除图书,都返回int,用于判断是否增加成功等
public int addBook(Book book);
//删除图书
public int delBook(int id);
//修改图书
public int updateBook(Book book);
//查询图书
public Book queryBook(int id);
}
2.BookMapper.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">
<!--namespace对应mapper接口所在的位置-->
<mapper namespace="com.example.springbootmybatisdruid.mapper.BookMapper">
<!--对应mapper接口方法public void addBook(Book book);-->
<insert id="addBook" parameterType="book">
insert into t_book (name,author) values (#{name},#{author});
</insert>
<!--对应mapper接口方法public int delBook(int id);-->
<delete id="delBook" parameterType="integer">
delete from t_book where id = #{id};
</delete>
<!--对应mapper接口方法public int updataBook(Book book);-->
<update id="updateBook" parameterType="book">
update t_book
set name=#{name},author=#{author}
where id=#{id};
</update>
<!--对应mapper接口中的方法public Book queryBook(int id);-->
<select id="queryBook" resultType="book">
select * from t_book where id = #{id};
</select>
</mapper>
service接口:
public interface BookService {
//复制mapper接口中的方法到这里
public int addBook(Book book);
public int delBook(int id);
public int updateBook(Book book);
public Book queryBook(int id);
}
service实现类:
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
@Override
public int addBook(Book book) {
int i = bookMapper.addBook(book);
return i;
}
@Override
public int delBook(int id) {
int i = bookMapper.delBook(id);
return i;
}
@Override
public int updateBook(Book book) {
int i = bookMapper.updateBook(book);
return i;
}
@Override
public Book queryBook(int id) {
Book book = bookMapper.queryBook(id);
return book;
}
}
BookController:
@RestController//返回json字符串
@Slf4j//日志打印
public class BookController {
@Autowired
private BookService bookService;//这里注入接口,实际使用的是实现类
//1.通过id获取book所有信息
// http://localhost:8080/queryBook/1(此处1为要获取的id)
@RequestMapping(value = "/queryBook/{id}",method = RequestMethod.GET)//使用restful风格传参数
public Book queryBook(@PathVariable("id") Integer id){
Book book = bookService.queryBook(id);
log.info("查询结果:{}",book);
return book;//@RestController使得返回的是book实体类的字符串形式
}
//2.插入新用户,这里使用浏览器模拟发送get请求的一个实体类
//http://localhost:8080/addBook?name=西游记4&author=吴承恩4
@RequestMapping(value = "/addBook",method = RequestMethod.GET)//注意,实际开发中将这里改成POST
public String addBook(Book book){
int i = bookService.addBook(book);
if(i >= 1){
return "新增book成功";
}else {
return "新增book失败";
}
}
//通过id删除
//http://localhost:8080/delBook/8(此处8为要删除的id)
@RequestMapping(value = "/delBook/{id}",method = RequestMethod.GET)//使用restful风格传参数
public String delBook(@PathVariable("id") int id){
int i = bookService.delBook(id);
if(i >= 1){
return "刪除book成功";
}else {
return "刪除book失败";
}
}
//根据id更新book信息,这里使用浏览器模拟发送get请求的一个实体类
//http://localhost:8080/updateBook?id=12&name=西游记2&author=吴承恩2
@RequestMapping(value = "/updateBook",method = RequestMethod.GET )//注意,实际开发中将这里改成POST
public String updateBook(Book book){
log.info("前台参数book:{}",book);
int i = bookService.updateBook(book);
if(i >= 1){
return "修改book成功";
}else {
return "修改book失败";
}
}
}
测试:
发送get请求到后台:
更多推荐
所有评论(0)