前言:这里使用的是SpringBoot整合MybtisPlus项目。
1、创建springboot整合mybatis plus的项目。
2、创建用户实体类,有/无参构造函数与toString/set/get这里省略。
public class User{
private Integer id;
private String name;
}
3、创建接口类,使用mybatis plus必须继承BaseMapper泛型为要操作的类名,数据库的表明也要与实体类的表名一直,不区分大小写。
@Mapper
public interface UserDao extends BaseMapper {
}
4、创建测试类
@SpringBootTest
class MybatisPlusStringBootApplicationTests {
@Autowired
private UserDao userDao;
@Test
void addUser() {
User user = new User(3, "李三新");
//添加用户
userDao.insert(user);
}
@Test
void delUser() {
//删除用户
userDao.deleteById(3);
}
@Test
void updataUser() {
//更新用户信息,为null的属性不更新
User user = new User(2, "李er新");
userDao.updateById(user);
}
@Test
void queryAll() {
//查询所有的用户并输出
userDao.selectList(null).forEach(System.out::println);
}
}
使用mybatis plus进行分页
创建拦截器类(mybatis plus使用分页功能,必须要有拦截器)
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor pageInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
进行分页
@SpringBootTest
class MybatisPlusStringBootApplicationTests {
@Autowired
private UserDao userDao;
@Test
void page() {
//第一个参数代表当前页数,第二个代表每页要展示的数据量
IPage page = new Page(4, 30);
userDao.selectPage(page, null);
System.out.println("当前页码:" + page.getCurrent());
System.out.println("每页数据总量:" + page.getSize());
System.out.println("总页数:" + page.getPages());
System.out.println("当前页码:" + page.getTotal());
System.out.println("当前页数据:" + page.getRecords());
}
}
在yml中配置启用在控制台输出mybatis plus日志。
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
条件可以添加多个,LambdaQueryWrapper的方法支持链式编程。
@SpringBootTest
class MybatisPlusStringBootApplicationTests {
@Test
void queryAll() {
//id小于十八的
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.lt("id", 18);
userDao.selectList(queryWrapper).forEach(System.out::println);
//id小于十八的
QueryWrapper qw = new QueryWrapper<>();
qw.lambda().lt(User::getId, 18);
userDao.selectList(qw).forEach(System.out::println);
//id小于十八的
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
lqw.lt(User::getId, 18);
userDao.selectList(lqw).forEach(System.out::println);
//id小于十八,大于5的
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
lqw.lt(User::getId, 10);
lqw.gt(User::getId, 2);
//或者 lqw.lt(User::getId, 10).gt(User::getId, 2);
userDao.selectList(lqw).forEach(System.out::println);
//id小于十八,大于5的
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
lqw.lt(User::getId, 10);
lqw.gt(User::getId, 2);
//或者 lqw.lt(User::getId, 10).gt(User::getId, 2);
userDao.selectList(lqw).forEach(System.out::println);
}
}
//如果条件成立则拼接,如果第一个条件不成立,不影响链式编程的第二个。
lqw.gt(min != null, User::getId, min).lt(max != null, User::getId, max);
方法一
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//设置要查询的值,参数任意
lqw.select(User::getId);
userDao.selectList(lqw).forEach(System.out::println);
方法二
QueryWrapper lqw = new QueryWrapper<>();
//设置要查询的值,参数任意
lqw.select("id,name");
userDao.selectList(lqw).forEach(System.out::println);
查询总共多少条数据:
QueryWrapper lqw = new QueryWrapper<>();
lqw.select("count(*) as count");
List
按性别分组,统计人数:
QueryWrapper lqw = new QueryWrapper<>();
lqw.select("sex,count(*) as count");
lqw.groupBy("sex");
List
判断账号密码是否正确:
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//判断账号密码
lqw.eq(User::getAccount, "846581636").eq(User::getPassword, "123456");
//selectOne方法用于查询一条数据
User user = userDao.selectOne(lqw);
System.out.println(user);
lt:小于
le:小于等于
gt:大于
ge:大于等于
eq:等于
between:范围查询(lambdaQueryWrapper.between(User::getAge,10,30));查询范围在
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//查询带有新的用户名
lqe.like(User::getName,"新");
List userList = userDao.selectList(lqw);
System.out.println(userList);
用于解决字段名与数据库中列名不同的情况。
public class User{
//数据库中的字段名是userAccount
@TableField(value = "userAccount")
private String account;
}
public class User{
//表示这个属性就是在类中用的数据库中没有对应的列
@TableField(exist = false)
private String account;
//与上面一样的效果
private transient String sex;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
//为false时该字段不参与查询
@TableField(select = false)
private String password;
}
通过@TableName注解指定对应的表名:
@TableName("tab_User")
public class User{
private Integer id;
private String name;
private String sex;
}
批量删除
List list = new ArrayList<>();
list.add(4L);
list.add(5L);
userDao.deleteBatchIds(list);
批量查询
List list = new ArrayList<>();
list.add(4L);
list.add(5L);
userDao.selectBatchIds(list).forEach(System.out::println);
表中添加对应字段deleted,int型,长度为1,默认为0(0表示没有删除,1表示删除了)
对数据库的CRUD操作都不会操作逻辑删除的数据。
删除的时候不是真正意义的删除是执行的update语句,把对应字段设置为删除状态。
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private String sex;
@TableLogic(value = "0", delval = "1") //逻辑删除字段,0是没有删除,1是删除了
private int deleted;
}
可在application.yml中可设置通用的逻辑删除配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted //逻辑删除字段
logic-delete-value: 0 //数据存在时的逻辑值
logic-not-delete-value: 1 //数据删除时的逻辑值
可以用于商品的秒杀。
表中添加对应字段version,int型,长度为11,默认为1。
该字段每操作一次mybarisplus都对自增一。
一般操作是先从数据库中查询对应的商品id查商品,把商品信息返回到前端,前端更改后再把信息返回到后端进行写入到数据可。
Goods goods = goods Dao.selectById(1);
user.setName("苹果");
goodsDao.updateById(goods);
使用mybatisPlus提供有义务层调用接口(IService
通用类基础上左功能重载或功能追加。
public interface IBookService extends IService {
}
@Service
public class MyServiceImpl extends ServiceImpl implements IBookService{
}
@Autowired
private MyServiceImpl myService;
@Test
void contextLoads() {
myService.list().forEach(System.out::println);
}