创建springboot项目
这里可以选择MySQL坐标,也可以不选然后自己手动添加
添加依赖
com.baomidou
mybatis-plus-boot-starter
3.5.0
mysql
mysql-connector-java
runtime
com.alibaba
druid-spring-boot-starter
1.2.9
org.projectlombok
lombok
在application.yml中配置数据库
server:
port: 8080
servlet:
context-path: /
spring:
datasource:
druid: #数据源使用druid
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=UTF-8&useJDBC49CompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
username: root
password: root
使用Lombok创建实体类
Book实体类:
@Data
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}
使用Mybatis-Plus创建dao层方法
使用继承 BaseMapper<实体类>
的方法,mp帮我们就创建了常用的sql
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.domain.Book;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BookMapper extends BaseMapper {
}
附:使用到的数据库的创建语句:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 739889170 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
@Autowired
private BookMapper bookMapper;
//测试查询
@Test
void testGetById(){
System.out.println(bookMapper.selectById(3));
}
//测试查询所有
@Test
void testGetAll(){
System.out.println(bookMapper.selectList(null));
}
//测试保存
@Test
void testSave(){
Book book = new Book();
book.setName("汤家凤2023考研高数辅导书");
book.setType("考研");
book.setDescription("2023考研高数汤家凤");
bookMapper.insert(book);
}
//测试修改
@Test
void testUpdate(){
Book book = new Book();
book.setId(739889166);
book.setType("数学");
bookMapper.updateById(book);
}
//测试删除
@Test
void testDelete(){
bookMapper.deleteById(739889166);
}
mybatis-plus执行时对于id的处理默认是使用雪花算法随机生成id,但是我们在数据库表中给id设置的是自增(没有生效),设置默认使用数据库id自增策略的方式有两种
1.在application.yml配置文件中配置:
mybatis-plus:
global-config:
db-config:
id-type: auto #使用数据库默认id自增策略
2.在实体类中使用注解@TableId(value = "id",type = IdType.AUTO)
配置
//lombok
@Data // = @Getter+@Setter
public class Book {
@TableId(value = "id",type = IdType.AUTO)
private Integer id;
private String type;
private String name;
private String description;
}
mybatis-plus执行时,默认是不显示执行过程以及执行的sql语句的,这样调试时很是不方便,所以要打开日志功能
在application.yml中开启mybatis-plus日志,设置日志显示方式为打印在控制台,配置代码如下:
mybatis-plus:
global-config:
db-config:
id-type: auto #使用数据库默认id自增策略
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #日志打印到控制台
执行效果(显示完整的执行过程):
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1e4c6583] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@76fe6cdc] will not be managed by Spring
==> Preparing: SELECT id,type,name,description FROM book
==> Parameters:
<== Columns: id, type, name, description
<== Row: -2019983359, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -1986453503, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -304508927, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 1, 科技, Java编程思想, Java学习教程
<== Row: 2, 科技, C++ primer plus, C++学习教程
<== Row: 3, 人文, 阿甘正传, 在工作中学习
<== Row: 4, 考研, 张宇高数18讲, 考研高数复习资料----张宇
<== Row: 5, 考研, 句句真研, 田静考研英语
<== Row: 739889167, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889168, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889169, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Total: 11
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1e4c6583]
IPage ipage = new Page(2,5);
//执行分页查询
bookMapper.selectPage(ipage,null);
在启动类的同级或上一级目录下新建config包,在config包中新建一个类命名为MPConfig.java(可以自己随意命名)
在MPConfig中定义分页需要的拦截器,该拦截器会在执行查询时在sql语句后面添加LIMIT ?,?
@Configuration
public class MPConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1.定义mp拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2.添加指定的拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
测试分页:
测试代码:
@Test
void testGetPage(){
IPage ipage = new Page(2,5);
//执行分页查询
bookMapper.selectPage(ipage,null);
System.out.println("当前页为: "+ipage.getCurrent());
System.out.println("每一页的条数 "+ipage.getSize());
System.out.println("表中数据总条数: "+ipage.getTotal());
System.out.println("一共的页数: "+ipage.getPages());
System.out.println("查到的数据: "+ipage.getRecords());
}
测试结果:
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1acb74ad] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@21263314] will not be managed by Spring
==> Preparing: SELECT COUNT(*) AS total FROM book
==> Parameters:
<== Columns: total
<== Row: 11
<== Total: 1
==> Preparing: SELECT id,type,name,description FROM book LIMIT ?,?
==> Parameters: 5(Long), 5(Long)
<== Columns: id, type, name, description
<== Row: 3, 人文, 阿甘正传, 在工作中学习
<== Row: 4, 考研, 张宇高数18讲, 考研高数复习资料----张宇
<== Row: 5, 考研, 句句真研, 田静考研英语
<== Row: 739889167, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889168, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Total: 5
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1acb74ad]
当前页为: 2
每一页的条数 5
表中数据总条数: 11
一共的页数: 3
查到的数据: [Book(id=3, type=人文, name=阿甘正传, description=在工作中学习), Book(id=4, type=考研, name=张宇高数18讲, description=考研高数复习资料----张宇), Book(id=5, type=考研, name=句句真研, description=田静考研英语), Book(id=739889167, type=考研, name=汤家凤2023考研高数辅导书, description=2023考研高数汤家凤), Book(id=739889168, type=考研, name=汤家凤2023考研高数辅导书, description=2023考研高数汤家凤)]
@Test
void testGetBy(){
//1.新建QueryWrapper对象,Book是实体类
QueryWrapper qw = new QueryWrapper<>();
//2.条件
qw.like("type","考研");
//3.根据条件查询
bookMapper.selectList(qw);
}
运行结果:
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7cac93fe] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@65a9ea3c] will not be managed by Spring
==> Preparing: SELECT id,type,name,description FROM book WHERE (type LIKE ?)
==> Parameters: %考研%(String)
<== Columns: id, type, name, description
<== Row: -2019983359, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -1986453503, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -304508927, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 4, 考研, 张宇高数18讲, 考研高数复习资料----张宇
<== Row: 5, 考研, 句句真研, 田静考研英语
<== Row: 739889167, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889168, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889169, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Total: 8
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7cac93fe]
@Test
void testGetBy2(){
//1.新建QueryWrapper对象
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//2.条件
lqw.like(Book::getType,"汤家凤");
//3.根据条件查询
bookMapper.selectList(lqw);
}
运行结果:
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2f14b0f6] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4c6b4ed7] will not be managed by Spring
==> Preparing: SELECT id,type,name,description FROM book WHERE (name LIKE ?)
==> Parameters: %汤家凤%(String)
<== Columns: id, type, name, description
<== Row: -2019983359, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -1986453503, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -304508927, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889167, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889168, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889169, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Total: 6
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2f14b0f6]
使用LambdaQueryWrapper进行查询时,当参数为空时会出现错误,例如:
@Test
void testGetBy2(){
String name=null;
//1.新建QueryWrapper对象
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//2.条件
lqw.like(Book::getName,name);
//3.根据条件查询
bookMapper.selectList(lqw);
}
运行结果:
解决办法:判断参数是否为空
@Test
void testGetBy2(){
String name=null;
//1.新建QueryWrapper对象
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//2.条件
//if(name!=null) lqw.like(Book::getName,name); //第一种解决参数为空的办法
//第二种解决参数为空的方法
lqw.like(name != null,Book::getName,name);
//3.根据条件查询
bookMapper.selectList(lqw);
}
执行结果:(sql语句后面没有连接条件)
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4ace284d] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@73aeef7d] will not be managed by Spring
==> Preparing: SELECT id,type,name,description FROM book
==> Parameters:
<== Columns: id, type, name, description
<== Row: -2019983359, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -1986453503, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: -304508927, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 1, 科技, Java编程思想, Java学习教程
<== Row: 2, 科技, C++ primer plus, C++学习教程
<== Row: 3, 人文, 阿甘正传, 在工作中学习
<== Row: 4, 考研, 张宇高数18讲, 考研高数复习资料----张宇
<== Row: 5, 考研, 句句真研, 田静考研英语
<== Row: 739889167, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889168, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Row: 739889169, 考研, 汤家凤2023考研高数辅导书, 2023考研高数汤家凤
<== Total: 11
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4ace284d]
对应的条件可以在官网查询:
https://baomidou.com/pages/10c804/#abstractwrapper
IService<要操作的实体类>
ServiceImpl<数据层接口, 要操作的实体类>
业务层接口:
public interface IBookService extends IService {
/*
自定义的方法
*/
Boolean saveBook(Book book);
Boolean modify(Book book);
Boolean deleteById(Integer id);
}
业务层实现类
@Service
public class IBookServerImpl extends ServiceImpl implements IBookService {
//自定义方法的实现
@Autowired
private BookMapper bookMapper;
@Override
public Boolean saveBook(Book book) {
return bookMapper.insert(book)>0;
}
@Override
public Boolean modify(Book book) {
return bookMapper.updateById(book)>0;
}
@Override
public Boolean deleteById(Integer id) {
return bookMapper.deleteById(id)>0;
}
}
数据层接口及实现
@Mapper
public interface BookMapper extends BaseMapper {
}