目录
1.加入日志功能
在通过mybatis-plus为我们生成的代码后我们可以查询到我们MySQL中的数据库,但是如何查看SQL语句呢,这时候我们就需要加入日志功能。(这里的配置需要在我们之前的application.yml中进行配置)。
在application.yml中添加配置(org.apache.ibatis.logging.stdout.StdOutImpl),然后运行我们可以看到所执行的SQL语句。
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
username: root
password: abc123
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
执行结果和SQL语句展示:
2.编写代码
d.添加mapper
我们知道在MyBaties中mapper中的方法以及SQL语句都是需要自己去编写的,而MyBaties-plus的作用就是给我们提供了跟简洁的方法,我们只需要将UserMapper接口继承BaseMapper即可,我们可以看到BaseMapper是有泛型的,而且泛型里面包含一个实体类的类型,而此时我们的实体类型是User类。
package com.atzeren.mybatiesplus.mapper;
import com.atzeren.mybatiesplus.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper <User>{
}
之后在Spring Boot启动类中添加@MapperScan注解,扫描mapper包
package com.atzeren.mybatiesplus;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//扫描mapper接口所在的包
@MapperScan("com.atzeren.mybatiesplus.mapper")
public class MybatiesplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatiesplusApplication.class, args);
}
}
基本CRUD(在MybatisPlusTest中进行测试)
测试BaseMapper中的添加功能
@Test
public void testInsert(){
//实现新增用户信息
//INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
User user = new User();
user.setName("大仙");
user.setAge(34);
user.setEmail("Zhangsan@zrj.com");
int result = userMapper.insert(user);
System.out.println("result:"+result);
System.out.println("id:"+user.getId());
}
我们看到id的增加并不是顺序的增加,而是生成了一个很长的数据,这就是之前id为什么要使用BigInt的原因了,具体为什么是因为使用了雪花算法自动生成的id。(我们这里的中文编码显示是有问题的,这个需要修改IDEA默认编码为UTF-8,我们后面已经修改)。
这样我们向MySQL中输入的语句才不会出现乱码问题。
测试BaseMapper中的删除功能
根据id进行删除(deleteById)
接下来我们尝试将这些中文乱码的数据根据ID进行删除,但是我们发现放入ID之后我们的IDEA会报一个错,这时因为根据雪花算法得到的ID长度已经超过了int 的范围了,所以需要在后面添加一个L。
@Test
public void testDelete(){
userMapper.deleteById(1590888429762240514L);//数据长度超过了我们的int范围,添加L表示这是一个Long类型的数据
userMapper.deleteById(1590892685902761985L);
userMapper.deleteById(1590894027761336322L);
userMapper.deleteById(1590894230195191809L);
userMapper.deleteById(1590898437178601474L);
}
运行这个测试类得到如下测试结果:
2022-11-11 11:02:10.672 INFO 13004 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-11-11 11:02:10.927 INFO 13004 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@599316979 wrapping com.mysql.cj.jdbc.ConnectionImpl@7f353d99] will not be managed by Spring
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1590888429762240514(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a230001]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e74a380] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1842463725 wrapping com.mysql.cj.jdbc.ConnectionImpl@7f353d99] will not be managed by Spring
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1590892685902761985(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e74a380]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@55e42449] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@240641494 wrapping com.mysql.cj.jdbc.ConnectionImpl@7f353d99] will not be managed by Spring
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1590894027761336322(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@55e42449]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@78054f54] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@213383793 wrapping com.mysql.cj.jdbc.ConnectionImpl@7f353d99] will not be managed by Spring
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1590894230195191809(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@78054f54]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4b6e1c0] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1444635117 wrapping com.mysql.cj.jdbc.ConnectionImpl@7f353d99] will not be managed by Spring
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1590898437178601474(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4b6e1c0]
2022-11-11 11:02:11.006 INFO 13004 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2022-11-11 11:02:11.015 INFO 13004 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
再次查看SQLyog中的数据发现刚刚删除的数据已经不见了,这说明我们根据ID进行删除的操作成功了。
根据Map集合进行删除(deleteByMap)
@Test
public void testDelete(){
// 根据map集合中设置的条件删除用户信息(map集合中的信息必须全部匹配才能删除成功)
// DELETE FROM user WHERE name = ? AND age = ?
Map<String,Object> map = new HashMap<>();
map.put("name","大仙");
map.put("age",34);
int result = userMapper.deleteByMap(map);
System.out.println("result:"+result);
}
进行批量删除(deleteBatchIds)
@Test
public void testDelete(){
// 通过多个id实现批量删除
// DELETE FROM user WHERE id IN ( ? , ? , ? )
List<Long> list = Arrays.asList(1L, 2L, 3L);
int result = userMapper.deleteBatchIds(list);
System.out.println("result:"+result);
}
操作完成后我们数据库中也只剩下两条数据了。
修改数据(updateById)
@Test
public void testUpdateById(){
//修改用户信息
//UPDATE user SET name=?, age=? WHERE id=?
User user = new User();
user.setId(4L);
user.setName("张三");
user.setEmail("atJxau@zrj.com");
int result = userMapper.updateById(user);
System.out.println("受影响行数:"+result);
}
JDBC Connection [HikariProxyConnection@2004305265 wrapping com.mysql.cj.jdbc.ConnectionImpl@277b8fa4] will not be managed by Spring
==> Preparing: UPDATE user SET name=?, email=? WHERE id=?
==> Parameters: 张三(String), atJxau@zrj.com(String), 4(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2d0ecb24]
受影响行数:1
我们可以看到年龄是没有进行修改的。
根据id查询用户数据(selectById)
@Test
public void testSelectById(){
//根据id查询用户信息
//SELECT id,name,age,email FROM user WHERE id=?
User user = userMapper.selectById(4L);
System.out.println(user);
}
==> Preparing: SELECT id,name,age,email FROM user WHERE id=?
==> Parameters: 4(Long)
<== Columns: id, name, age, email
<== Row: 4, 张三, 21, atJxau@zrj.com
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a230001]
User(id=4, name=张三, age=21, email=atJxau@zrj.com)
根据多个id查询多个用户信息(selectBatchIds)
@Test
public void testSelectBatchIds(){
//根据多个id查询多个用户信息
//SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
List<Long> idList = Arrays.asList(4L, 5L);
List<User> list = userMapper.selectBatchIds(idList);
list.forEach(System.out::println);
}
基本CRUD的总结:
本文使用的是MySql8.0环境,之前的8.0和5.7同时存在让我误以为我使用的是MySql8.0,在通过重装MySQL之后终于连接成功了。
本文是博主在学习mybatisplus中的笔记,如有错误欢迎指正。