欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 Mybatis-Plus入门及API

程序员文章站 2022-04-15 23:27:04
MP介紹MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。与Mybatis相比,Mybatis在进行数据库操作时依然采用“面向过程”的操作方式,而MP采用了ORM的思想以面向对象的方式来操作数据库Mybatis-plus入门案例导入jar包com.baomid...

MP介紹

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。与Mybatis相比,Mybatis在进行数据库操作时依然采用“面向过程”的操作方式,而MP采用了ORM的思想以面向对象的方式来操作数据库

Mybatis-plus入门案例

导入jar包

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

编辑POJO

@TableName(value=“xxx”)定义对象与表映射关系,xxx为数据库表名,如对象名与表名一致,则括号内可以省略不写
@TableId(Type=IdType.AUTO)标识主键,设置主键自增
@TableField(value=“xxx”)定义对象属性与表字段的映射关系,如果属性与字段名一致(包含驼峰映射规则)则可以省略

@Data	//生成get/set/toString/equals
@Accessors(chain=true)	//表示链式加载  重写set方法,将对象返回
@NoArgsConstructor		//添加无参构造   为以后框架的使用做准备
@AllArgsConstructor		//全部参数的构造方法.
@TableName		//(value="user")//定义对象与表映射关系 编辑表名
						//如果表名与对象的名称一致,则可以省略不写.
public class User {
	@TableId(type=IdType.AUTO)	//标识主键 主键自增.
	private Integer id;
	//@TableField(value="name")	//如果字段的名称与属性名称一致(包含驼峰规则),则可以省略
	private String name;		//字段与属性一一映射
	private Integer age;		//user_name  userName
	private String sex;
}

继承公共的接口

public interface UserMapper extends BaseMapper<User>{
}

编辑YML配置文件

erver:
  port: 8090    #表示端口号信息
  servlet:
    context-path: /   #项目发布路径
spring:
  datasource:
        #如果使用高版本驱动则配置如下
    #driver-class-name: com.cj.mysql.jdbc.Driver
    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


#mybatis-plush配置  mp比mybatis功能更加强大 引用一个即可
mybatis-plus:
    #定义别名包
  type-aliases-package: com.jt.pojo  
  mapper-locations: classpath:/mybatis/mappers/*.xml  #动态的导入xml映射文件
    #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true   #为了user_id与userId完美映射.无需手动转化
    #打印sql日志
logging:
  level:
    com.jt.mapper: debug

Mybatis-plus入门案例

/**
	 * 测试MybatisPlus新增操作
	 * 面向对象的方式操作数据库!!!!
	 */
	@Test
	public void testInsert() {
		User user = new User();
		user.setName("无名英雄永垂不朽");
		user.setAge(3);
		user.setSex("男女");
		int rows = userMapper.insert(user);
		System.out.println("入库成功影响:"+rows+"行");
	}

打印結果如下:

2020-07-15 21:32:52.910 DEBUG 21060 --- [           main] com.jt.mapper.UserMapper.insert          : ==>  Preparing: INSERT INTO user ( sex, name, age ) VALUES ( ?, ?, ? ) 
2020-07-15 21:32:52.924 DEBUG 21060 --- [           main] com.jt.mapper.UserMapper.insert          : ==> Parameters: 男女(String), 人民英雄永垂不朽(String), 3(Integer)
2020-07-15 21:32:53.042 DEBUG 21060 --- [           main] com.jt.mapper.UserMapper.insert          : <==    Updates: 1
入库成功影响:1

Mybatis-PlusAPI

@SpringBootTest	//SpringBoot的测试用例,动态的启动了spring容器
public class SpringbootDemoMybatisApplicationTests {
	
	//从容器中动态的注入接口对象
	@Autowired
	private UserMapper userMapper;
	/**
	 * 测试MybatisPlus新增操作
	 * 面向对象的方式操作数据库!!!!
	 */
	@Test
	public void testInsert() {
		User user = new User();
		user.setName("无名英雄永垂不朽");
		user.setAge(3);
		user.setSex("男女");
		int rows = userMapper.insert(user);
		System.out.println("入库成功影响:"+rows+"行");
	}
	
	//速度对比,1.手写sql  2.动态生成sql
	@Test
	public void testInsert2() {
		User user = new User();
		user.setName("无名英雄永垂不朽");
		user.setAge(3);
		user.setSex("男女");
		Long start = System.currentTimeMillis();
		//int rows = userMapper.insertUser(user);
		int rows = userMapper.insert(user);
		Long end = System.currentTimeMillis();
		System.out.println("执行时间:"+(end-start)+"毫秒");
		//System.out.println("入库成功影响:"+rows+"行");
	}
	
	
	/**
	 * 需求1:按照指定的id进行查询   id 1,3,5,9
	 *sql: select * from user where id=1 and id=3 and id=xxxxx... 
	 *使用in关键字
	 *	   select * from user where id in (1,3,5,9);
	 *实际业务
	 *		用户查询的参数1,3,5,9都是由前台web动态传参,所以在Controler中
	 *		一般采用数组的形式动态接收.
	 *		
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void test01() {
		//一般都是用对象类型进行定义
		Integer[] ids = {1,3,5,9};
		//数组怎么转化为集合??
		List idList =  Arrays.asList(ids);
		//List idList =  org.assertj.core.util.Arrays.asList(ids);
		/*List<Integer> idList = new ArrayList<>();
		idList.add(1);
		idList.add(3);
		idList.add(5);
		idList.add(9);*/
		List<User> userList = userMapper.selectBatchIds(idList);
		System.out.println(userList);
	}
	
	/**
	 * 根据指定的条件查询
	 * 查询name="王昭君" sex=女的用户 默认使用and方式进行关联
	 * 需要将查询的字段与值封装到MAP中
	 * SELECT id,name,age,sex FROM user WHERE sex = ? AND name = ?
	 */
	@Test
	public void test02() {
		Map<String, Object> columnMap = new HashMap<>();
		columnMap.put("name", "王昭君");	//默认使用=号
		columnMap.put("sex", "女");
		List<User> userList = userMapper.selectByMap(columnMap);
		System.out.println(userList);
	}
	
	/**
	 * 查询age>18  and sex=男
	 *逻辑运算符   > gt,  < lt, = eq,  >= ge, <= le
	 */
	@Test
	public void test03() {
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.gt("age", 18)
					.eq("sex", "男");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	
	/**
	 * name like %精% and sex="女"
	 *   以精字结尾
	 * name like %精
	 * 			   精%
	 */
	@Test
	public void test04() {
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.likeLeft("name", "精")
					.eq("sex", "女");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	
	/**
	 * 条件:查询年龄在18-35之间的女性用户.
	 * sql: select * from user where age > 18 and age < 35
	 */
	@Test
	public void test05() {
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.between("age", 18, 35)
					.eq("sex", "女");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	
	/**
	 * 条件:查询年龄大于100岁的,并且按照年龄降序排列,如果年龄相同按照Id降序排列.
	 *sql中的排序默认根据id升序排列
	 *SELECT id,name,age,sex FROM user WHERE (age > ?) ORDER BY age DESC,id DESC 
	 */
	@Test
	public void test06() {
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.gt("age",100)
					.orderByDesc("age","id");
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	
	/**
	 * 子查询: insql
	 * 条件: 查询age < 100岁的用户,并且性别与name="孙尚香"的性别相同的的用户数据.
	 *sql: SELECT * FROM USER WHERE age < 100 AND 
	 *	   sex IN(SELECT sex FROM USER WHERE NAME="孙尚香")
		
	 */
	@Test
	public void test07() {
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		String name = "'孙尚香'";
		queryWrapper.lt("age", 100)
				.inSql("sex", "select sex from user where name="+name);
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	
	/**
	 * 需求:有时查询可能不需要查询全部字段,会挑选其中几个进行查询.
	 *1.指定字段进行查询
	 * 查询age>100岁 只查询Id,name字段
	 *
	 *2.只返回查询的字段
	 */
	@Test
	public void test08() {
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.select("id","name").gt("age", 100);
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
		
		//只想返回特定的字段
		List<Map<String,Object>> mapList = userMapper.selectMaps(queryWrapper);
		System.out.println(mapList);
		
		//只返回第一列字段的值  主键值
		List<Object> list = userMapper.selectObjs(queryWrapper);
		System.out.println(list);
	}
	
	/**
	 *   根据属性中不为null的元素查询数据
	 * condition:布尔类型的判断 只有当判断为true时,条件生效
	 */
	@Test
	public void test09() {
		String name = "黑熊精";
		String sex = "男";
		//定义条件构造器  负责拼接where条件的
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		//当name属性不为null的时候会动态的拼接name属性值
		queryWrapper.eq(!StringUtils.isEmpty(name), "name", name)
					.eq(!StringUtils.isEmpty(sex), "sex", sex);
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	/**
	 * 根据对象中不为null的属性进行查询
	 */
	@Test
	public void test10() {
		User user = new User();
		user.setName("黑熊精")
			.setSex("男");
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>(user);
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}
	
	//根据主键查询
	@Test
	public void test11() {
		
		User user = userMapper.selectById(1111);
		//根据条件返回一个对象信息
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("id", "3");
		User user2 = userMapper.selectOne(queryWrapper);
		System.out.println(user);
		System.out.println(user2);
	}
	
	
	/**
	 * MP的删除用法
	 *  案例:
	 *  	1.将name字段值为null的数据进行 
	 *  	2.将name字段信息 无名英雄永垂不朽删除
	 *  
	 */
	@Test
	public void test12() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		//queryWrapper.isNull("name");
		queryWrapper.eq("name", "无名英雄永垂不朽");
		userMapper.delete(queryWrapper);
		System.out.println("数据库删除成功!!!!");
	}
	
	
	/**
	 * 数据库更新操作
	 * 
	 * 1.将大日如来的年龄改为10001 性别 改为男
	 * entity: 数据修改后的值使用对象封装
	 * updateWrapper: 修改的条件构造器
	 * 
	 * 
	 */
	@Test
	public void test13() {
		User user = new User();
		user.setAge(10001).setSex("男");
		UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
		updateWrapper.eq("name","大日如来");
		userMapper.update(user, updateWrapper);
	}
	
	
	//2.根据主键1915 将name改为"人民英雄" age=100   性别=男/女
	//对象中只有主键充当where条件,其他的字段信息充当set条件
	@Test
	public void test14() {
		User user = new User();
		user.setId(1915)
			.setName("人民英雄")
			.setAge(100)
			.setSex("男/女");
		
		userMapper.updateById(user);
	}
}

本文地址:https://blog.csdn.net/weixin_42800427/article/details/107371457