package com.example.Demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.Demo.mapper") public class MybatisPlusStudyApplication { public static void main(String[] args) { SpringApplication.run(MybatisPlusStudyApplication.class, args); } }Mapper层:只需要继承接口
package com.example.Demo.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import com.example.Demo.pojo.User; import org.springframework.stereotype.Repository; @Repository public interface UserMapper extends baseMapper实体类:{ }
package com.example.Demo.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private Long id; private String name; private Integer age; private String email; }测试:
package com.example.Demo; import com.example.Demo.mapper.UserMapper; import com.example.Demo.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest class MybatisPlusStudyApplicationTests { @Autowired private UserMapper userMapper; @Test void contextLoads() { List配置文件:users = userMapper.selectList(null); users.forEach(System.out::println); } }
server.port=7099 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=root mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.id-type=auto mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0测试结果: 需要注意的一个问题: 注意:主启动类扫描所有接口 插入+主键生成策略: 一旦手动写id必须写setid
public enum IdType { AUTO(0),//数据库ID自增 NONE(1),//该类型为未设置主键类型 INPUT(2),//用户输入ID //该类型可以通过自己注册自动填充插件进行填充 //以下3种类型、只有当插入对象ID 为空,才自动填充。 ID_WORKER(3),//全局唯一ID (idWorker) UUID(4),//全局唯一ID (UUID) ID_WORKER_STR(5);//字符串全局唯一ID (idWorker 的字符串表示)CRUD *** 作:
package com.example.Demo; import com.example.Demo.mapper.UserMapper; import com.example.Demo.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest class MybatisPlusStudyApplicationTests { @Autowired private UserMapper userMapper; @Test void contextLoads() { List自动填充users = userMapper.selectList(null); users.forEach(System.out::println); } @Test public void testInstert(){ User user = new User(); user.setName("邓家佳"); user.setEmail("2534625115@qq.com"); user.setAge(3); int result = userMapper.insert(user); System.out.println(result); System.out.println(user); } @Test public void TestUpdate(){ User user = new User(); user.setId(9L); user.setName("范涛之"); int i = userMapper.updateById(user); System.out.println(i); } }
创建时间 . 修改时间! 这些个 *** 作都是自动化完成的,我们不希望手动更新! 阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化! 1:首先,新建字段写好注解:
package com.example.Demo.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.omg.CORBA.IDLType; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }2:编写处理器:
package com.example.Demo.handler; import com.baomidou.mybatisplus.core.handlers.metaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.metaObject; import org.springframework.stereotype.Component; import java.util.Date; @Slf4j @Component public class MyDataHandler implements metaObjectHandler { // 插入时的填充策略 @Override public void insertFill(metaObject metaObject) { log.info("开始执行插入........."); this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } // 更新时的填充策略 @Override public void updateFill(metaObject metaObject) { log.info("开始执行更新........."); this.setFieldValByName("updateTime",new Date(),metaObject); } }乐观锁的处理: 1:数据库添加字段默认为1: 实体类增加字段: 3:配置乐观锁插件:
// 注册乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }测试:乐观锁成功:单一线程 测试:乐观锁失败:
@Test public void TestClocker2() { // 线程一: //查询用户信息 User user = userMapper.selectById(5L); user.setName("kuangshen111"); user.setEmail("124621515@qq.com"); // 线程二:模拟另外一个用户执行插队 *** 作 User user2 = userMapper.selectById(5L); user2.setName("kuangshen222"); user2.setEmail("124621515@qq.com"); // 自旋锁尝试多次提交 userMapper.updateById(user2); //如果没有乐观锁就回覆盖插队线程的值 }查询 *** 作:批量查询
@Test public void TestSelect(){ List查询:按条件:适用Mapusers = userMapper.selectBatchIds(Arrays.asList(5, 6, 7)); users.forEach(System.out::println); }
@Test public void testTJ(){ HashMap分页查询: 1:配置分页插件:map = new HashMap<>(); // 自定义查询 map.put("name","邓家佳"); List users = userMapper.selectByMap(map); users.forEach(System.out::println); }
// 分页插件 @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置请求的页面大于最大页后 *** 作, true调回到首页,false 继续请求 默认false // paginationInterceptor.setOverflow(false); // 设置最大单页限制数量,默认 500 条,-1 不受限制 // paginationInterceptor.setLimit(500); return paginationInterceptor; }2:直接使用Page对象
@Test public void TestPage(){ // 参数一:当前页 参数二:页面大小 Page删除 *** 作:根据ID删除page = new Page<>(1,4); userMapper.selectPage(page,null); page.getRecords().forEach(System.out::println); }
@Test public void testDeleteById(){ userMapper.deleteById(12L); } public void testDeleteByBatchId(){ userMapper.deleteBatchIds(Arrays.asList(5L,8L,9L)); } */ public void testDeleteByMap(){ HashMap逻辑删除:map = new HashMap<>(); map.put("name","哈哈哈"); userMapper.deleteByMap(map); }
物理删除:从数据库中直接移除 逻辑删除: 在数据库中没有被移除,而是通过一个变量来让他失效! deleted=0=>deleted=1 1:数据库中增加字段:
2:实体类增加属性:@TableLogic private Integer deleted;3:配置组件:
// 逻辑删除组件 @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); }配置文件的修改:
# 配置逻辑删除 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0测试: 性能分析插件 1:增加插件:
@Bean @Profile({"dev","test"})// 设置 dev test 环境开启 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行 performanceInterceptor.setFormat(true); return performanceInterceptor; }配置文件增加:spring.profiles.active=dev 条件构造器:Wrapper 六个测试 手写一些复杂sql
package com.example.Demo; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.Demo.mapper.UserMapper; import com.example.Demo.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import java.util.Map; @SpringBootTest public class WrapperTest { @Autowired private UserMapper userMapper; @Test void TestWr(){ QueryWrapper代码自动生成器:wrapper = new QueryWrapper<>(); wrapper.isNotNull("name") .isNotNull("email") .ge("age",12); userMapper.selectList(wrapper).forEach(System.out::println); //和我们学习的map对比一下 } @Test void test2(){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("name","范涛之"); User user = userMapper.selectOne(wrapper); System.out.println(user); } @Test void test3(){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.between("age",20,30); Integer count = userMapper.selectCount(wrapper);//查询结果数 System.out.println(count); } @Test void test4(){ QueryWrapper wrapper = new QueryWrapper<>(); // 左和右:百分号在哪边 这个就相当于:t%也就是t开头 wrapper.notLike("name","范") .likeRight("email","t"); List
dao、pojo、service、controller都给我自己去编写完成! AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。 只需要改实体类名字 和包名 还有 数据库配置即可
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)