Spring整合mybatis -plus 以及相关API的应用

目录

ORM思想:

Mybatis -plus

JPA思想:

spring整合mybatis-plus具体步骤

Mybatis Plus中提供的API

查询操作API

删除操作API

更新操作API


ORM思想:

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

对象关系映射:对象的名称映射表的名称、对象的属性名称映射表的字段

mybatis是半自动的ORM,Hibernate是全自动的ORM

 

Mybatis -plus

先定义访问数据层的接口,之后书写sql语句来访问数据库,工程师们不满足于此,他们还想让访问数据库的操作再简单一点.....

于是,又一个让人摸不着头脑的概念诞生了!!!

 

JPA思想:

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

简单点说就是:以对象的方式访问数据库,而不用手写sql语句的方式访问数据库。

当然诞生的不光只是这个概念,与之诞生的还有一个猴赛雷的东东,它就是今天的主角 mybatis -plus , 这个名字是不是似曾相识呢?没错,它是在mybatis 的框架的基础上做的增强,所以是plus,意为mybatis 的升级版。

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

这是Mybatis-plus的官网

https://mp.baomidou.com

 


 

以上就是有关mybatis-plus的相关介绍 ,下面让我们直奔主题,看看如何整合mybati-plus吧

spring整合mybatis-plus具体步骤

一、在pom文件中导入spring整合mybatis -plus的jar包,最新版本可以参考官网~

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

注意:mybatis -plus与mybatis 的jar包只能存在一个,因为mybatis -plus包含mybatis,为了避免发生无可预期的错误,只保留mybatis -plus即可

 

二、编辑配置文件配置mybatis-plus这里以YML文件为例,其实与mybatis的配置没啥区别,只是把开头换成了mybatis-plus

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

注意:配置文件中mybatis-plus与mybatis的配置也只需保留一个即可奥~

三、创建PO对象,用于访问数据库

@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;
    
}
 
底层通过反射技术根据你的@TableName注解的value值映射你的数据库中的表,如果你的po对象的名字与表名一致可以省略value属性
会根据@TableId(type=IdType.AUTO)注解得知你的主键

 

四、继承BaseMapper<T>

在mybatis -plus提供了大多数常用的访问数据库的方法,我们访问数据库的dao接口只需要实现BaseMapper<T> 接口即可拥有这些方法,泛型是查询数据与表对应的PO对象类型。

public interface userMapper extends BaseMapper<user>{
 
}

五、整合完毕后,在测试类里面查询表中所有数据,检查是否整合成功

@Test
 void findAll() {
  List<user> selectList = userMapper.selectList(null).forEach((item)->System.out.println(item));
 }

 

六、此外,还可以在YML配置文件中配置打印SQL的日志,方便我们编写程序

#打印sql日志
logging:
  level:
    com.vip.mapper: debug  //这里是我们访问数据库的接口包路径

 


 

Mybatis Plus中提供的API

 

查询操作API

1.selectBatchIds(Collection idList)

根据多个ID查询信息,idList主键ID列表,不能为null或empty

/**
 * 根据多个id查询
 */
@Test
void findByIds() {
	Integer[] ids = {1,2,3,4,5,6};
	List<Integer> idList = Arrays.asList(ids);
	List<User> userList=userMapper.selectBatchIds(idList);
	userList.forEach((item)->System.out.println(item));
}

2.selectById(id)

根据ID查询,返回值是BaseMapper<T> 类你设置的泛型的类型T

/**
 * 根据单个id查询
 */
@Test
void  test01() {
	User user= userMapper.selectById(2);
	System.out.println(user);
}

3.selectByMap(Map<String, Object> columnMap)

根据传入的Map,key为查询字段,value为查询字段对应的值

/**
 * 根据map条件查询
 */
@Test
void test02() {
	Map<String,Object> map = new HashMap<>();
	map.put("name","蕾姆");
	map.put("sex", "女");
	userMapper.selectByMap(map).forEach((user)->System.out.println(user));
}

4.selectList(Wrapper<T> queryWrapper)

根据 entity 条件,查询全部记录,一般查询后是一个List集合的时候会使用

条件构造器:QueryWrapper<T> 负责动态的拼接sql中的where语句

> 用gt表示

< 用lt表示

= 用eq表示

>= 用ge表示

<= 用le表示

其中有:> gt < lt = eq >= ge <= le 

/**
 * 条件构造器
 * where语句条件
 * 查询age大于18 and sex是女的用户
 * 语法: >gt <lt =eq >=ge <=le
 * 多个条件默认使用 and 连接
 */
@Test
void test03() {
	QueryWrapper<User> qw=new QueryWrapper<User>();
	qw.gt("age",18).eq("sex", "女");
	userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}

5.QueryWrapper.like()

QueryWrapper对象中的模糊查询的方法,其中还有likeRight、 likeLeft .....

/**
 * 模糊查询
 * 查询name值以蕾开头的用户信息
 */
@Test
void test04() {
	QueryWrapper<User> qw=new QueryWrapper<User>();
	qw.likeRight("name", "蕾");
	userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}

6.QueryWrapper.between()

QueryWrapper对象中的方法,类似于sql语法中的between and

/**
 * 查询年龄在18-35之间的用户,并且name以王开头
 * between的用法
 */
@Test
void test05() {
	QueryWrapper<User> qw=new QueryWrapper<User>();
	qw.between("age", 18, 35).likeRight("name", "王");
	userMapper.selectList(qw).forEach((user)->System.out.println(user));
}

7.QueryWrapper.orderBy()

QueryWrapper对象中的方法,排序时使用根据业务还有orderByAsc、orderByDesc...等方法

/**
 * 查询年龄大于100并按照年龄降序排列,如果年龄相同则按照id降序
 */
@Test
void test06() {
	QueryWrapper<User> qw=new QueryWrapper<User>();
	qw.orderByDesc("age","id").gt("age", 100);
	userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}

8.QueryWrapper.inSql()

QueryWrapper对象中的方法,方法中可以自定义sql语句,并将结果放在in中再次进行查询。

类似in的子查询

/**
 * 查询age < 100岁的用户,并且性别与name="孙尚香"的性别相同的的用户数据.
 */
@Test
void test07() {
	QueryWrapper<User> qw=new QueryWrapper<User>();
	qw.lt("age", 100).inSql("sex", "select sex from user where name='孙尚香'");
	userMapper.selectList(qw).forEach((user)->System.out.println(user));;
}

9.QueryWrapper.select()

指定字段查询

   @Test
	public void test09() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.select("id","name").eq("age", 18);
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
        //完善业务
        QueryWrapper<User> queryWrapper2 = new QueryWrapper<User>();
		queryWrapper2.select("id","name").eq("age", 18);
		List<Map<String,Object>> listMap = 
								userMapper.selectMaps(queryWrapper2);
		System.out.println(listMap);
}

10.Condition

在QueryWrapper对象的许多方法参数中存在这样一个参数Condition

Condition:true时,执行where语句,false时则不执行

/**
	 * Condition: true时,则添加where条件。
	 * 条件:以name和sex不为null的数据当做where条件.
	 * 非空条件查询
	 * 模拟mybatis中的动态sql的写法 由Condition进行控制
	 */
	@Test
	public void test10() {
		String name = "貂蝉";	//用户传递的参数
		Integer age = 18;
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.eq(!StringUtils.isEmpty(name), "name",name);
		queryWrapper.eq( age!=null, "age",age);
		
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
	}

11.根据传入的对象查询数据

 /**
	 * 根据对象查询数据
	 */
	@Test
	public void test11() {
		User user = new User();   //用户数据的传递,采用user对象的方式接收
		user.setName("李白");
		user.setSex("男");
		//用户要求根据传递的对象进行查询, 
		//根据对象中不为null的属性之后拼接where条件
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>(user);
		List<User> userList = userMapper.selectList(queryWrapper);
		System.out.println(userList);
		

此外还有:

selectOne方法:如果只查询一条数据的时候可以使用。

selectObjs方法:只查询第一列数据

删除操作API

 /**
	 * 用户删除操作
	 * 说明:将name属性中为null的数据删除.
	 */
	@Test
	public void test13() {
		
		//userMapper.deleteById(id);	//传递主键,之后删除
		//userMapper.deleteBatchIds(idList);	//根据id批量删除数据.
		//userMapper.deleteByMap(columnMap)       //根据指定的字段删除数据.
		QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
		queryWrapper.isNull("name");
		int rows = userMapper.delete(queryWrapper);
		System.out.println("影响行数:"+rows);

更新操作API

 /**
     * 1.根据主键进行修改.  
     * 要求: id=50号的信息,修改为name="娜可露露" age= 19 sex=女
     */
    @Test
    public void test14() {
        User user = new User();
        user.setId(50).setName("娜可露露").setAge(19).setSex("女");
        //如何解析sql byId说明 只有id属性充当where条件 其余属性充当set条件.
        //如果获取主键信息时使用
        int rows = userMapper.updateById(user);
        System.out.println("影响的行数:"+rows);
        
         //2. entity:需要修改的数据    
        //   updateWrapper: 修改的条件
        User user2 = new User();
        user2.setAge(25).setSex("男");
        UpdateWrapper<User> updateWrapper= new UpdateWrapper<User>();
        updateWrapper.eq("id", 50);
        //具有通用性.任何条件都可以使用update(xx,xxx)
        userMapper.update(user2, updateWrapper);
        

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值