Mybatis-Plus学习day01(上)

简介: Mybatis-Plus学习day01

Mybatis-Plus学习day01

1.Mybatis-Plus常用注解

@TableName:对数据表名注解 当数据库表名与实体类名不一致时,需要该注解进行制定数据库名.

@TableName("tb_user")
public class User(){...}//表名数据库表tb_user与User进行对应.

@TableId:表主键标识 对主键的类型进行制定如:自增,随机字符串,不指定…

@TableId(value = “id”, type = IdType.AUTO):自增

@TableId(type=IdType.AUTO)
private Long id;

@TableId(value = “id”, type = IdType.ID_WORKER_STR):分布式全局唯一ID字符串类型


@TableId(value = “id”, type = IdType.INPUT):自行输入


@TableId(value = “id”, type = IdType.ID_WORKER):分布式全局唯一ID 长整型类型


@TableId(value = “id”, type = IdType.UUID):32位UUID字符串


@TableId(value = “id”, type = IdType.NONE):无状态


@TableField:表字段标识 可以指定字段的一些属性,常常解决的问题有2个


1、对象中的属性名和字段名不一致的问题(非驼峰)

2、对象中的属性字段在表中不存在的问题

@TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的。

@TableField(exist = false)
private String address;//该字段在数据库中不存在

@TableField(exist = true):表示该属性为数据库表字段。

@TableField(value= "email")//表示数据库的email字段对应实体中的mail属性.
private String mail;


@TableField(condition = SqlCondition.LIKE):表示该属性可以模糊搜索。


@TableField(fill = FieldFill.INSERT):注解填充字段 ,生成器策略部分也可以配置!


@FieldStrategy:


@FieldFill


@Version:乐观锁注解、标记


@EnumValue:通枚举类注解


@TableLogic:表字段逻辑处理注解(逻辑删除)


@SqlParser:租户注解


2.Mybatis-Plus整合

3.通用CRUD

说明:


说明:


通用 CRUD 封装BaseMapper (opens new window)接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器

泛型 T 为任意实体对象

参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键

对象 Wrapper 为 条件构造器


Insert


// 插入一条记录
int insert(T entity);


测试代码:

@Test
void testInsert() {
    User user = new User();
    user.setAge(20);
    user.setEmail("2422737092@qq.com");
    user.setName("赵云");
    user.setUserName("zhaoyun");
    user.setPassword("123456");
    int result = userMapper.insert(user);//返回的是受影响的行数
    System.out.println("result = "+result);
    System.out.println(user.getId());//自增后的id会回填到对象中.
}

Delete

// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);


参数说明


image.png

 @Test
    public void testDelete(){
        int result = userMapper.deleteById(7L);
        System.out.println("result==>"+result);
    }
    @Test
    public void testDeleteByMap(){
        Map <String, Object> map = new HashMap <>();
        map.put("user_name","zhaoyun");
        map.put("password", "123456");
        //根据map删除数据,多条件之间是and关系
        int result = userMapper.deleteByMap(map);
        System.out.println("result==>"+result);
    }
    @Test
    public void testDeleteByCondition(){
        // QueryWrapper <User> wrapper = new QueryWrapper <>();
        // wrapper.eq("user_name","sunqi").eq("password","123456");
        // int result = userMapper.delete(wrapper);
        //用法二   建议使用这种...
        User user = new User();
        user.setPassword("123456");
        user.setUserName("zhanglong");
        QueryWrapper <User> wrapper = new QueryWrapper <>(user);
        int result = userMapper.delete(wrapper);
        System.out.println("--------------------------result==>"+result);
    }
    @Test
    public void testDeleteBatchIds(){
        //根据ID批量删除数据
        int result = userMapper.deleteBatchIds(Arrays.asList(17L, 18L));
        System.out.println("--------------------------result==>"+result);
    }

Update

// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
参数说明
类型 参数名 描述
T entity 实体对象 (set 条件值,可为 null)
Wrapper updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)


 @Test
    void testUpdateById(){
        User user = new User();
        user.setId(1L);//条件:根据id进行变更
        user.setAge(21);//除了ID之外的都是要变更的字段.
        user.setPassword("6666666");
        int resut = this.userMapper.updateById(user);
        System.out.println("result ==>> "+resut);
    }
    //根据条件进行更新
    @Test
    void testUpdate(){
        User user = new User();
        user.setAge(20);;
        user.setPassword("8888888");
        QueryWrapper<User> wrapper = new QueryWrapper();
        wrapper.eq("user_name","zhangsan");//匹配user_name=zhangsan的数据表中的列.
        int result = userMapper.update(user, wrapper);
        System.out.println("result ==> "+result);
    }
    @Test
    public void testUpdate2(){
        //更新的条件以及字段
        UpdateWrapper <User> wrapper = new UpdateWrapper <>();//该UpdateWrapper可以直接使用set方法添加要更新的属性值.
        wrapper.eq("id",7).set("age",22);
        int result = userMapper.update(null, wrapper);
        System.out.println("result ==>>"+result);
    }

Select

// 根据 ID 查询
T selectById(Serializable id);
// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
参数说明

image.png

测试代码:

@Test
    public void testSelectById(){
        User user = userMapper.selectById(2L);
        System.out.println(user);
    }
    @Test
    public void testSelectBatchIds(){
        List <User> users = userMapper.selectBatchIds(Arrays.asList(2L, 3L, 4L));
        for (User user : users) {
            System.out.println(user);
        }
    }
    //根据自定义条件进行查询
    @Test
    public void testSelectOne(){
        QueryWrapper <User> wrapper = new QueryWrapper <>();
        wrapper.eq("password","123456");
        User user = userMapper.selectOne(wrapper);
        //查询的数据超过一条时,会抛出异常
        System.out.println(user);
    }
    @Test
    public void testSelectCount(){
        QueryWrapper <User> wrapper = new QueryWrapper <>();
        wrapper.gt("age", 20);
        //根据条件查询数据条数
        Integer count = userMapper.selectCount(wrapper);
        System.out.println("count==>"+count);
    }
    @Test
    public void testSelectList(){
        QueryWrapper <User> wrapper = new QueryWrapper <>();
        wrapper.like("email", "3258843538");
        List <User> userList = userMapper.selectList(wrapper);
        for (User user : userList) {
            System.out.println(user);
        }
    }
    @Test
    public void testSelectPage(){
        Page <User> page = new Page <>(3, 1);
        QueryWrapper <User> wrapper = new QueryWrapper <>();
        wrapper.like("email","3258843538");
        IPage <User> iPage = userMapper.selectPage(page, wrapper);
        //最后这些属性既可以通过page也可以通过iPage获取,因为分页后的数据会被重新封装到这些对象里面.  
        System.out.println("数据总条数:"+iPage.getTotal());
        System.out.println("数据总页数"+iPage.getPages());
        System.out.println("当前页数"+iPage.getCurrent());
        List <User> records = iPage.getRecords();
        for (User record : records) {
            System.out.println(record);
        }
    }

和selectPage搭配的配置类:

@Configuration
@MapperScan("com.rg.boot.mapper")//设置Mapper接口的扫描包
//@Mapper:在接口类上添加了@Mapper在运行时,通过动态代理生成接口实现类
// @MapperScan作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在运行时都会生成相应的实现类,这样就不用每个接口都添加@Mapper
public class MybatisPlusConfig {
    //分页插件
    //PaginationInnerInterceptor
    @Bean
    public MybatisPlusInterceptor paginationInnerInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

4.配置

在MP中有大量的配置,其中一部分是Mybatis原生的配置,另一部分是MP的配置

4.1基本配置

4.1.1、configLocation

MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。 MyBatis

Configuration 的具体内容请参考MyBatis 官方文档

SpringBoot:

mybatis-plus:
  config-location: classpath:mybatis-config.xml

SpringMVC:


<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
  <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>


4.1.2、mapperLocations

MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。

Spring Boot:


mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml

Spring MVC:

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
  <property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>

注意:Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)

测试代码:

######################UserMapper.xml(位于mapper文件夹下)################################
<mapper namespace="com.rg.boot.mapper.UserMapper">
    <select id="findById" resultType="com.rg.boot.bean.User">
        select * from tb_user where id = #{id}
    </select>
</mapper>
##########################测试方法####################################################  
  @Test
    public void testFindById(){
        User user = userMapper.findById(2L);
        System.out.println(user);
    }  
#########################yaml配置文件#################################################
mybatis-plus:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath*:mapper/*.xml
相关文章
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
148 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
3月前
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
50 5
|
4月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
4月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
4月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
4月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
4月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
4月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
7月前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
|
6月前
|
Java 数据库连接 Maven
Mybatis学习
Mybatis学习
29 0