MyBatis中文文档:https://mybatis.org/mybatis-3/zh/index.html
博客:https://blog.csdn.net/lj1314ailj/article/details/79712305
MyBatis的强大在于映射语句,针对SQL构建,比JDBC节约代码。
SQL映射文件的*元素:
cache、cache-ref
resultMap 最复杂最强大的元素,用来描述如何从数据库结果 集中来加载对象。
sql 可被其他语句引用的 可重用语句块
<resultMap id="resultMapInput" type="domain.InputDo" > <id column="PARAM_ID" property="paramId"/> <result column="PLAN_ID" property="planId"/> <result column="PARAM_NAME" property="paramName"/> <result column="VALUE" property="value"/> <result column="PARAM_UNIT" property="paramUnit"/> </resultMap>
//使用resultMap进行映射:左边一排colomn是数据库里面的名称,右边是java后端里面的驼峰式;
然后可以在后面多次使用:
<select id="getParamInput" resultMap="resultMapInput"> select ID as PARAM_ID,PARAM_NAME,PARAM_UNIT,PARAM_PART from t_biz_params where PARAM_MODULE = #{paramModule} and DEL_FLAG = 0 order by ORDER_NUM </select> <select id="getParamInputAndValue" resultMap="resultMapInput"> select t_biz_params.ID as PARAM_ID,t_biz_params.PARAM_NAME,t_biz_params.PARAM_UNIT,t_biz_params.PARAM_PART,t_biz_plan_input.VALUE from t_biz_params,t_biz_plan_input where t_biz_plan_input.PLAN_ID=#{planId} and t_biz_plan_input.PARAM_ID = t_biz_params.ID and t_biz_params.PARAM_MODULE = #{paramModule} and t_biz_plan_input.DEL_FLAG =0 and t_biz_params.DEL_FLAG=0 order by t_biz_params.ORDER_NUM </select>
namespace
这个要与dao文件对应起来,类似于mapper.xml来实现dao文件里的抽象方法
select
<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>
id: 对应方法的名字(与dao文件中的方法名字对应) selectPerson,
parameterType: 接受一个 int(或 Integer)类型的参数,
resultType: 返回一个 HashMap 类型的对象,
insert update delete
动态SQL
动态SQL根据不同条件生成不同的SQL语句。
动态 sql 语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 mybatis 动态sql 对照着改,防止出错。
- if
- choose (when,otherwise)
- trim (where,set)
- foreach
if 如果满足条件,会追加if后面的SQL语句
select会用到where:
update会用到set (不举例了)
choose (when*n个,otherwise)
相当于java里面的switch case break;(遇到符合的一个后不会继续往下,而普通的case需要break来拦截继续向下)
trim (where,set)
trim用于改写上面的where、set:
- where-->trim
- set-->trim
foreach
foreach关键字:
1)
2)
Mybatis缓存
适合缓存的场景:
查询多,改变少【读多写少】
Mybatis缓存
查询时:
先找二级缓存(硬盘) ==》一级缓存(内存)==》数据库
一级缓存在内存,二级缓存在硬盘
一级缓存
一级缓存是个Map
使用场景:一个用户不断刷新页面
二级缓存
在mapper.xml里面加上:
60s刷新,最多512个引用,返回对象只读
我们需要使用SqlSession对象的close()方法(关闭连接),达到手动序列化:
session.close();//手动序列化二级缓存:关闭会话,让一级缓存==》二级缓存中
ehcache 用在Hibernate多;
后面重点学redis就好了
https://www.bilibili.com/video/BV1NE411Q7Nx?p=30
日志
日志工厂
如果数据库操作,出现bug,日志帮助排错
下面是两种常用的日志:
STDOUT_LOGGING 标准日志输出
在中引入:
打印整个使用数据库的流程:
https://www.bilibili.com/video/BV1NE411Q7Nx?p=11 13:23
Log4j
配置步骤:
1. 导入log4j的包(maven)
2. log4j.properties(详细配置)
3. 在中引入:注意:LOG4J全大写
使用步骤:
多对一 association
比如多个学生对应一个老师
在domain里面:
查询学生信息,以及学生对应老师的信息:
完整的pid子查询(重要,记忆):
对应的mapper.xml:
1. 按照查询嵌套(子查询)处理:
https://www.bilibili.com/video/BV1NE411Q7Nx?p=20 12:38
2. 按照结果嵌套(联表查询)处理:
结果是Student类型:
https://www.bilibili.com/video/BV1NE411Q7Nx?p=20 22:28
一对多 collection
不清楚再回去看看:https://www.bilibili.com/video/BV1NE411Q7Nx?p=21
sqlSessionFactory:
https://www.bilibili.com/video/BV1NE411Q7Nx?p=9 7:43+10:39
我写的时候并没有遇到??
配置解析
核心配置文件mybatis-config.xml
https://www.bilibili.com/video/BV1NE411Q7Nx?p=6 1:47
Junit中测试代码:
(不写测试类行不行??)
我写的时候,因为mabatis和controller、service层都比较简答,所以就直接全部走通、用postman来测试的;
如果各个部分比较复杂的话,可以从中间切断、直接像这样来测dao+mybatis部分的代码:
增删改(查不用)需要提交事务:
一些杂碎的技术细节:
mybatis.xml里面 &;相当于and
resource用斜杠隔开;class用点隔开;
${} 存在sql注入的风险。
- 如果传入的是基础数据类型; 大括号中只能写一个叫做value, 也就是说
${value}
; - 如果传入的pojo或者map类型, 那么只能写属性名或key名:
${username}
;
#{} 防止sql注入风险:如果传入的是字符串;预编译时会自动带上单引号'
子句的 书写 顺序
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
子句的 执行 顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
HAVING和WHERE的区别:在GROUP BY的前后
GROUP BY的作用是按属性(列)进行分组【通常针对COUNT/MAX/...】
HAVING和WHERE都是针对行的筛选
JOIN 和 UNION 的理解:
- 表的加法 (UNION) //行数变多
- 以列为单位对表进行联结 (JOIN) //属性变多(横向扩展)//如果没有where进行筛选,就是笛卡尔积
//内连接:两张表的连接id都有的记录(行)才可以
//左连接:左表的每行只多不少,不匹配的就使右表相应字段为空
https://blog.csdn.net/ljxfblog/article/details/52066006
MyBatis 快速入门(实操):https://www.jianshu.com/p/c77e3691867d