创建一个 Springboot项目
导入数据库驱动 MybatisPlus驱动 lombok 驱动
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
注意导入mybatisplus 就不要导入mybatis驱动 有可能会出现jar包冲突
springboot 配置文件配置数据库参数
# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
# 数据库用户名&密码:
spring.datasource.username=root
spring.datasource.password=root
Mysql 8 必须配置配置时区
驱动为 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
传统Mybatis
创建Mapper接口 创建mapper.xml文件
mybatisplus
继承 BaseMapper<User> 里面传要返回的泛型
注意 @MapperScan("com.huxin.mapper")主类添加这个注解扫描
配置日志查看底层sql的执行
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
控制台输出
实现增删改查
INSERT
User user = new User();
user.setAge(21);
user.setEmail("1111164@qq.com");
user.setName("周杰伦");
int insert = userMapper.insert(user);
System.out.println(insert);
System.out.println(user);
发现一个问题 我们并没有设置用户的id属性 但是还是吧这个用户插入进去 查看发现 mybatisplus帮我们自动添加了 id
主键生成策略(雪花算法)
https://zhuanlan.zhihu.com/p/85837641
如果要使用主键自增的话 使用在实体类的主键上注解@TableId(type = IdType.AUTO)
数据必须要设置主键自增
UPDATE
User user = new User();
user.setId(6l);
user.setAge(22);
user.setEmail("1111164@qq.com");
user.setName("21");
userMapper.updateById(user);
System.out.println(user);
updateById(user) 传入User对象 会自动拼接Sql
自动填充处理
数据库添加二个字段
实体类中也相应的添加二个属性
private Date createTime; private Date updateTime;
在需要填充的属性上添加二个注解
@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT_UPDATE)
创建一个配置类实现MetaObjectHandler接口 重写
insertFill() updateFill()二个方法
注意别忘记在类上添加注释@Component 吧类放入ioc容器中
乐观锁
乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁适用于读多写少的场景,这样可以提高程序的吞吐量。
首先在数据库中添加字段
实体类中添加相对应的属性和注解 注意导包是导的mybatisplus的包
注册组件 新建一个类
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
测试
void testOptimisticLockerEeor(){
User user = userMapper.selectById(1);
user.setName("胡鑫修改2");
user.setAge(22);
new Thread(new Runnable() {
@Override
public void run() {
User user2 = userMapper.selectById(1);
user2.setName("胡鑫新线程");
user2.setAge(21);
userMapper.updateById(user2);
}
}).start();
userMapper.updateById(user);
}
新建一个线程修改 发现
修改的数据还是新线程里面执行并没有被覆盖
select 查询
查询一个用户
selectById() 传入id 根据id查找一个用户 返回一个实体类
User user = userMapper.selectById(1);
批量查询用户
传入一个数组返回一个泛型实体类的list集合
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
条件查询
HashMap<String, Object> map = new HashMap<>();
//自定义要查询的条件
map.put("name","周杰伦");
map.put("id","1425279305811439617");
List<User> users = userMapper.selectByMap(map);
map里传入想要查询的条件放进selectByMa()里返回一个泛型为User的一个集合
分页
配置类里配置
@Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); }
/参数 1:当前页 //参数 2:页面大小 Page<User> page = new Page<>(1,2); Page<User> userPage = userMapper.selectPage(page, null);
page.getTotal()查询一共多少条数据
Delete 删除
userMapper.deleteById(1425279305811439618l);根据id删除
userMapper.deleteBatchIds(Arrays.asList(1,2,3));批量删除
HashMap<String, Object> map = new HashMap<>(); //删除的条件 map.put("name","周杰伦"); userMapper.deleteByMap(map); 根据map传参删除
逻辑删除 (伪删除)
现在数据库表中增加字段deletede
实体类中添加属性添加注解即可 不需要在配置类中配置
在配置文件中
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0
查看了一下sql执行记录 发现走的是update语句 只是修改了字段
但我们执行查询这条语句并不能查询到
因为查询的时候后面给我们拼接了一个字符串
条件构造器 wrapper
查询某个字段不为空并且age大于21
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper .isNotNull("email") .isNotNull("name")//该字段不为空的的 .ge("age",21);//年龄大于20 userMapper.selectList(wrapper).forEach(System.out::println);
查询 name =胡鑫的单条数据
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name","胡鑫"); System.out.println(userMapper.selectOne(wrapper));
查询年龄在20-30岁之间的数 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.between("age",20,30); System.out.println(userMapper.selectCount(wrapper));
模糊查询 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.notLike("name","周"); List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); maps.forEach(System.out::println);
//子查询 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.inSql("id","select id from user where id<3") ; List<Object> objects = userMapper.selectObjs(wrapper); for (Object object : objects) { System.out.println(object); }
//通过id排序查询 QueryWrapper<User> wrapper = new QueryWrapper<>(); //wrapper.orderByDesc("id");//降序 wrapper.orderByAsc("id");//升序 userMapper.selectList(wrapper).forEach(System.out::println);