MyBatis框架知识点总结

新手上路#3

**

一、MyBatis框架概述

1.MyBatis是一个持久层框架(DAO框架),是对JDBC的封装,使得开发者只需要关注
SQL语句(业务)本身即可,无需开发者处理加载驱动、获取连接、创建Statement等繁琐的操作。
2.MyBatis最大的特点是把SQL语句卸载XML配置文件中。
3.MyBatis是一个实现类ORM思想的持久层框架
ORM(Object/Relation Mapping)对象/关系映射:
将数据库中的关系数据表映射为java中的对象,吧对数据表的操作转换为对对象的操作,实现面向对象编程。
%总结%:MyBatis框架是一个半自动的ORM持久层框架,可以在java中实现以面向对象的方式操作数据库,但是需要我们自己编写SQL语句。

**

二、MyBatis配置

mybatis-cofigxml配置

1.放在src下


		
				
						
						
								

2.设置类的别名
TypeAliases标签

3.mappers标签
用来注册SQL映射文件


xxxMapper.xml
id 值唯一,用来标识唯一的sql语句 使用时,建议和namespace的值组合 例如:test.id resultType:结果集封装的类型
parameterType:参数的数据类型
SQL语句中的取参数语法:#{基本类型 任意命名}
resultMap:
(1).当数据表列名和类中属性名不一致时,Mybatis无法自动配置,需要手动配置映射(给字段起别名)


模糊查询#{}和 $ {}的方式
1.使用#{}得原理是占位符,而$ 的原理为字符串拼接的方式。使用#{}可以防止sql注入。
2.如果使用${}时,传入的参数是引用类型,那么 $ {对象的属性名}。
3.能使用#就不使用$。


三、动态代理Dao开发方式

1.定义一个Mapper接口,这个接口其实和我们定义的Dao接口是一样的,从Mybatis框架中拿到一个代理
对象(代理的是这个Mapper接口),通过代理对象调用接口中的方法完成业务。
2.Mapper动态dao开发遵循的规范
SQL映射文件的namespac鼻血和Mapper接口的全限定类名完全一致;
mapper接口中方法名必须和XML中SQL语句的id保持一致;
mapper接口中方法的参数类型必须和SQL语句的parameterType类型保持一致;
mapper接口中方法返回值必须和SQL语句的resultType类型保持一致

**

四、动态SQL

1.什么是动态SQL
(1).动态SQL极大的简化了SQL语句的拼装操作。
(2).动态SQL元素和使用JSTL或其他类似XML的标签类似。
(3).动态SQL就是通过一系列的标签运算来完成判断,进行SQL语句的拼装。

2.where标签,处理SQL语句,自动添加where关键字,并去掉紧跟它后面的一个and或者or;
if标签,test属性,判断表达式真假。

<mapper namespace="com.wojia.mapper.UsersMapper">
 <select id="findUser" resultType="users" parameterType="users"> SELECT * FROM t_user
  <where>
  <if test="id!=0">
   or id=#{id} 
   if>
   <if test="username!=null and username!=''">
    or username LIKE #{username} 
    if> 
   where>
  select>
mapper>

3.SQL标签
将SQL语句通用的部分进行抽取,比如将固定要查询表内的字段做一个抽取:

<mapper namespace="com.wojia.mapper.UsersMapper">
 <select id="findUser" resultType="users" parameterType="users">
  SELECT <include refid="t_user_columns"/> FROM t_user 
  <where> 
  <if test="id!=0">
   or id=#{id}
  if>
  <if test="username!=null and username!=''">
     or username LIKE #{username}
  if>
 where>
select>
          
 <sql id="t_user_columns"> 
 id,username,password,state,email,source,create_time as createTime,remark 
 sql>

4.foreach标签
删除多条数据,delete from t_user where id in(1,3,4,99,2,4)
集合:

<select id="queryUsersByIds" parameterType="list" resultType="users"> 
SELECT <include refid="t_user_columns"/> FROM t_user 
<foreach collection="list" open="where id in(" close=")" separator="," item="item">
#{item} 
foreach> 
select>

数组:

<select id="queryUsersByIdsArray" parameterType="int[]" resultType="users"> 
SELECT <include refid="t_user_columns"/> FROM t_user 
<foreach collection="array" open="where id in(" close=")" separator="," item="item">
#{item} 
foreach> 
select>

对象:

<select id="queryUsersByIdsPojo" parameterType="queryvo" resultType="users"> 
SELECT <include refid="t_user_columns"/> FROM t_user 
<foreach collection="idList" open="where id in(" close=")" separator="," item="item">
#{item} 
foreach> 
select>

foreach标签遍历集合拼接SQL语句
collection属性:遍历传入的集合,当参数是集合时,collection属性值固定为list;当参数是数组时,collection属性值固定为array;遍历传入的pojo对象中的集合,collection属性值为POJO中集合的属性名。
open属性:遍历拼接前
close属性:遍历拼接后
separator属性:指定拼接的符号
item属性:遍历到的元素

五、MyBatis延迟加载

延迟加载:都是针对在多表查询的情况下,对关联表对象的操作。
需求描述
用户和订单从面向对象的角度来说就是所谓的关联对象,假如我们只需要订单数据,暂时不需
要用户数据,就不应该去查询用户表,啥时候使用用户数据,啥时候查询。
开启延迟加载策略在mybatis-config.xml文件中

<settings> 
	<setting name="lazyLoadingEnabled" value="true"/>
 
  	<setting name="lazyLoadTriggerMethods" value="getUsers"/>
settings>

六、MyBatis缓存机制

MyBatis框架中定义了两级缓存
一级缓存
二级缓存
默认情况下,只有一级缓存是开启的,一级缓存就是SqlSession级别的缓存。
一级缓存就是SqlSession级别的缓存,当调用SqlSession的修改、添加、删除、commit、close、clearCache方法时,就会清空缓存。
二级缓存是namespace映射级别的缓存,多个SqlSession去操作同一个Mapper映射的SQL语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
在MyBatis中使用二级缓存时,所缓存的对象一定要实现序列化接口。

你可能感兴趣的:(基础,mybatis,spring,orm,java)