您的位置:首页 > 其它

MyBatis-Plus基础入门

2020-07-15 05:37 190 查看

MyBatis-Plus基础入门

MyBatis-Plus入门

简介:Mybatis-Plus(MP)在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。本课程从现有持久层框架存在的问题切入,引出MP在项目开发中能为我们解决哪些问题。课程中细致地讲解了MP的核心功能;并且结合实际场景,讲解了某些方法在特定场景下的使用。如果想进一步提升,请观看《MyBatis-Plus进阶》课程,链接在此:https://www.imooc.com/learn/1171

第1章 简介

  1. Mybatis与JPA对比

    Mybatis优势
    MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
    MyBatis容易掌握,而Hibernate门槛较高。

    Hibernate优势
    Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
    Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
    Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
    Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳

  2. Mybatis-Plus简介

    MP是Mybatis的增强工具,只做增强不做改变。

    MP框架结构:

  3. Mybatis-Plus特性

第2章 基本使用

  1. 通用传统模式简介

    2.排除非表字段的三种方式
    1.transient关键字
    2.使用静态变量(static)
    3.TableField(exit=false)

第3章 MyBatis-Plus查询方法

  1. 普通查询
    (1)单表查询所有记录 selectList

    @Test
    public void testSelect() {
    System.out.println(("----- 单表查询所有记录------"));
    List<User> userList = userMapper.selectList(null);
    Assert.assertEquals(6, userList.size()); //表里面的记录总条数是否等于6,如果等于6,则测试通过
    userList.forEach(System.out::println);
    }

    (2)单表根据主键id查询单条记录 selectById

    @Test
    public void testSelectById() {
    System.out.println(("----- 单表根据主键id查询单条记录 ------"));
    User user = userMapper.selectById(2);
    System.out.println(user);
    }

    (3)单表根据条件查询 selectByMap

    @Test
    public void testSelectByMap() {
    System.out.println(("----- 单表根据条件查询 ------"));
    Map<String, Object> conditions = new HashMap<>();
    conditions.put("name", "Jack");
    conditions.put("age", 20);
    ist<User> userList= userMapper.selectByMap(conditions);
    userList.forEach(System.out::println);
    }
  2. 条件构造器查询
    (1)多eq

    QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
    queryWrapper.lambda()
    .and(obj ->
    obj.eq(Student::getName, "西夏")
    .eq(Student::getAge, 26));
    List<Student> studentList = list(queryWrapper);
    for (Student student : studentList)
    Console.info(new Gson().toJson(student));

    (2)or

    QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
    queryWrapper.lambda()
    .or(obj1 -> obj1.eq(Student::getName, "西夏"))
    .or(obj2 -> obj2.eq(Student::getName, "1"));
    List<Student> studentList = list(queryWrapper);
    for (Student student : studentList)

    SQL语句:

    SELECT * FROM t_student WHERE ( name = ? ) OR ( name = ? )

    条件参数说明

    询方式 说明
    setSqlSelect 设置 SELECT 查询字段
    where WHERE 语句,拼接 + WHERE 条件
    nd AND 语句,拼接 + AND 字段=值
    andNew AND 语句,拼接 + AND (字段=值)
    r OR 语句,拼接 + OR 字段=值
    orNew OR 语句,拼接 + OR (字段=值)
    eq 等于=
    ne 不等于<>
    gt 大于>
    ge 大于等于>=
    lt 小于<
    le 小于等于<=
    like 模糊查询 LIKE
    notLike 模糊查询 NOT LIKE
    in IN 查询
    notIn NOT IN 查询
    isNull NULL 值查询
    groupBy 分组 GROUP BY
    orderBy 排序 ORDER BY
    orderAsc ASC 排序
    orderDesc DESC 排序
    exists EXISTS 条件语句
    between BETWEEN 条件语句
    addFilter 自由拼接 SQL
  3. 分页查询
    (1)创建分页插件

    @Bean
    public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
    }

    (2)测试分页

    /**
    * myabtis 实现的分页为什么还要分页插件?
    * <p>
    * 1.mybatis实现得分页时逻辑分页或者叫做内存不是物理分页
    * 2.他是把符合条件的数据全部查询出来放到内存中,然后返回你需要的那部分
    * 3.表中数据不多时,可以使用,速度慢一些;当数据量大时,建议使用物理分页
    */
    @Test
    public void selectPage() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 26);
    //总页数+总记录数
    //        Page<User> page = new Page<>(1, 2);
    
    //      不返回总记录数 设置false
    Page<User> page = new Page<>(1, 2, false);
    //第一种
    //        IPage<User> iPage = userMapper.selectPage(page, queryWrapper);
    //        System.out.println("总页数:"+iPage.getPages());
    //        System.out.println("总记录数:"+iPage.getTotal());
    
    //第二种
    IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(page, queryWrapper);
    System.out.println("总页数:" + iPage.getPages());
    System.out.println("总记录数:" + iPage.getTotal());
    List<Map<String, Object>> userList = iPage.getRecords();
    userList.forEach(System.out::println);
    }
  4. 自定义sql
    (1)找到 Dao,写一个数据库操作接口

    public interface StudentDao extends BaseMapper<Student> {
    
    List<Student> selectAll();
    }

    (2)在xml文件中写sql

    <!--List<Student> selectAll();-->
    <select id="selectAll" resultMap="BaseResultMap">
    select * from t_student
    </select>

    最后

    @Resource
    StudentDao studentDao;
    List<Student> studentList = studentDao.selectAll();
    for (Student student : studentList){
    Console.info(new Gson().toJson(student));
    }

第4章 更新及删除

更新及删除

第5章 AR模式、主键策略

1.AR模式
(1)实体类对象继承Model

@EqualsAndHashCode(callSuper = false)
@Data
public class User extends Model<User> {
// 主键
private Long id;
//姓名
@TableField(condition = SqlCondition.LIKE)
private String name;
//年龄
@TableField(condition ="%s&lt;#{%s}")
private Integer age;
//邮箱
private String email;
// 上级id
private Long manager_id;
//创建时间
private LocalDateTime createTime;
}

(2)接口服务类继承baseMapper接口

public interface UserMapper extends BaseMapper<User> {}

(3) 测试AR

@Component
public class UserMapperARTest extends MybatisPlusSamplesChapter1ApplicationTests {
@Test
public void insertAR(){
User user = new User();
user.setName("刘华");
user.setAge(20);
user.setEmail("test@gblfy.com");
user.setManager_id(1111L);
user.setCreateTime(LocalDateTime.now());
boolean insert = user.insert();
System.out.println(insert);
}

@Test
public void selectByIdAR(){
User user = new User();
User user1 = user.selectById(111L);
System.out.println(user == user1);
System.out.println(user1);
}

@Test
public void selectByIdAR2(){
User user = new User();
user.setId(11L);
User user1 = user.selectById();
System.out.println(user == user1);
System.out.println(user1);
}

@Test
public void updateByIdAR(){
User user = new User();
user.setId(11L);
user.setName("你的纳斯达克");
boolean user1 = user.updateById();
System.out.println(user1);
}

@Test
public void delByIdAR(){
User user = new User();
user.setId(11L);
boolean user1 = user.deleteById();
System.out.println(user1);
}
}

2.主键策略

mybatis plus 实体类主键策略有3种( 注解 > 全局 > 默认 )

(1)注解方式
@TableId(type = IdType.AUTO)在实体类增加注解即可

(2)全局
生成数字型ID:895503808246718464,ID长度超出JavaScript

(3)默认,mybatis plus默认使用全局唯一的数字类型
ID_WORKER(2, “全局唯一ID”),生成的ID格式:ccba0a05fcbe46898304d5213d2b5518

第6章 通用service

(1)新建接口UserService

public interface UserService extends IService<User> {
}

(2)UserService的实现类 UserServiceImpl

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

(3)测试类

@Autowired
private UserService userService;
@Test
public void selectOneService() {
User user = userService.getOne((Wrapper<User>) queryWrapper.gt("age", 30), false);
}

一般Java项目分层

参考:
https://blog.csdn.net/modelsetget/article/details/89972714
https://www.cnblogs.com/jackson0714/p/study-mybatis-plus2.html#_label2
https://blog.csdn.net/weixin_40816738/article/details/93382602
http://www.manongjc.com/detail/7-tcbnqblvvvqvspe.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: