Mybatis
Mybatis
1. 环境搭建
第一步:导入jar包
第二步:写主配置文件
2. 开发步骤
第一步:表
第二步:实体类
第三步:接口
第四步:mapper.xml映射文件(*)
第五步:注册映射文件
第六步:测试
3. JUnit单元测试
4. mybatis的基本要素
a) 核心对象
SqlSessionFactoryBuilder;//创建工厂,加载核心配置文件.
SqlSessionFactory;//SqlSession工厂,用来创建sqlSession
SqlSession;//SqlSessiond执行sql语句.创建dao接口的代理类.
b) mybatis-config.xml核心配置文件
运行环境,注册映射.
c) mapper.xml Sql映射文件
5. mybatis-config.xml
properties 可以配置在Java 属性配置文件中
settings 修改 MyBatis 在运行时的行为方式
typeAliases 为 Java 类型命名一个别名(简称)
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
6. Setting设置
cacheEnabled :缓存.
lazyLoadingEnabled: 延迟加载/懒加载.
autoMappingBehavior: resultMap自动映射级别.
7. typeAliases 设置别名
<typeAliases>
<package name ="cn.smbms.pojo" />
</typeAliases>
注意:设置package后,映射文件中的实体类配置都用类名.
表示package包下的这个类.
8. environments
8.1 表示配置MyBatis的多运行环套境,将SQL映射到多个不同的数据库上.
8.2 子元素节点:
a.environment,但是必须指定其中一个为默认运行环境(
通过default指定)
b.transactionManager:事务管理器
<transactionManager type="[JDBC | MANAGED ]" />
c.dataSource:数据源
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
<dataSource type="UNPOOLED|POOLED|JNDI ">
UNPOOLED 不使用连接池
POOLED 使用连接池
JNDI 由JNDI管理
例:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
9. mappers 映射器
9.1 引用mapper映射文件
9.2 引用方式
方式一:使用类资源路径获取资源
例:
<!-- 将mapper映射文件加入到系统核心配置文件中 -->
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
方式二:使用URL获取资源
例:
<mappers>
<mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
<mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>
</mappers>
10. SQL映射文件
10.1 SQL映射文件的几个顶级元素
mapper - namespace
cache - 配置给定命名空间的缓存
cache-ref – 从其他命名空间引用缓存配置
resultMap –用来描述数据库结果集和对象的对应关系
sql – 可以重用的SQL块,也可以被其他语句引用
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
注意:按照定义的顺序
10.2 mapper
namespace:命名空间.(dtd)
namespace和子元素的id联合保证唯一,区别不同的mapper
注意:
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id一一对应
10.3 select
a.查询语句的标签
b.常用属性
id
命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id一一对应
parameterType
传入SQL语句的参数类型
resultType
SQL语句返回值类型的完整类名或别名
c. parameterType
基础数据类型
int、String、Date等
只能传入一个,通过#{参数名}即可获取传入的值
复杂数据类型
Java实体类、Map等
通过#{属性名}或者#{map的keyName}即可获取传入值
注意:#{}和${}的区别
${}是原样输出.(可以导致sql注入)
#{}是会给值加入一对双引号.'value'.(建议适用这个)
d. resultMap
<resultMap type="数据类型" id="id">
<result property="d性名" column="数据库列名"/>
<result property="userCode" column="userCode"/>
</resultMap>
注意:resultType和resultMap的区别
resultType :直接表示返回类型
基本数据类型
复杂数据类型
resultMap :对外部resultMap的引用
应用场景:
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
e.resultMap的自动映射
前提:字段名与属性名一致
设置级别autoMappingBehavior:
NONE : 禁止映射
PARTIAL:自动匹配所有(没有嵌套association,collection)
FULL: 自动匹配所有.
例:<setting name="autoMappingBehavior" value="FULL"/>
f.属性
id 在命名空间中唯一的标识符,可以被用来引用这条语句
parameterType 将会传入这条语句的参数类的完全限定名或别名
resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用
resultMap 命名引用外部的resultMap
flushCache 将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false
useCache 将其设置为true,将会导致本条语句的结果被缓存。默认值:true
timeout 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)
fetchSize 这是暗示驱动程序每次批量返回的结果行数
statementType STATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED
resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)
11. insert(增加)
id
parameterType
例:
<insert id="add" parameterType="User" >
insert into smbms_user (userCode,userName,userPassword)
values ( #{userCode},#{userName},#{userPassword})
</insert>
注意:insert、update、delete元素均没有resultType属性
默认返回int类型.
12. update
例:
<update id ="modify" parameterType="User">
update smbms_user
set userCode = #{userCode},
userName = #{userName},
userPassword = #{userPassword}
where id = #{id}
</update>
13. delete
例:
<delete id ="deleteUserById" parameterType="int">
delete from smbms_user where id = #{id}
</delete>
14. mybatis入参方式
@Param注解参数(注解)
封装成对象入参
public int updatePassword(@Param("id")int id,@Param("pwd")String newpwd);
注意:一般情况下:参数超过3个,就用对象.
15. resultMap
1)属性
id:resultMap的唯一标识
type:Java实体类
2)子元素
id
一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
result
映射到JavaBean的某个“简单类型”属性
association
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
collection
映射到JavaBean的某个“复杂类型”属性,比如集合
3)association
a.复杂的类型关联,一对一
b.内部嵌套,映射一个嵌套JavaBean属性(对象里面放对象)
c.属性:
property:映射数据库列的实体对象的属性
javaType:完整Java类名或者别名
resultMap:引用外部resultMap
b.子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
4)collection
a.复杂类型集合,一对多
b.内部嵌套,映射一个嵌套结果集到一个列表(对象里面放list)
c.属性
property:映射数据库列的实体对象的属性
ofType:完整Java类名或者别名(集合所包括的类型)
resultMap:引用外部resultMap
d.子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
16. MyBatis缓存
1).分类
一级缓存:SqlSession级别的缓存.(在同一个SqlSession中,缓存有效,默认打开)
二级缓存:应用级别缓存(全局缓存,随便在哪里都能取得到.默认是关闭的)
2)打开全局缓存
第一步:配置mybatis核心配置文件
<setting name="cacheEnabled" value="true"/>
第二步:单独开启映射文件的缓存
<cache eviction="FIFO" flushInterval="60000"
size="512" readOnly="true"/>
evication:表示溢出处理机制.
独立设置某一条sql的缓存
<select id="selectAll" resultType="Emp"
useCache="true">
17. 动态SQL
17.1 基于OGNL表达式(类似jstl表达式)
17.2 完成多条件查询等逻辑实现
17.3 实现动态SQL的元素
<if>
<where>
<set>
<trim>
<foreach>
<choose>
<when>
<otherwise>
17.4 if
语法:
<if test="条件"></if>
注意:如果判断变量的类型是字符串时,要注意是否需要判断空串.
例:<if test="userName!=null and userName !=''"></if>
17.5 where
智能处理and或者or.(会去掉where后面的第一个and或者or)
例:
select * from smbms_user
<where>
<if test="uName!=null and uName !=''">
and username like CONCAT('%',#{uName},'%')
</if>
<if test="uRole != null">
and userRole = #{uRole}
</if>
</where>
17.6 set
智能处理update时的逗号.(会去掉set后面最后个set值的逗号)
例:
update smbms_user
<set>
<if test="userCode!=null">
userCode = #{userCode},
</if>
<if test="userName!=null">
userName = #{userName},
</if>
<if test="userPassword!=null">
userPassword = #{userPassword}
</if>
</set>
where id = #{id}
17.7 trim
a.更灵活地去除多余关键字
b.属性:
prefix(前缀)
suffix(后缀)
prefixOverrides(前缀覆盖)
suffixOverrides(后缀覆盖)
c.替换where
<trim prefix="where" prefixOverrides="or|and">
<if test="uName!=null and uName !=''">
and username like CONCAT('%',#{uName},'%')
</if>
<if test="uRole != null">
and userRole = #{uRole}
</if>
</trim>
d.替换set
update smbms_user
<trim prefix="set" suffixOverrides=","
suffix="where id = #{id}">
<if test="userCode!=null">
userCode = #{userCode},
</if>
<if test="userName!=null">
userName = #{userName},
</if>
<if test="userPassword!=null">
userPassword = #{userPassword}
</if>
</trim>
17.8 foreach
a)迭代一个集合,通常用于in条件
b)属性
item :集合参数
index :下标
collection:必须指定
list (集合)
array (数组)
map-key(map)
open :开始"("
separator: 分割符:,
close: 结尾:")"
例:
<select id="getUserByRoles" resultType="User">
select * from smbms_user
where gender= #{gender} and userRole in
<foreach collection="uRole" item="roles"
open="(" close=")" separator=",">
#{roles}
</foreach>
</select>
17.9 choose
a.相当于Java中switch语句
b.当when有条件满足的时候,就跳出choose
<choose>
<when test ="条件1"> …</when>
<when test ="条件2"> …</when>
<when test ="条件3"> …</when>
…
<otherwise>…</otherwise>
</choose>
18. Mysql的分页
a.使用limit进行分页
b.语法
select * from smbms_user LIMIT 开始位置,每页条目数;
例:select * from smbms_user LIMIT #{from},#{pageSize};
分类
|
添加随笔
|