| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Mybatis详细的使用过程(4) -> 正文阅读 |
|
[大数据]Mybatis详细的使用过程(4) |
注解方式 (适用简单语句)
常用注解标签
@Insert: 插入 sql , 和 xml insert sql 语法完全一样
@Select: 查询 sql, 和 xml select sql 语法完全一样
@Update: 更新 sql, 和 xml update sql 语法完全一样
@Delete: 删除 sql, 和 xml delete sql 语法完全一样
@Param: 入参
@Results : 设置结果集合
@Result: 结果
注解可用于单张表的使用 ?
使用案例
查询所有信息
@Select("select * from t_emp")
@Results(id = "empMap",value = {
@Result(column = "emp_id",property = "empId",id = true),
@Result(column = "emp_name",property = "empName"),
@Result(column = "emp_tel",property = "empTel"),
@Result(column = "emp_education",property = "empEducation"),
@Result(column = "emp_birthday",property = "empBirthday")
})
List<Employee> getAll();
查询单个信息
@Select("select * from t_emp where emp_id=#{empId}")
@ResultMap(value="empMap")
Employee getById(@Param("empId") Integer empId);
插入信息
@Insert("insert into t_emp (emp_id, emp_name, emp_tel, " +
" emp_education, emp_birthday, fk_dept_id" +
" )" values (#{empId}, #{empName}, #{empTel}, " +
" #{empEducation}, #{empBirthday}, #{fkDeptId}" +
" )")
int insert(Employee record);
删除信息
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);
Mybatis 动态 SQL (类里面的属性为引用类型)
?? MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用
JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么
的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理
这种痛苦。
MyBatis 中用于实现动态 SQL 的元素主要有:
If? where?
trim
set
choose (when, otherwise)??
foreach
查询举例 ? ? 修改举例 <set> foreach(在一个范围中进行搜索)
特殊符号处理
在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>
等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:
特殊字符 转义字符
除了可以使用上述转义字符外,还可以使用<![CDATA[]]>来包裹特殊字符。如下所示:
<if test="id != null">
AND <![CDATA[ id < #{id} ]]>
</if>
<![CDATA[ ]]>是 XML 语法。在 CDATA 内部的所有内容都会被解析器忽略。
但是有个问题那就是 <if> </if> <where> </where>
<choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小<![CDATA[ ]]>
的范围。
?
mybatis 一级缓存二级缓存
为什么使用缓存
??????? 缓存(cache)的作用是为了减去数据库的压力,提高查询性能。缓存实现的原理
是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中,
当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行
select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。
??????? Mybatis 有一级缓存和二级缓存。一级缓存的作用域是同一个 SqlSession,
在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库
中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查
询,从而提高查询效率。当一个 sqlSession 结束后该 sqlSession 中的一级缓存
也就不存在了。Mybatis 默认开启一级缓存。
??????? 二级缓存是多个 SqlSession 共享的,其作用域是同一个 namespace,不同的
sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同
即最终执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存
(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
Mybatis 默认没有开启二级缓存需要在 setting 全局参数中配置开启二级缓存。
一级缓存
??????? Mybatis 对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓
存,一级缓存只是相对于同一个 SqlSession 而言。所以在参数和 SQL 完全一样
的情况下,我们使用同一个SqlSession 对象调用一个 Mapper 方法,往往只执
行一次 SQL,因为使用 SelSession 第一次查询后,MyBatis 会将其放在缓存中,
以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,
SqlSession 都会取出当前缓存的数据,而不会再次发送 SQL 到数据库。
?
一级缓存的生命周期
???? a、MyBatis 在开启一个数据库会话时,会 创建一个新的 SqlSession 对象,
SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新
的 PerpetualCache 对象,如果 SqlSession 调用了 close()方法,会释放掉一级
缓存 PerpetualCache 对象,一级缓存将不可用。
???? b、如果 SqlSession 调用了 clearCache(),会清空 PerpetualCache 对象
中的数据,但是该对象仍可使用。
????
c、SqlSession 中执行了任何一个 update 操作(update()、delete()、
insert()) ,都会清空缓存的数据,但是该对象可以继续使用。
三种清空一级缓存
二级缓存
??????? 二级缓存是 SqlSessionFactory 级别的,根据 mapper 的 namespace 划分区域
的,相同 namespace 的 mapper 查询的数据缓存在同一个区域,如果使用
mapper 代理方法每个 mapper 的 namespace 都不同,此时可以理解为二级缓
存区域是根据 mapper 划分。
?????? 每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数据写
入缓存。Mybatis 内部存储缓存使用一个 HashMap,key 为
hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的 java 对象。
sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区
域,防止脏读。二级缓存参考下图所示:
? MyBatis 的缓存机制整体设计以及二级缓存的工作模式
配置二级缓存配置
第一步:
启用二级缓存
在 SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当
cacheEnabled 设置为 true 时启用二级缓存,设置为 false 时禁用二级缓存。
<setting name="cacheEnabled" value="true"/>
?
第二步:对象序列化
将所有的 POJO 类实现序列化接口 Java.io. Serializable。
第三步:配置映射文件
在 Mapper 映射文件中添加<cache />,表示此 mapper 开启二级缓存。
当 SqlSeesion 关闭时,会将数据存入到二级缓存.
?
?
MyBatis 架构
? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:07:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |