mybatis学习
- 官网:https://mybatis.org/mybatis-3/zh/configuration.html
- 什么是mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- 持久化
- 持久层就是将程序的数据在持久层状态和瞬时状态转化的过程
- 内容:断电即失
- 数据库(jdbc),io文件持久化
- 持久层
- 完成持久化工作的代码块
- 层界限十分明显
- mybatis作用
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
- 使用
- 建库
- 建项目
- 导入依赖
-
- 配置mybatis-config.xml
-
- 工具类(也可以不用写,直接配置在mybatis-config.xml里面)
-
- 创建xxxMapper.xml文件,放在Dao的同包,id为dao中的方法名
-
- 直接调用dao类
- 增删改查
//查找
示例
insert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio}) update Author set username = #{username}, password = #{password}, email = #{email}, bio = #{bio} where id = #{id} delete from Author where id = #{id}
- 配置解析
- resultMap(结果集映射)解决属性名与字段名不一致的问题
- 日志
- log4j
# 全局日志配置 log4j.rootLogger=ERROR, stdout # MyBatis 日志配置 log4j.logger.org.mybatis.example.BlogMapper=TRACE # 控制台输出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
- stdout_logging
- 注解开发
@Select("select * from user where id = #{id}") User findById(@Param("id") long id); @Select("select * from user where name = #{name}") User findByName(@Param("name") String name); @Select("select * from user where email = #{email}") User findByEmail(@Param("email") String email)
- 执行流程(参考:https://blog.csdn.net/qq_38270106/article/details/93398694)
- 多对一
- 一对多
- 动态SQL
定义:动态SQL就是指根据不同的条件生成不同的SQL语句
if
这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果(细心的读者可能会发现,“title” 的参数值需要包含查找掩码或通配符字符)。
choose (when, otherwise)
trim (where, set)
foreach
SQL片段:把重复的SQL代码提取出来,重复使用
- 缓存
MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。默认情况下,只启用了本地的会话缓存(一级缓存),它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
二级缓存是事务性的。这意味着,当 SqlSession 完成并提交时,或是完成并回滚,但没有执行 flushCache=true 的 insert/delete/update 语句时,缓存会获得更新。
- 自定义缓存
看官方文档很重要
//注解
@Select("select * from user where id = #{id}")
User findById(@Param("id")long id);
@Select("select * from user where name = #{name}")
User findByName(@Param("name")String name);
@Select("select * from user where email = #{email}")
User findByEmail(@Param("email")String email)