博客
关于我
Mybatis老手复习文档
阅读量:443 次
发布时间:2019-03-06

本文共 7270 字,大约阅读时间需要 24 分钟。

Mybatis学习笔记

再次学习Mybatis,日后,有时间会把这个文档更新,改的越来越好,然后,改成新手老手通用的文档

1、我的认识

Mybatis 是一个持久层框架,(之前 我虽然学了这个mybatis但一直 没有深入的学习,只是达到会用的程度,没有写过什么笔记,后来转jpa+hibernate和tk.mybatis),用jpa用久了之后,需要用到mybatis时候才来用的mybatis

  • mybatis永不过时
  • 经常听说人家说mybatis效率不高,可是 这几天重学mybatis我发现,mybatis对于某些细节上做的是非常不错的,虽然,这些在jpa内都可以使用注解 来做,但是,对于快捷的持久层框架来说,灵活又强大,才能使一个框架走的越远
  • 动态SQL的细节,是我最喜欢mybatis的地方,因为,使用mybatis的动态sql标签,你可以做很多,“骚操作”例如使用那些动态sql标签来简化的你的业务的冗余代码===我目前发现,框架好像都在做一件事解耦

下面是maven坐标

org.mybatis
mybatis
3.4.6

2、一个Mybatis的开始

官网其实很详细:

不过我要做的是更简单化的复习mybatis框架

package com.pipihao.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;import java.util.Date;@Data@NoArgsConstructor@AllArgsConstructorpublic class Blog implements Serializable {    private String id;    private String title;    private String author;    private Date createTime;    private int view;}

首先是mybatis-config.xml配置文件,这个文件主要是用的配置mybatis的一些操作,例如:扫描一个xxx.xxx.mapper的包

3、一个例子

首先我们得写一个XxxMapper类,下面我以BlogMapper为例

package com.pipihao.mapper;import com.pipihao.pojo.Blog;import org.apache.ibatis.annotations.Param;import java.util.List;import java.util.Map;public interface BlogMapper {    Blog findBlogById(int id);}

在这个类目录的下面要配置一个BlogMapper.xml

4、配置配置解析

其实我个人觉得这个配置文件,的太多细节在这个官方文档内,而我目前主要是记录下一些 常用的

  • [ ] db.properties配置文件:properties文件的优先级大于mybatis-config.xml内 的properties的property的优先级,不过一般多是在db.properties配置好,然后在mybatis-config.xml中引入直接使用

configuration(配置)

  • environments(环境配置)
    • environment(环境变量)
      • transactionManager(事务管理器)
      • dataSource(数据源)

5、配置映射

如果你的字段名和mysql的字段名都是规范的对应命名

例如: JavaBean的命名createTime ,mysql的字段命名create_time

这样则大多数不需要配置映射,只需要开在mybatis-config.xml中的setting中开启一个值即可

希望你是使用的规范命名,不然你的代码会显得很low

如何配置映射

6、日志

  • 主要是log4j 还有 配置

7、分页

mybatis提供了一个rowBunds分页,不过仔细看了之后,发现还不如使用mysql的分页,缺点是增加了代码量,然后该做还是要做,并没有省什么操作(这里我建议,要么使用PageHelper,要么自己做原生的分页查询)

原生分页

RowBunds

RowBounds rowBounds = new RowBounds(0,2);List
rolesByrowBounds = mapper.findBlogById(rowBounds);System.out.println(rolesByrowBounds.size());

8、使用注解开发

主要是注解开发也可以达到跟xml配置一样的 效果,所以在以后 的开发之中,大多数使用的是注解开发,但不过,xml,永不过时

@Select @Insert @Update @Delete

public interface StudentMapper {    @Select("select * from student where id = #{sid}")    Students getStudentById(@Param("sid")int sid);}

这个再提一下@Results 注解,这个是可以在注解实现和resultMap一样功能的注解,也可以设置id,可以复用

下面这个 是复制网上,大概知道这个有这个东西就可以了

@Results(id="groupWithUsers",         value = {             @Result(property = "groupId", column = "group_id", id = true),            @Result(property = "name", column = "name"),             @Result(property = "accountId", column = "account_id"),            @Result(property = "deleteFlag", column = "delete_Flag"),            @Result(property = "parentId", column = "parent_Id"),             @Result(property = "userList", javaType=List.class, many =@Many(select="selectUsersByGroupId"), column = "group_id")})//查询@Select({"select * from group where account_id=#{accountId} and delete_flag=0"})List
selectGroupWithUsers(@Param("accountId") String accountId);

9、多对一处理

10、一对多处理

主要还是看怎么用

小结:

  1. 关联-association [多对一]
  2. 集合-collection [一对多]
  3. javaType & ofType
    1. javaType 用来指定实体类中属性的类型
    2. ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!
  • 注意点:
    1. 保证 Sql的可读性,尽量保证通俗易懂
    2. 注意一对多和我对一中,属性我和字段的问题
    3. 如果问题不好排查错误,可以使用日志 ,建议使用Log4j
  • 以后 要学 Mysql引擎,InnoDB底层原理, 索引 ,索引优化

11、 动态SQL

mapUnderscoreToCamelCase	是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。	true | false	False

choose我没有设置了,因为 choose是类似于一个switch case一次只会选择一个条件语句进行执行

动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了。

insert into blog (id,title,author,create_time,view) values ( #{id},#{title},#{author},#{createTime},#{view} );
and title = #{title}
and author= #{author}
update blog
title=#{title}
title=#{author}
where id = #{id}

,choose,when,otherwise 这个类似switch case一次只会执行一个条件,本命的不执行

trim, 可以 给SQL语句加上前缀和后缀,然后,也可以去除某些前缀或后缀

foreach,可以遍历拼接sql

List
findBlogByList(@Param("ids")List
ids);

include,sql 增加mybatis的xml配置的复用性

and title = #{title}
and author= #{author}

where,if 和上面的代码意义相同,只是上面的代码,在业务复杂的情况下,耦合度更低

建议:

  • 先在Mysql中写出完整的SQL,再对应的去修改成为我们的动态 SQL实现通用即可!

12、缓存

这个在上面的配置文件配置了

一级缓存

默认开启的

小结:一极缓存黑夜是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段!一级缓存就相当于一个Map

二级缓存

设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false true

小结:

  • 只要开启了二级缓存,在同一个Mapper下就有效
  • 所有的数据都会先放在一级缓存中
  • 只有当会话提交,或者的时候,才会提交到二级缓存中!

小结:

  1. Mybatis相比于JPA的各种无根报错, 我倒觉得mybatis更加好用,因为我之前是重度的JPA用户,使用Mybatis不仅可以 提升自己的SQL水平,而且通过动态SQL还可以增加自己的业务水平上限
  2. Mybatis的优点:快捷、易于学习、功能强大(虽然现在有REDIS这样的极限工具)但是,mybatis还是可以使用他自带的缓存,因为 一般的小项目可能大多数都可以使用他自带的二级缓存。
  3. 且Mybatis的还是有一定的插件生态的,pagehelper,mybatis plus都是经典,相对持久层而言,如果 项目 不是特别大,我个人而言还是会优先使用 mybatis
  4. JPA的熟练度也不高,只是达到那种CRUD的水平,难一点, 的优化我也不会,以后一定会的
  5. 加个油,有错误请大佬指出,谢谢

转载地址:http://wfkfz.baihongyu.com/

你可能感兴趣的文章
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>