为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatis Plus学习笔记(四)

标签:
Java SSM

image-20210203114259465

4. 注解

4.1. @TableName

po和表名的映射,也就是说po文件的名称可以和数据库表名不一致的时候可以通过这个注解来映射。
比如我们将数据库表名改为tbl_user,然后在po上加上TableName注解,再次执行测试,注意sql语句的变化。

@Data
@TableName("tbl_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

此时打印的sql语句上会自动转换为配置的表名tbl_user

10:49:11.579 [main] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.mysql.jdbc.JDBC4Connection@72889280] will not be managed by Spring
10:49:11.584 [main] DEBUG com.zzlh.mp.mapper.UserMapper.selectList - ==>  Preparing: SELECT id,name,age,email FROM tbl_user 
10:49:11.604 [main] DEBUG com.zzlh.mp.mapper.UserMapper.selectList - ==> Parameters: 
10:49:11.616 [main] DEBUG com.zzlh.mp.mapper.UserMapper.selectList - <==      Total: 8
10:49:11.617 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66f66866]
10:49:11.617 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
User(id=6, name=张三, age=34, email=22@qq.com)
User(id=7, name=李四, age=33, email=ls@qq.com)
User(id=8, name=王五, age=34, email=ww@qq.com)

全局的 MP 配置:
如果所有的表都有相同的前缀,那么我们可以通过MP的全局配置来统一完成,而不需要每个po都要加注解。

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

在spring配置文件里面配置MP的全局配置

<!-- 配置sqlsessionFactory -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
    <!--加入MP的全局配置-->
    <property name="globalConfig" ref="globalConfig"></property>
    <!--<property name="mapperLocations" value="classpath:mapper/*.xml"></property>-->
</bean>

<!--MP的全局配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
    <property name="dbConfig" ref="dbConfig"/>
</bean>
<!--数据库配置-->
<bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
    <property name="tablePrefix" value="tbl_"/>
</bean>

再次执行测试,查看打印sql语句:

11:03:57.063 [main] DEBUG com.zzlh.mp.mapper.UserMapper.selectList - ==>  Preparing: SELECT id,name,age,email FROM tbl_user 
11:03:57.080 [main] DEBUG com.zzlh.mp.mapper.UserMapper.selectList - ==> Parameters: 
11:03:57.091 [main] DEBUG com.zzlh.mp.mapper.UserMapper.selectList - <==      Total: 8
11:03:57.092 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@328572f0]
11:03:57.092 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
User(id=6, name=张三, age=34, email=22@qq.com)
User(id=7, name=李四, age=33, email=ls@qq.com)
User(id=8, name=王五, age=34, email=ww@qq.com)

4.2. @TableField

字段注解(非主键),对非主键的字段进行配置。
两个比较重要的属性,value用来和数据库的字段进行映射;exist用来排除数据库中不存在的字段。

@Data
//@TableName("tbl_user")
public class User {
    private Long id;
    @TableField("last_Name")
    private String lastName;
    private Integer age;
    private String email;
    @TableField(exist = false)
    private int level;
}

如果数据库中的字段我们改为last_name,po中使用lastName,那么就可以使用value属性进行映射绑定,
另外po中一下用于显示自定义的属性,而数据库字段中并没有对应的字段,可以使用exist进行排除。
执行测试方法,查看日志打印的sql语句,可以看到lastName自动转为last_Name,level并没有出现在语句中。

11:21:23.018 [main] DEBUG com.zzlh.mp.mapper.UserMapper.insert - ==>  Preparing: INSERT INTO tbl_user ( id, last_Name, age, email ) VALUES ( ?, ?, ?, ? ) 
11:21:23.036 [main] DEBUG com.zzlh.mp.mapper.UserMapper.insert - ==> Parameters: 8(Long), 王五(String), 34(Integer), ww@qq.com(String)
11:21:23.054 [main] DEBUG com.zzlh.mp.mapper.UserMapper.insert - <==    Updates: 1

全局的 MP 配置:
老版本的MP需要在全局配置里配置dbColumnUnderline,来支持全局的字段支持下划线转驼峰的映射。新版本里面已经没有这个属性了,我这里将@TableField注解取消掉试了一下查询,字段自动转化为带下划线的名称。

4.3. @TableId

主键注解,这个注解有两个属性:value用来指定主键和po字段的映射,type用来指定主键的生成策略。

@Data
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private long id;
    @TableField("last_Name")
    private String lastName;
    private Integer age;
    private String email;
    @TableField(exist = false)
    private int level;
}

主键生成策略

描述
AUTO 数据库自增
NONE 无状态
INPUT 自行输入
ID_WORKER 分布式全局唯一ID 长整型类型
UUID 32位UUID字符串
ID_WORKER_STR 分布式全局唯一ID 字符串类型

注:ID_WORKER、UUID、ID_WORKER_STR 3种类型、只有当插入对象ID 为空,才自动填充。

全局的 MP 配置:

<!-- 配置sqlsessionFactory -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
    <!--加入MP的全局配置-->
    <property name="globalConfig" ref="globalConfig"></property>
</bean>

<!--MP的全局配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
    <property name="dbConfig" ref="dbConfig"/>
</bean>
<!--数据库配置-->
<bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
    <property name="tablePrefix" value="tbl_"/>
    <property name="idType"  value="AUTO"></property>
</bean>

8 支持主键自增的数据库插入数据获取主键值

  • Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>
  • MP: 自动将主键值回写到实体类中

4.4. @Version

乐观锁注解、标记 @Verison 在字段上,配合乐观锁插件使用。

4.5. @EnumValue

通枚举类注解(注解在枚举字段上),配合通用枚举使用。

4.6. @TableLogic

表字段逻辑处理注解(逻辑删除),配合逻辑删除插件使用。

属性 类型 必须指定 默认值 描述
value String “” 逻辑未删除值
delval String “” 逻辑删除值

4.7. @SqlParser

租户注解 目前只支持注解在 mapper 的方法上(3.1.1开始支持注解在mapper上),配合多租户插件使用。

属性 类型 必须指定 默认值 描述
filter boolean false true: 表示过滤SQL解析,即不会进入ISqlParser解析链,否则会进解析链并追加例如tenant_id等条件

4.8. @KeySequence

序列主键策略 oracle,属性:value、resultMap。和自动填充类似,只不过是调用数据库的Sequence。

属性 类型 必须指定 默认值 描述
value String “” 序列名
clazz Class Long.class id的类型, 可以指定String.class,这样返回的Sequence值是字符串"1"
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消