在使用Mybatis进行项目开发的时候,最繁琐的事情就是实体类,dao接口,mapper.xml文件的编写,几乎每个表都需要对应写一套,并且大部分的工作量都在最基本的增删改查上。如果表中的字段进行了修改,那么实体类,mapper文件甚至dao接口都要进行修改。
集成项目
- 导入Mybatisplus的依赖
注意:要首先删除Mybatis的依赖,因为Mybatisplus中包含有Mybatis的依赖 不需要独立导入 容易jar包冲突
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> 2.修改配置文件
3.给要数据库操作的实体类加Mybatisplus的注解
因为Mybatisplus不需要写mapper文件 不需要写sql 那么Mybatisplus怎么知道实体类和数据库表映射关系(ORM) 通过注解表明这种关系
1.给要数据库操作的实体类加Mybatisplus的注解
因为Mybatisplus不需要写mapper文件 不需要写sql 那么Mybatisplus怎么知道实体类和数据库表映射关系(ORM) 通过注解表明这种关系
/**
* @TableName("cmfz_admin") 将当前的实体类和数据库的表建立联系
* 注解参数:表名
*/
@TableName("cmfz_admin")
@Data
public class CmfzAdmin implements Serializable {
/**
* 主键属性 @TableId
*
* value 该属性对应的数据库表中的字段名
* type 主键自增的类型 AUTO 代表自动递增
*/
@TableId(value = "id",type = IdType.AUTO)
private Integer id;
/**
* 非主键属性 @TableField
* @TableField("username") 参数为该属性对应的数据库表中的字段名
*
*/
@TableField("username")
private String username;
@TableField("password")
private String password;
}
1.创建dao接口
import com.baizhi.entity.CmfzAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 注意:
* 1.接口中不需要写方法
* 2.接口需要继承MybatisPlus中的类 BaseMapper 泛型为 当前dao对应的实体类
*/
public interface CmfzAdminDao extends BaseMapper<CmfzAdmin> {
}
2.直接使用Mybatisplus的方法 开始增删改查
@Test
public void contextLoads() {
// 根据id查询
CmfzAdmin cmfzAdmin = cmfzAdminDao.selectById(1);
// System.out.println(cmfzAdmin);
// 查询所有 selectList(null);
List<CmfzAdmin> cmfzAdmins = cmfzAdminDao.selectList(null);
for (CmfzAdmin admin : cmfzAdmins) {
System.out.println(admin);
}
}
/**
* 添加
*/
@Test
public void test1(){
// 创建一个对象
CmfzAdmin cmfzAdmin = new CmfzAdmin();
cmfzAdmin.setUsername("hhhh");
cmfzAdmin.setPassword("123456");
// 添加 返回值是成功的条数
int insert = cmfzAdminDao.insert(cmfzAdmin);
System.out.println(insert);
}
/**
* 将id为5的管理员名字修改为lisi
*/
@Test
public void test2(){
CmfzAdmin cmfzAdmin = new CmfzAdmin();
cmfzAdmin.setId(5);
cmfzAdmin.setUsername("lisi");
// 根据id更新数据
int i = cmfzAdminDao.updateById(cmfzAdmin);
// 删除
/**
* deleteById() 根据id删除
* deleteBatchIds() 批量删除 参数是要删除的id的集合
*/
}
实现条件查询 (条件构造器的使用)
/**
* 要查询名字有zhangsan的管理员的信息
*/
@Test
public void test4(){
/**
* selectOne 查询一个方法
*
* selectOne 需要一个Wrapper对象 实际上是需要一个条件
*
* 条件是 查询名字为zhangsan管理员
* sql where username = zhangsan
* 需要 把 sql的条件 封装到 Wrapper对象 对象中
* 将封装了条件的对象 给 selectOne
*
* Wrapper对象 条件构造器 将sql的条件 写入到Java对象中
* QueryWrapper 查询条件构造器
* UpdateWrapper 更新的条件构造器
*/
// 1.创建一个条件构造器 泛型 为要查询数据的实体类类型
QueryWrapper<CmfzAdmin> queryWrapper = new QueryWrapper<>();
// 2.将 where username = zhangsan 等值查询 这个条件封装到 条件构造器
// username = zhangsan ---》 eq("username","zhangsan") 参数1 字段名 参数2 要查询的值
queryWrapper.eq("username","zhangsan");
// 3.通过条件构造器 查询
CmfzAdmin cmfzAdmin = cmfzAdminDao.selectOne(queryWrapper);
System.out.println(cmfzAdmin);
}
/**
* 查询 名字为 lisi 或者 密码为 123456 的管理员
*
* sql username = lisi or password = 123456
*
* or 和 and 怎么构建?
* eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'
*/
@Test
public void test5(){
// 1.创建条件构造器
QueryWrapper<CmfzAdmin> queryWrapper = new QueryWrapper<>();
// 2.构造条件 条件构造器的方法的第一个参数基本上都是字段名
queryWrapper.eq("username","lisi").or().eq("password","123456");
// 3.查询
/**
* 批量查询 selectList() 方法中如果参数是null 就是查询所有
*/
List<CmfzAdmin> cmfzAdmins = cmfzAdminDao.selectList(queryWrapper);
for (CmfzAdmin cmfzAdmin : cmfzAdmins) {
System.out.println(cmfzAdmin);
}
}
条件修改:把用户名为zhangsan的管理员密码修改为123456
/**
* 用法和查询类似
* 把用户名为zhangsan的管理员密码修改为123456
*
*/
@Test
public void test6(){
// 1.创建条件构造器
UpdateWrapper<CmfzAdmin> updateWrapper = new UpdateWrapper<>();
// 2.构造条件
// where username = zhangsan
// set password = 123456
updateWrapper.set("password","123123");
updateWrapper.eq("username","zhangsan");
// 3.使用方法修改
/**
* update
* 参数1 一个管理员对象 可以直接写null
* 参数2 条件构造器
*/
cmfzAdminDao.update(null,updateWrapper);
}
实现分页查询
1.配置分页插件 配置在启动类中即可
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
2.直接在代码可以使用分页查询
/**
* 测试分页查询
*
* 获取第二页的数据(页码) 每页显示两条(size)
*/
@Test
public void test7(){
// 1.创建一个page对象 封装分页数据
/**
* 创建对象的时候 直接写入分页数据
* 参数1 页码
* 参数2 每页条数
*/
Page<CmfzAdmin> adminPage = new Page<>(2,2);
// 2.使用分页查询的方法
/**
* 分页查询的方法 selectPage()
* 参数1 IPage 分页对象 封装分页信息 封装获取第二页的数据(页码) 每页显示两条(size)
* 参数2 条件构造器 可以直接写null
*/
Page<CmfzAdmin> cmfzAdminPage = cmfzAdminDao.selectPage(adminPage, null);
// 3.从Page对象中获取查询到的数据
/**
* getRecords() 获取查询结果
* getTotal() 总条数
*/
System.out.println("总条数:"+cmfzAdminPage.getTotal()); List<CmfzAdmin> adminList = cmfzAdminPage.getRecords();
for (CmfzAdmin cmfzAdmin : adminList) {
System.out.println(cmfzAdmin);
}
}