SpringBoot整合Mybaits-Plus
一、Mybatis-Plus:
Mybatis-Plus(opens new window)(简称 MP)是一个的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网地址:https://baomidou.com/pages/24112f/
二、Mybatis-Plus入门案例
项目结构:
2.1 导入jar包
<dependencies> <!--引入jdbc包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入mysql包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--引入mybatisplus包,要删除mybatis的依赖,要不然造成冲突--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency>
<!--引入junit包,--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
<!--引入lombok包,--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
2.2 application.yml配置文件
server: port: 8090 servlet: #项目默认发布路径/根目录 context-path: / #SpringBoot数据源配置 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: 123456 #SpringBoot整合Mybatis-plus mybatis-plus: #定义别名包 作用: 以后封装POJO对象时自动进行拼接 type-aliases-package: com.zy.demo.pojo #引入mapper配置文件 mapper-locations: classpath:/mapper/*.xml #开启驼峰映射 configuration: map-underscore-to-camel-case: true
2.3 实体类 pojo
package com.zy.demo.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @Data //动态添加get/set/tostring/equals等方法 @AllArgsConstructor //添加构造方法 @NoArgsConstructor // 添加无参构造 @Accessors(chain = true) //引入链式加载方法 @TableName("user") //和表关联 引入表名 //规则:如果字段名称与属性一致(包含拖放规则),则可以省略不写 public class User implements Serializable{ @TableId(type = IdType.AUTO) //IdType.AUTO 标识主键 id自增 private Integer id; private String name; private Integer age; private String sex; }
2.4 UserDao.xml 文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
//namespace是mybatis映射文件的唯一标识,与接口对应
<mapper namespace="com.zy.demo.dao.UserDao">
//id是接口对应的方法,resultType 返回值结果类型
<select id="findAll" resultType="User"> select * from user </select> </mapper>
2.5 接口 UserDao.java
package com.zy.demo.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zy.demo.pojo.User; import java.util.List;
/*
mybatis的写法
//@Mapper //为接口创建代理的对象 交给spring管理
public interface UserMapper {
//查询全部用户数据 两种方法:注解或者xml方法
List<User> findAll();
}
*/
//在对应的dao接口上 加上BaseMapper<T> T是对应的pojo类
public interface UserDao extends BaseMapper<User> {
List<User> findAll();
}
2.6 在启动上加上@mapperScan注解,用于扫描dao文件夹
2.7 使用测试类@Test注解进行测试
package com.zy.demo; import com.zy.demo.dao.UserDao; import com.zy.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 DemoApplicationTests { //动态注入mapper接口实例化对象 @Autowired //依赖注入 1、按照类型注入 2、按照名称注入 //@Qualifier("注入属性的名称") private UserDao userDao; @Test public void TestMybatis(){ final List<User> users = userDao.findAll(); System.out.println(users); } }
结果:
三、CRUD操作
插入数据操作:
@Test /*插入数据*/ public void inset(){ User user = new User(); user.setName("金钱豹").setAge(10).setSex("男"); userDao.insert(user); }
查询数据操作:
@Test /*查询 : * 1、根据id查询 id=5*/ public void selectByid(){ User user = userDao.selectById(5); System.out.println(user); } @Test /*查询: 1、条件构造器 QueryWrapper:动态拼接where条件 原则:根据对象不为null的属性,动态拼接where条件 eg:查询name=沙悟净并且age=503的数据 * */ public void testSelect1(){ User user = new User(); user.setName("沙悟净").setAge(503); QueryWrapper queryWrapper = new QueryWrapper(user); User one = userDao.selectOne(queryWrapper); System.out.println(one); } @Test /*eg:查询age>18,并且sex=女的用户 条件构造器的方法(常用的): 函数名:eq 说明:= (等于) gt > (大于) ge >= (大于等于) lt < (小于) le <= (小于等于) isNull 字段 is null is Not Null 字段 is not null * */ public void testSelect2(){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt("age", 18); queryWrapper.eq("sex", "女"); List<User> list = userDao.selectList(queryWrapper); System.out.println(list); } @Test /*eg:查询name中含有‘孙’字的用户,并且性别为女的 * 模糊查询:关键词用"like" 条件构造器:条件构造器.like() 含"孙”==》like * 以"孙"开头 ==》likeLeft * 以"孙"结尾 ==>likeRight * sql查询:含"孙”==》like%孙% * 以"孙"开头 ==》孙% * 以"孙"结尾 ==>%孙 * */ public void testSelect3(){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.like("name","孙"); queryWrapper.eq("sex", "女"); List<User> list1 = userDao.selectList(queryWrapper); System.out.println(list1); } @Test /*eg: * 查询age>20 并且name不为null 的用户,按照age进行降序排列*/ public void testSelect4(){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt("age", 20); queryWrapper.isNotNull("name"); queryWrapper.orderByDesc("age"); List<User> list2 = userDao.selectList(queryWrapper); System.out.println(list2); } @Test /*1 * 查询用户的信息,有2个参数,但是这个2个参数有可能为null ==》使用动态查询 * sql查询的:<if test="参数1 != null && 参数2 !=null">sql语句</if> * 在条件构造器中,使用的是condition,当condition为什么的时候,条件为true时,条件才会拼接 * 源码:public Children gt(boolean condition, R column, Object val) * */ public void testSelect5(){ User user = new User(); user.setAge(150); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.gt(user.getAge()!=null && user.getAge()>0, "age", user.getAge()); queryWrapper.gt(!"".equals(user.getSex())&&user.getSex() !=null, "sex",user.getSex()); List<User> list3 = userDao.selectList(queryWrapper); System.out.println(list3); } @Test /*查询用户id为1,8,10,45,7的信息 * sql查询:select * from user where id in (1,8,10,45,7) * */ public void testSelect6(){ /*规则 :如果数组需要用转换集合则使用包装类型的 * 在这里,我们使用包装类型的,因为包装类型有方法,而基本类型没有,*/ Integer[] ids={1,8,10,45,7}; //将数组转化为集合 使用工具类 Arrays List<Integer> asList = Arrays.asList(ids); //第一种方法 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.in("id", asList); List<User> list4 = userDao.selectList(queryWrapper); System.out.println(list4); //第二种方法 List<User> ids1 = userDao.selectBatchIds(asList); System.out.println(ids1); }
删除数据操作:
@Test /*删除name为null的数据*/ public void delete(){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.isNull("name"); userDao.delete(queryWrapper); System.out.println("删除成功"); }
更新数据操作:
@Test /*更新操作 * 将id=7的用户名称改为mybatisPlus age=10 sex="其他" * */ public void updateByid(){ User user = new User(); user.setId(7).setName("mybatisPlus").setAge(10).setSex("其他"); userDao.updateById(user); } @Test /* * 将name=”小乔“的数据改为age=18,sex="无" * */ public void update(){ User user = new User(); user.setSex("无").setAge(18); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("name", "小乔"); userDao.update(user, queryWrapper); System.out.println("更新成功!"); }
正在学习中,有错误的地方,请多多指教!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术