##1 mybatis-plus简介
mybatis-plus是增强版的mybatis,它继承mybatis所有的特性,不做改变,为简化开发、提高效率而生的。
##2 mybatis与mybatis-plus的区别
2.1mybatis特点
2.2mybatis-plus特点
3 springboot整合mybais-plus
3.1 创建数据库(数据库为user)
3.2springboot与mybatis-plus整合
1添加相关依赖
2配置数据源
3 配置mybatis-plus generator
package com.example.demo.generator;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class Mybatisplusgenerator {
public static void main(String[] args){
//1. 全局配置
GlobalConfig config = new GlobalConfig();
//是否支持AR模式
config.setActiveRecord(true)
.setAuthor("James") //作者
.setOutputDir("D:\\java\\demo\\src\\main\\java") //生成路径
.setFileOverride(true)//是否文件覆盖,如果多次
.setServiceName("%sService") //设置生成的service接口名首字母是否为I
.setIdType(IdType.AUTO) //主键策略
.setServiceName("%sService")//设置生成的service接口的名字的首字母是否为I
.setBaseResultMap(true)
.setBaseColumnList(true);
//2. 数据源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setDbType(DbType.MYSQL)
.setUrl("jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT")
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("root")
.setPassword("chen623507");
//3.策略配置
StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true) // 全局大写命名
.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
.setInclude("user"); //生成的表
//4.包名策略
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("com.example.demo")//父包名
.setController("controller")
.setEntity("entiy")
.setService("service")
.setMapper("dao")
.setXml("mapper");
//5.整合配置
AutoGenerator ag = new AutoGenerator().setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setPackageInfo(pkConfig);
ag.execute();
}
}
结果
4 entiy:
package com.example.demo.entiy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author James
* @since 2020-03-30
*/
@Data
public class User implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 姓名
*/
private String userName;
/**
* 年龄
*/
private Integer age;
/**
* 邮箱
*/
private String email;
}
5 mapper:
package com.example.demo.dao;
import com.example.demo.entiy.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author James
* @since 2020-03-30
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
其中@Mapper注解作用为:
5.1:使用@Mapper交给springboot管理
5.2:不用写Mapper映射文件
5.3:为这个UserMapper接口生成一个实现类,让别的类进行引用
6 通用的CRUD操作
select操作
1根据ID查询
@Autowired
private UserMapper userMapper;
@Test
public void usertest(){
User user=userMapper.selectById(1);
System.out.println(user);
}
mybatis-plus中的BaseMapper的方法中selectById传入一个ID,就可以查询结果
selectById中sql语句为
select * from user where id=1
2查出所有的数据库的数据(selectList)
List<User> listuser=userMapper.selectList(null);
for(User user1:listuser){
System.out.println(user1);
sql语句为:SELECT id,user_name,age,email FROM user ,selectList中传入一个条件querywrapper。
3 根据entiy查询一条数据(selectOne)
@Test
public void usertest1(){
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.eq("user_name","Jone");
User user=userMapper.selectOne(wrapper);
System.out.println(user);
}
sql语句为 SELECT id,user_name,age,email FROM user WHERE (user_name = ?) ,这里使用条件构造器Querywrapper,QueryWrapper中方法eq中参数为(字段名,字段值)
4 根据id批量查询数据(selectBatchIds)
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(5);
list.add(3);
List<User> userList=userMapper.selectBatchIds(list);
for(User user:userList){
System.out.println(userList);
sql语句为 SELECT id,user_name,age,email FROM user WHERE id IN ( ? , ? , ? ) ,selectBatchIds中参数为一个集合
insert操作
User user=new User();
user.setUserName("James");
user.setAge(23);
user.setEmail("tes234t@qq.com");
int users=userMapper.insert(user);
System.out.println(users);
sql语句为 INSERT INTO user ( user_name, age, email ) VALUES ( ?, ?, ? )
update操作
1根据id更新(updateById)
User user=new User();
user.setId(11);
user.setUserName("小成");
int users=userMapper.updateById(user);
System.out.println(users);
sql语句为 UPDATE user SET user_name=? WHERE id=? ,updateById方法中参数为一个实体类(user),没有传入实体类不更新
2根据条件更新(update)
使用条件构造器更新(QueryWrapper)
User user=new User();
user.setAge(26);
user.setEmail("tes1234t@qq.com");
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.eq("user_name","Jone");
int users=userMapper.update(user,wrapper);
System.out.println(users);
sql语句为UPDATE user SET age=?, email=? WHERE (user_name = ?) 。
注:update方法传入两个参数,一个为实体类,另一个为wrapper,没有传入会报错
delete操作
1根据id删除一条数据(deleteById)
int deleteuser=userMapper.deleteById(11);
System.out.println(deleteuser);
sql语句为 DELETE FROM user WHERE id=?
注:deleteById传入是一个id,传入id后运行时自动生成sql DELETE FROM user WHERE id=?
2根据条件删除(delete)
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.eq("user_name","James");
int deletes=userMapper.delete(wrapper);
System.out.println(deletes);
sql语句为 DELETE FROM user WHERE (user_name = ?)
注 delete方法中参数是一个wrapper类,条件封装在QueryWrapper中。
7分页查询
1配置mybatis-plus插件(PaginationInterceptor)
@Configuration
public class MybatisplusConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
2分页查询(IPage)
Page<User> page=new Page<>(1,3);
IPage<User> userIPage=userMapper.selectPage(page,null);
System.out.println(userIPage);
sql语句为:SELECT id,user_name,age,email FROM user LIMIT ?,?
注:分页查询分两步进行,第一步先统计出user表中有多少条数据 sql语句为SELECT COUNT(1) FROM user ,第二步再查询user表,sql语句为 SELECT id,user_name,age,email FROM user LIMIT ?,? 。Page中有两个参数,current参数为显示当前页,size显示有几条数据。IPage中两个参数,一个是实体类(user),另一个为wrapper(查询条件),若无条件查询,则为null
3根据条件进行分页查询
Page<User> page=new Page<>(1,3);
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.eq("user_name","Jone");
IPage<User> userIPage=userMapper.selectPage(page,wrapper);
System.out.println(userIPage);
sel语句为 1 SELECT COUNT(1) FROM user WHERE (user_name = ?) ,2 SELECT id,user_name,age,email FROM user WHERE (user_name = ?) LIMIT ?,?
注:分页查询分两步进行,第一步先根据条件(wrapper)统计出user表中有多少条数据 sql语句为SELECT COUNT(1) FROM user WHERE (user_name = ?) ,第二步再根据条件(wrapper)查询user表,sql语句为SELECT id,user_name,age,email FROM user WHERE (user_name = ?) LIMIT ?,? 。Page中有两个参数,current参数为显示当前页,size显示有几条数据。IPage中两个参数,一个是实体类(user),另一个为wrapper(查询条件),若无条件查询,则为null
3根据条件进行分页查询
总结
MP的宗旨是简化开发,t提高效率。但是它也有不好的地方。在提供方便的同时却容易造成代码层次混乱,我们可能会把大量数据逻辑写到service层甚至contoller层中,使代码难以阅读。所以什么事都要取思考,在使用MP时一定要做分析,不要将所有数据操作都交给MP去实现,对于简单的单表数据操作用Mybatis-plus。一些复杂的数据操作如多表查询还是建议用mybatis中xml来操作。毕竟MP是mybatis增强版工具,原生mybatis功能还可以使用。