MyBatis-Plus详解(环境搭建、关联操作)

MyBatis-Plus详解(环境搭建、关联操作)

目录

MyBatis-Plus

Mybatis --- 环境搭建

1、导入相关依赖

2、创建实体类

3、在 resources 目录下,创建 application.yml 配置文件

4、创建业务接口

5、创建 mapper 接口

6、书写业务接口实现类

7、测试类

分页查询

1、创建配置类,定义数据库 SQL 语句的方言。Mybatis-plus会根据配置的方言,产生分页的 SQL 语句

2、定义业务接口方法

3、定义 mapper 接口

4、书写业务方法

5、测试类

Mybatis-plus 关联操作

一对多:

1、创建实体类

注意:如果一个属性没有对应的列,必须加上@TableField(exist = false)。否则,maybatis-plus会认为数据库表中有一个和该属性同名列。

2、建立业务接口

3、建立 Mapper 接口

4、书写 mapper 文件

IDeptMapper:

IEmployeeMapper:

5、书写业务方法

统计查询记录数

MyBatis-Plus

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

官网 MyBatis-Plus

连接池: 传统开发中,每一次请求都要建立一次数据库连接。每一次数据库连接,使用完后都得断开。频繁的数据库连接操作势必占用很多的系统资源,响应速度必定下降。另外,在高并发时,系统资源被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

解决方案: 为数据库连接建立一个“缓冲池”(连接池)。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕再放回去。通过设定连接池最大连接数来防止系统无休止的数据库连接。

工作流程: 当客户端请求服务器,服务器需要使用连接对象操作数据库的数据。这时,需要从连接池中申请一个连接对象。连接池会分配一个空闲连接给该客户。如果连接池中没有空闲连接,就看有没有到达最大连接数。如果没有到达最大连接数,就创建新连接分配给客户。如果已经到达最大连接,那么,请求用户会等待一段时间,在等待时间内,有连接对象被释放,则分配给等待用户。等待时间结束后,还没有连接被释放,则返回null。

Mybatis --- 环境搭建 1、导入相关依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> ​ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.9</version> </dependency> </dependencies> 2、创建实体类 //声明该实体类映射的表名 @TableName("t_product") public class ProductBean { //表示该列为主键列,value表示该列映射的列名 //type = IdType.AUTO 表示该列的值使用自动增长列生成 @TableId(value = "pk_productId",type = IdType.AUTO) private Integer id; //指定当前属性映射的列名 @TableField("p_name") private String name; ​ @TableField("p_createDate") private LocalDate createDate; ​ @TableField("p_price") private Integer price; } 3、在 resources 目录下,创建 application.yml 配置文件 spring: datasource: driver-class-name: com.mysql.jdbc.Driver #定义配置驱动类 username: root #mysql登录用户名 password: 123 #mysql登录密码 url: jdbc:mysql://localhost:12345/shopDB?characterEncoding=utf8&allowMultiQueries=true type: com.alibaba.druid.pool.DruidDataSource #配置连接池 druid: one: max-active: 100 #最大连接数 min-idle: 20 #最小连接数 max-wait: 2000 #超时时间(ms) ​ ​ mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #配置日志 type-aliases-package: com.project.bean #实体类所在包,允许用实体类类名作为别名 mapper-locations: classpath:*/*Mapper.xml #链接 mapper文件 4、创建业务接口 public interface IProductService { ​ public void add(ProductBean productBean); public void del(Integer id); public void update(Integer id,Integer price); public List<ProductBean> findAll(); public ProductBean findById(Integer id); public List<ProductBean> findByItem(String name, LocalDate startDate,LocalDate endDate); } 5、创建 mapper 接口 @Mapper public interface IProductMapper extends BaseMapper<ProductBean> { } 6、书写业务接口实现类 @Service @Transactional//该类所有方法支持事务 public class ProductServiceImpl implements IProductService { @Autowired private IProductMapper mapper; @Override public void add(ProductBean productBean) { mapper.insert(productBean);//添加实体数据 } ​ @Override public void del(Integer id) { mapper.deleteById(id);//根据id删除实体数据 } ​ @Override public void update(Integer id, Integer price) { ProductBean productBean = new ProductBean(); productBean.setId(id); productBean.setPrice(price); mapper.updateById(productBean);//按id修改实体属性 } ​ @Override public List<ProductBean> findAll() { return mapper.selectList(null);//查询所有 } ​ @Override public ProductBean findById(Integer id) { return mapper.selectById(id);//按id查询实体对象 } ​ @Override public List<ProductBean> findByItem(String name, LocalDate startDate, LocalDate endDate) { QueryWrapper<ProductBean> qw = new QueryWrapper<>();//条件集合 if (name != null && name.length() != 0){ qw.like("p_name",name);//like 模糊查询 } if (startDate != null){ qw.ge("p_creatDate",startDate);//ge 大于等于 } if (endDate != null){ qw.le("p_createDate",endDate);//le 小于等于 } return mapper.selectList(qw);//按条件查询 } } 7、测试类 @RunWith(SpringRunner.class) @SpringBootTest(classes = Main.class)//启动类类模板 public class ProductTest { @Autowired private IProductService service; ​ @Test public void test(){ // service.add(new ProductBean("999感冒灵", LocalDate.parse("2022-06-06"),18)); System.out.println(service.findAll()); } } 分页查询 1、创建配置类,定义数据库 SQL 语句的方言。Mybatis-plus会根据配置的方言,产生分页的 SQL 语句 @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor( new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } ​} 2、定义业务接口方法 /** * 动态条件分页查询 * @param pageNO 页码 * @param name 姓名 * @param startDate 生产起始日期 * @param endDate 生成结束日期 * @return 分页对象 */ public IPage<ProductBean> findByItem(Integer pageNO, String name, LocalDate startDate,LocalDate endDate); 3、定义 mapper 接口 @Mapper public interface IProductMapper extends BaseMapper<ProductBean> { } 4、书写业务方法 @Override public IPage<ProductBean> findByItem(Integer pageNO, String name, LocalDate startDate, LocalDate endDate) { QueryWrapper<ProductBean> qw = new QueryWrapper<>(); if (name != null && name.length() != 0){ qw.like("p_name",name); } if (startDate != null){ qw.ge("p_createDate",startDate); } if (endDate != null){ qw.le("p_createDate",endDate); } return mapper.selectPage(new Page(pageNO,3),qw); } 5、测试类 @RunWith(SpringRunner.class) @SpringBootTest(classes = PlusMain.class) public class Test { @Autowired private IProductService service; @org.junit.Test public void test(){ // System.out.println(service.findAll()); IPage ip = service.findByItem(1,"",null,null); System.out.println(ip.getRecords()//得到当前数据 +" "+ip.getTotal()//得到总记录数 +" "+ip.getPages()//总页数 +" "+ip.getCurrent()//得到页码 +" "+ip.getSize()//得到每页记录数 ); } } Mybatis-plus 关联操作 一对多: 1、创建实体类 /** * 部门实体类 */ @TableName("t_dept") public class DeptBean { @TableId(value = "pk_deptId",type = IdType.AUTO) private Integer id; ​ @TableField("d_name") private String name; ​ @TableField(exist = false)//标识该属性没有对应的列 private Integer emNum; ​ @TableField(exist = false)//标识该属性没有对应的列 private List<EmployeeBean> emList; } /** * 员工实体类 */ @TableName("t_employee") public class EmployeeBean { @TableId(value = "pk_emId",type = IdType.AUTO) private Integer id; @TableField("e_name") private String name; @TableField("e_job") private String job; @TableField("e_birthday") private LocalDate birthday; @TableField("fk_deptId") private Integer deptId; @TableField(exist = false) private DeptBean dept; } 注意:如果一个属性没有对应的列,必须加上@TableField(exist = false)。否则,maybatis-plus会认为数据库表中有一个和该属性同名列。 2、建立业务接口 /** *部门业务接口 */ public interface IDeptService { /** * 查询所有部门,同时统计每个部门的人数 * @return 部门集合 */ public List<DeptBean> findAll(); ​ /** * 级联添加,添加部门,同时添加该部门的员工集合 * @param dept 部门对象 * @param emList 新员工集合 */ public void add(DeptBean dept, List<EmployeeBean> emList); ​ /** * 删除部门,同时级联删除部门的员工 * @param id 部门ID */ public void delCasede(Integer id); ​ /** * 删除部门,同时将该部门员工外键设置为null * @param id 部门ID */ public void delSerNull(Integer id); ​ /** * 按id查询部门,同时查询该部门中所有的员工 * @param id 部门id * @return 部门对象 */ public DeptBean findById(Integer id); } /** * 员工业务接口 */ public interface IEmployeeService { /** * 添加员工 * @param employee 员工对象 */ public void add(EmployeeBean employee); ​ /** * 动态条件分页查询,同时查询每个员工所在部门的名称 * @param pageNO 页码 * @param deptName 部门名称 * @param name 员工姓名 * @return 分页对象 */ public IPage<EmployeeBean> findByItem(Integer pageNO, String deptName,String name); ​ /** * 按id查询员工,同时查询员工的部门信息 * @param id 员工编号 * @return 员工对象33 */ public EmployeeBean findById(Integer id); } 3、建立 Mapper 接口 /** *部门 mapper 接口 */ @Mapper public interface IDeptMapper extends BaseMapper<DeptBean> { @Select("SELECT d.*,COUNT(e.`pk_emId`) emNum FROM t_dept d LEFT JOIN t_employee e ON d.`pk_deptId`=e.`fk_deptId`\n" + "GROUP BY d.`pk_deptId`") @ResultMap("deptMap") public List<DeptBean> findAll(); ​ @Delete("delete from t_employee where fk_deptId=#{id};" + "delete from t_dept where pk_deptId=#{id};") public void delCasede(Integer id); ​ @Delete("update t_employee set fk_deptId=null where fk_deptId=#{id};" + "delete from t_dept where pk_deptId=#{id};") public void delSetNull(Integer id); } /** *员工 mapper 接口 */ @Mapper public interface IEmployeeMapper extends BaseMapper<EmployeeBean> { ​ public void addMore(@Param("deptId") Integer deptId, @Param("emList") List<EmployeeBean> emList); ​ public IPage<EmployeeBean> findByItem(Page pageNO, @Param("deptName") String deptName,@Param("name") String name); ​ }

对于联表查询的结果集,动态条件查询、循环,都需要在 mapper 文件中完成。

4、书写 mapper 文件 IDeptMapper: <mapper namespace="com.project.mapper.IDeptMapper"> <resultMap id="deptMap" type="DeptBean"> <id property="id" column="pk_deptId"></id> <result property="name" column="d_name"></result> <result property="emNum" column="emNum"></result> </resultMap> </mapper> IEmployeeMapper: <mapper namespace="com.project.mapper.IEmployeeMapper"> <insert id="addMore"> insert into t_employee (e_name,e_job,e_birthday,fk_deptId) values <foreach collection="emList" item="em" separator=","> (#{em.name},#{em.job},#{em.birthday},#{deptId}) </foreach> </insert> ​ <resultMap id="emMap" type="EmployeeBean"> <id column="pk_emId" property="id"></id> <result column="e_name" property="name"></result> <result column="e_job" property="job"></result> <result column="e_birthday" property="birthday"></result> <result column="d_name" property="dept.name"></result> </resultMap> ​ <select id="findByItem" resultMap="emMap"> select e.*,d.d_name from t_dept d,t_employee e where d.pk_deptId=e.fk_deptId <if test="deptName != null and deptName != '' "> and d_name like "%"#{deptName}"%" </if> <if test="name != null and name != '' "> and e_name like "%"#{name}"%" </if> </select> </mapper> 5、书写业务方法 /** * 部门业务方法 */ @Service @Transactional public class DeptServiceImpl implements IDeptService { ​ @Autowired private IDeptMapper deptMapper; @Autowired private IEmployeeMapper employeeMapper; ​ @Override public List<DeptBean> findAll() { return deptMapper.findAll(); } ​ @Override public void add(DeptBean dept, List<EmployeeBean> emList) { deptMapper.insert(dept); employeeMapper.addMore(dept.getId(),emList); } ​ @Override public void delCasede(Integer id) { deptMapper.delCasede(id); } ​ @Override public void delSerNull(Integer id) { deptMapper.delSetNull(id); } ​ @Override public DeptBean findById(Integer id) { DeptBean dept = deptMapper.selectById(id); QueryWrapper<EmployeeBean> qw = new QueryWrapper<>(); qw.eq("fk_deptId",id); dept.setEmList(employeeMapper.selectList(qw)); return dept; } } /** * 员工业务方法 */ @Service @Transactional public class EmployeeServiceImpl implements IEmployeeService { @Autowired IEmployeeMapper employeeMapper; @Autowired IDeptMapper deptMapper; @Override public void add(EmployeeBean employee) { employeeMapper.insert(employee); } ​ @Override public IPage<EmployeeBean> findByItem(Integer pageNO, String deptName, String name) { return employeeMapper.findByItem(new Page(pageNO,3),deptName,name); } ​ @Override public EmployeeBean findById(Integer id) { EmployeeBean em = employeeMapper.selectById(id); em.setDept(deptMapper.selectById(em.getDeptId())); ·· return em; } } 统计查询记录数 QueryWrapper<StudentBean> qw = new QueryWrapper<>(); qw.eq("fk.classId",classId); Integer num = studentMapper.selectCount(qw);

到此这篇关于MyBatis-Plus详解的文章就介绍到这了,更多相关MyBatis-Plus详解内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    金蝶担保机构业务管理系统

    金蝶担保机构业务管理系统,,1.金蝶财务软件怎么使用?软件使用方法 使用需要先登陆到数据库,可只导出V3数据或只导出最新年度数据。功能介绍

    酷睿I7 配置

    酷睿I7 配置,配置,玩家国度啦华硕 Rampage II Extreme(3800元)如果米不够,也可以把Extreme改为Gene,不过是小板内存推荐金士顿6G DDR3 2000骇

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    查看配置:酷睿i3530集展示办公平台

    查看配置:酷睿i3530集展示办公平台,,由于时间和精力的关系,我们不可能对所有的配置进行评论,希望我们能理解,我希望我们的评论能在那些需要帮

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    公共CPU接口类型的详细描述

    公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的处理速度直接决定电脑的性能, 那你知道CPU发展到现在, 都那些CPU接口类型吗.