文章目录:
1.写在前面
在持久层框架中,MyBatis的应用还是比较多的,而且比重在逐渐的上升。通常项目的组合框架是SSM。那么MyBatis之所以火,是因为它的灵活、使用方便、优化相对容易。
我们都知道,MyBatis可以直接执行sql语句,但是sql语句是写在xml映射文件中的,使用MyBatis了话,是需要写很多xml映射文件的,在一定程度上比较繁琐。而现在的数据库操作肯定也是离不开CRUD。
而MyBatis-Plus就是在MyBatis上只做增强、不做改变,为简化而生、为提高效率而生,减少了xml的映射文件的编写,甚至可以达到不用编写xml就可以实现CRUD操作,很是方便,极大的提高了开发效率。
下面是关于它们两者的图片。这两只小飞鸟还是比较可爱的。
2.MP的第一个案例
创建一个普通的SpringBoot项目,在pom文件中加入相关依赖。
<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>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>5.1.9</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
在核心配置文件中,配置数据库的相关连接信息。
#配置数据库的相关连接信息 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springdb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=12345678 #配置对应的日志信息 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
在Navicat中创建一张表。
编写实体类。
package com.szh.mybatisplus.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; /** * */ @TableName(value = "user") public class User { /** * 指定主键的方式:使用@TableId注解 * value:指定主键字段的名称,如果主键字段的名称是id,value属性可以省略 * type:指定主键字段的类型,IdType.AUTO表示自动增长 * * 其他字段可以使用@TableField注解 */ @TableId(value = "id",type = IdType.AUTO) private Integer id; @TableField(value = "name") private String name; @TableField(value = "age") private Integer age; @TableField(value = "email") private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", email='" + email + '\'' + '}'; } }
编写mapper接口,让它继承MP框架中的BaseMapper接口。
package com.szh.mybatisplus.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.szh.mybatisplus.entity.User; /** * 自定义Mapper,有两个要求 * 1) 继承BaseMapper * 2) 泛型使用对应的实体类 * * BaseMapper是MP框架中的对象类,其中定义了17个关于CRUD的方法 */ public interface UserMapper extends BaseMapper<User> { }
MP框架中的BaseMapper接口中定义了17个关于CRUD的操作方法。
在SpringBoot项目的启动入口类上添加 @MapperScan 注解,确保扫描mapper包下所有mybatis、mybatis-plus相关的注解。
package com.szh.mybatisplus; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan(value = "com.szh.mybatisplus.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
在SpringBoot项目提供的测试类中编写CRUD相关的测试方法。
首先,将mapper注入到Spring容器中,使用@Autowired注解。
@Autowired private UserMapper userMapper;
1.1 insert
/** * insert新增 */ @Test void testUserInsert() { User user=new User(); user.setName("张三"); user.setAge(20); user.setEmail("zhangsan@sina.com"); int rows=userMapper.insert(user); System.out.println("insert的结果:" + rows); }
1.2 update
/** * update更新 */ @Test void testUserUpdate() { User user=new User(); user.setId(2); user.setName("李四"); user.setAge(18); user.setEmail("lisi@163.com"); //判断字段是否会进行更新,依据字段是否为null, //如果非null,则加入set语句中;为null,则不加入set语句 int rows=userMapper.updateById(user); System.out.println("update的结果是:" + rows); }
1.3 delete
/** * delete根据主键id删除 */ @Test void testUserDelete() { int rows = userMapper.deleteById(2); System.out.println("delete的结果是:" + rows); }
/** * delete根据条件删除,将删除条件封装到Map集合中 */ @Test void testUserDelete2() { Map<String,Object> map=new HashMap<>(); //put("表的字段名",条件值) map.put("name","张三"); map.put("age",20); int rows = userMapper.deleteByMap(map); System.out.println("delete的结果是:" + rows); }
/** * delete批量删除,使用多个主键值删除 */ @Test void testUserDelete3() { List<Integer> list=new ArrayList<>(); list.add(5); list.add(7); list.add(8); int rows=userMapper.deleteBatchIds(list); System.out.println("delete的结果是:" + rows); }
1.4 select
/** * select根据主键id查询 */ @Test void testUserSelect() { User user=userMapper.selectById(4); System.out.println("select的结果是:" + user); }
/** * select根据多个主键id值查询 */ @Test void testUserSelect2() { List<Integer> list=new ArrayList<>(); list.add(1); list.add(2); list.add(3); List<User> userList=userMapper.selectBatchIds(list); for (User user : userList) { System.out.println(user); } }
/** * select根据条件查询,将查询条件封装到Map集合中 */ @Test void testUserSelect3() { Map<String,Object> map=new HashMap<>(); map.put("name","小宋"); map.put("age",21); List<User> list=userMapper.selectByMap(map); list.forEach( user -> { System.out.println(user); }); }
通过上面的代码对应出的sql语句可以看出,在MP框架中,如果说你调用了CRUD操作中有关List的方法,那么最终的sql语句的条件将会被转换为 IN;如果调用了CRUD操作中有关Map的方法,那么最终的sql语句的条件将会被转换为 AND。