SSM框架学习笔记6—Mybatis Plus

上一篇博客中学习了Mybatis,这篇将学习以下Mybatis Plus,同时也将会用到更加易懂的YML文件(对比XML)

1.MybatisPlus

1.1 ORM思想

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
知识点:
1.描述对象和数据库之间映射关系
2.以面向对象的方式来操作数据库.

1.2 面向对象操作方式说明

例子:新增用户为例 向user表中新增一个用户数据. name=“张三” age=18 sex=女

1).面向过程的语言

insert into  user(id,name,age,sex)  values(null,"张三",18,);    

2).面向对象的方式

User user = new User("张三",18,"女"); //对象的封装
userMapper.insert(user对象);			 //调用工具API方法实现入库.  程序员只需要编辑这些就够了.
userMapper.delete(xxxx)

上述操作,程序员需要编辑,但是其中与数据库的交互的过程,程序员无需干预.会根据对象自动的生成sql语句.实现入库操作.而这些操作都由固定的API动态生成.所以以后用户只需要操作对象即可实现入库操作.

总结:之前操作数据库时需要自己手写sql语句.现在操作数据库利用对象的方式实现操作.

1.3 面向对象操作的原理

  1. 对象与数据表进行关联 user对象 -------user表形成绑定.
  2. 对象的属性与表中的字段一一映射. user对象(id/name/age/sex)------映射关系 user表(id/name/age/sex)等字段
  3. 封装操作的API 该API中包含了几乎所有的单表操作方法. 用户操作的是API(方法)
  4. 数据库只能识别sql语句所以需要将API方法通过拼接形成Sql语句.
userMapper.insert(user对象);	  API方法
insert into user表(表中的字段)  values (获取属性的值.....)
userMapper.insert(person对象); API方法
insert into user表(表中的字段)  values (获取属性的值.....)  通用

1.4 MybatisPlus介绍

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
在这里插入图片描述

特点:

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  2. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  3. 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  4. 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  5. 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  6. 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  7. 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  8. 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  9. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  10. 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  11. 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  12. 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2. MP入门案例

2.1 导入MP包

说明:MP中引入jar包文件会与原来Mybatis的包产生冲突,所以需要将原来的包注释

<!--spring整合mybatis-plus -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.2.0</version>
		</dependency>-

2.2 POJO属性映射

可根据以下字段自建数据库表User

//user表示实体对象 一般与数据库中的表进行关联.
@Data	//证明lombok引入成功
@Accessors(chain=true)	//链式加载
@NoArgsConstructor		//定义无参构造方法  如果什么都不写,默认添加无参构造
@AllArgsConstructor		//定义全参构造方法  如果添加了全参构造,必须先添加无参构造
						//为什么呢?  解释:乌龟的屁股!!!! 龟腚(规定)
//MP的原则如果对象名称和属性名称与表和字段一一映射,则可以忽略不写.
@TableName		//标识对象与user表一一映射.
public class User {
	@TableId(type=IdType.AUTO)	//定义主键自增
	private Integer id;			//整数   一般用Integer/Long 区间>Integer
	//@TableField(value="name")	//属性与字段进行标识
	private String name;		//String  一般写字符串
	private Integer age;
	private String sex;
}

2.3 继承Mapper接口

MP最重要的操作是Mapper层继承BaseMapper接口,即可使用能满足大部分需求的CRUD操作
在这里插入图片描述

2.4 修改YML配置文件

配置说明:需要将mybatis改为mybatis-plus即可

	#语法       1.key: (空格)value  
#       2.缩进   代表层级关系
server:
  port: 8080      #tomcat服务器默认端口号都是8080
                  #类比: java运行环境JDK   
                  #      项目运行环境服务器(软件) tomcat

#YML配置文件在SpringBoot(Spring+SpringMVC等)程序中启动时 会被默认加载                  
#为属性赋值   如果操作时有红线则不管.
#如果将大量的业务代码保存到YML配置文件中时,会造成代码结构混乱
my:
  food: 番茄炒蛋     #k-v
  book: java编程思想

#SpringYML配置文件写法
spring:
  datasource:   #数据源
    driver-class-name: com.mysql.jdbc.Driver
    #链接数据库地址
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

#SpringBoot整合Mybatis
mybatis-plus:
  #定义别名包
  type-aliases-package: com.jt.pojo
  #mapperxml映射文件路径
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

2.5 MP入门案例

//3.测试MP方式查询数据库
	@Test
	public void testSelectAll() {
		
		List<User> userList = userMapper.selectList(null);
		System.out.println(userList);
	}

2.6 添加sql日志

说明:在yml配置文件最后添加日志操作.

#配置日志
logging:
  level:
    com.jt.mapper: debug

2.7 测试案例

//3.测试MP方式查询数据库
@Test
public void testSelectAll() {
	//面向对象的方式操作数据库
	List<User> userList = userMapper.selectList(null);
	System.out.println(userList);
}

@Test
public void testInsert() {
	User user = new User(null,"新冠病毒",7, "其他");
	userMapper.insert(user);
}

2.8 MP使用

/**
	 * MP案例1:  查询name="王昭君"的用户
	 * 注意事项:  1.查询的结果有几个???
	 * 			 2.查询的条件
	 * sql: select * from user where name = "王昭君"
	 * 语法:	eq =,   gt >,  lt < , ge>= ,le <=
	 */
	@Test
	public void testSelect01() {
		//定义条件构造器  作用:拼接where条件
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.eq("name", "王昭君");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	/**
	 * MP案例2:  name属性中包含"精"的数据,并且为女性
	 * sql: select * from user where name like "%精%" and  sex="女"
	 */
	@Test
	public void testSelect02() {
		//定义条件构造器  作用:拼接where条件
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.like("name", "精")	//默认采用and的方式进行链接
					.eq("sex", "女");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
		
	/**
	 * MP案例3: 查询年龄在18-35之间的女性用户.
	 * Sql语句: SELECT id,sex,name,age FROM user WHERE (age BETWEEN ? AND ? AND sex = ?) 
	 */
	@Test
	public void testSelect03() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.between("age", 18, 35)
		.eq("sex","女");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}

	/**
	 * MP案例4: 查询年龄大于100岁的,并且按照年龄降序排列,如果年龄相同按照Id降序排列
	 * Sql语句: 
	 * 	SELECT id,sex,name,age FROM user WHERE (age > ?) 
	 * 							ORDER BY age DESC , id DESC  
	 */
	@Test
	public void testSelect04() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.gt("age", 100)
		.orderByDesc("age","id");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}


	/**
	 * MP案例5:查询age < 100岁的用户,
	 * 		    并且性别与name="孙尚香"的性别相同的的用户数据. 
	 * Sql语句: 
	 * SELECT id,sex,name,age FROM user WHERE 
	 * 			(age < ? AND sex IN (SELECT sex FROM USER WHERE NAME = '孙尚香')) 
	 */
	@Test
	public void testSelect05() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.lt("age", 100)
					.inSql("sex", "SELECT sex FROM USER WHERE NAME = '孙尚香'");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	//根据ID查询数据   id=11的用户  ID是主键 主键不能重复
	@Test
	public void testSelect06() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.eq("id", 11);
		User user = userMapper.selectOne(queryWrapper);
		System.out.println(user);

		User user2 = userMapper.selectById(11);	//根据主键进行查询
		System.out.println(user2);
	}

	//批量查询   查询id=1,3,5,6等用户信息
	//sql:SELECT id,sex,name,age FROM user WHERE id IN ( ? , ? , ? , ? ) 
	@Test
	public void testSelect07() {
		Integer[] ids = {1,3,5,6};
		List<Integer> idList = Arrays.asList(ids);
		List<User> userList = 
				userMapper.selectBatchIds(idList);
		System.out.println(userList);
	}

2.9 MP更新操作

@Test
public void testInsert2() {
	User user = new User(null,"新冠病毒",7, "其他");
	userMapper.insert(user);
}


/**
 * 案例:删除name为null的数据
 * sql:DELETE FROM user WHERE (name IS NULL)
 */
@Test
public void testDelete() {
	
	//userMapper.deleteById(100);	//删除id的值为100的用户数据
	//userMapper.deleteBatchIds(idList);//可以进行批量的删除
	QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
	queryWrapper.isNull("name");
	userMapper.delete(queryWrapper);
}


/**
 * 需求:将id=228的数据,name改为实训课程,age=3  sex=其他
 * 原则: 根据对象中不为null的属性当作更新要素.
 * 		ById: 代表根据具体的主键的值更新数据.  就是where条件
 * Sql: update xxxxxxx where id = 主键值
 */
@Test
public void testUpdate() {
	User user = new User();
	user.setName("实训课程")
		.setAge(3)
		.setSex("其他")
		.setId(228);
	userMapper.updateById(user);
}


/**
 * 需求2: 更新name="新冠病毒"的数据改为  
 * 						name="疫苗正在路上"  age=1 sex=其他
 * Sql:   update user set name="xxx",age=1,sex="其他"
 * 		  where name="新冠病毒"
 * 
 * 参数说明:
 * 		entity: 修改的值
 * 		updateWrapper: 修改的条件构造器
 */
@Test
public void testUpdate2() {
	User user = new User(null, "疫苗正在路上", 1, "其他");
	UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
	updateWrapper.eq("name", "新冠病毒");
	userMapper.update(user, updateWrapper);
}

猜你喜欢

转载自blog.csdn.net/weixin_36302584/article/details/107188090