1.下载jjar包并导入工程
2.编写MyBatis核心配置文件(全局)
3.创建实体类POJO
4.Dao层SQL映射文件(局部)
5.创建测试类(service调用)
a.读取全局配置文件
b.创建SqlSessionFactory对象,读取配置文件
c.创建SqlSession对象
d.调用mapper文件进行数据操作
例1: 主配置文件 xml version="1.0" encoding="UTF-8" ?>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///smbms" /> <property name="username" value="root" /> <property name="password" value="4682135" /> dataSource> environment> environments> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.XML" /> mappers> configuration> |
1.提示信息.dtd文件在mybatis-3.X.jar文件中
2.将jar文件解压 org/apache/ibatis/builder/xml/
mybatis-3-config.dtd
mybatis-3-mapper.dtd两个文件
3.拷贝两个xml文件代码头部PUBLIC中的路径 例:PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4.在MyEclipse中单击工具栏的Window - Preferences - 搜索XML - 选中XML catalog - 单击 Add...
Location 引入文件路径
Key 粘贴PUBLIC的复制的路径
mapper标签:局部根节点
namespace属性对应本文件全路径名(省略从src开始之前的文件夹 所有 / 用 . 替代)
将创建好的文件引入主文件中
|
MyBatis的核心接口和类
1)SqlSessionFactoryBuiler
用过即丢,其生命后期只存在于方法体内
可以重用其来创建多个SqlSessionFactory实例
负责构建SqlSessionFactory.并提供U盾讴歌build方法的重载
2)SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
SqlSession session = SqlSessionFactory.openSession(boolean autoCommit)(true:默认关闭事务控制 false:开启事务控制)
作用域:Application
声明周期与应用的生命周期相同
单例:存在于整个应用运行时,并且同时只存在一个对象实例
3)SqlSession
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
作用域:线程级别,不能共享
因为线程不安全 所以最好的作用域在request
声明周期:一个request请求
SqlSession的两种使用方式:
1.通过SqlSession实例直接运行映射的SQL语句
2.基于Mapper接口方式操作数据
注意:元素节点的顺序
configuration配置
properties 可以配置在java属性配置文件中
settings 修改MyBatis在运行时的行为方式
typeAliases为java类型命名一个别名(简称)
typeHandlers 类型处理器(类型转换器)
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
1.通过外部指定的方式(database.properties),实现动态配置
配置properties标签的resource属性指定(引入)
2.直接配置为XML,实现动态配置
直接配置prperty 如:例1.
注意:第一种方式优先于第二种
1.为pojo配置别名
例2:
|
2.扫描某包下的所有类,其类名既别名
例3: |
表示配置Mybatis的多套运行环境,将SQL映射到多个不同的数据库上
子元素节点:environment.但是必须指定其中一个默认运行环境(通过default指定)
如:例1
type属性有两种
1.JDBC
2.MANAGED(托管)
使用基本的DBC数据源接口来配置JDBC连接对象的资源
有三种内建的数据源类型
例:
POOLED是基本的连接池的概念
映射器,定义SQL映射语句
必须在主配置中引用mapper映射文件
导入的方式有两种
1.使用类资源路径获取资源
例4:
2.使用URL获取资源
例5:
3.使用类选择器 - 用类扫描器加载 此种方法必须文件名与接口名必须一致
例6:
Mybatis真正的强大在于映射语句,专注于SQL,功能强大
SQL映射的配置却相当简单
SQL映射文件的几个顶级元素(按照定义的顺序)
mapper-namespace -命名空间绑定Dao接口
cache -配置给定命名空间的缓存
cache-ref -从其他命名空间的缓存
resultMap -用来描述数据库结果集和对象的对应关系
sql -可以重用的SQL块,也可以被其他语句音乐
insert -映射插入语句
update -映射更新语句
delete -映射删除语句
select -映射查询语句
1.mapper
namespace:命名空间
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定DAO接口
namespace的命名必须跟某个(相对应的)接口同名
接口中的方法与映射文件中的SQL语句id一一对应
2.select
select是Mybatis中最常用的元素之一
select语句有很多属性可以详细配置每一条语句
1.id属性:
命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id一一对应
2.parameterType属性:
传入SQL语句的参数类型的完全限定名或别名(jdk基本类型可以不用全名)
3.resultType属性:
SQL语句返回值类型的完整类名或别名
3.参数传递#{参数名}
数据库字段名与JavaBean的属性名一致(或setting映射 sql下划线类型映射驼峰命名)
parameterType
基础数据类型
int.String.Date等
只能传入一个,通过#{参数名}即可获取传入的值
复杂数据类型
java实体类,Map等
通过#{属性名}或者#{Map的Key}即可获取传入值
MyBatis入参
单参数:Java基础数据类型
多参数:Java实体或者封装成Map
resultType:直接表示返回类型
基础数据类型
复杂数据类型
resultMap:对外部resultMap的引用
应用场景:
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
二者不能同时存在,本质上都是Map数据结构
例7:
select id,user_name from user_info
|
resultMap自动映射匹配前提:字段名与属性名一致
resultMap的自动映射级别(autoMappingBehavior)
PARTIAL(默认):自动匹配所有属性
面试题${}与#{}的区别
答:#{ }可以防止sql注入,而且入参时自动加上’’单引号,${}sql拼接的时候更方便一些
id属性
parameterType属性
参数可以是pojo对象
也可以是Map
也可以用@Param注解
1.将映射方法的多个参数前加上@Param("注解名")
2.在映射的SQL语句中用#{注解名}入参
例8:modify(@Param("id")Integer id,@Param("userName")String uName); SQL: update user_info set userName=#{userName} where id = #{id} |
注:超过4个以上的参数最好封装成对象入参
参数固定的业务方法,最好直接使用多参数入参
resultType返回值都默认是int类型所有没有此属性
resultMap标签
id:resultMap的唯一标识
type:java实体类
resultMap子元素的属性有:
1.id:一般对应数据库中该行的主键id,设置此项可提高MyBatis的性能
2.result:映射到JavaBean的某个简单类型属性
3.association:映射到JavaBean的某个复杂类型属性,比如javaBean类
association标签 实现复杂的类型关联,一对一的关联
内部嵌套
映射有一个嵌套javaBean属性
属性
property:映射数据库列的实体对象的属性
javaType:完整java类名或者别名
resultMap:引用外部resultMap
子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
4.collection映射到javaBean的某个复杂类型属性,比如集合
复杂类型集合,一对多
内部嵌套
映射一个嵌套结果集到一个列表
属性
property:映射数据库列的实体对象的属性
ofType:完整Java类名或者别名(集合所包括的类型)
resultMap:引用外部resultMap
子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
总结:
resultMap自动映射(autoMappingBehavior)的三个匹配级别
NONE 禁止自动匹配
PARTIAL 默认 自动匹配所有属性,内部嵌套除外
FULL 自动匹配所有
resultMap - 复杂类型关联
association
映射一个嵌套javaBean属性,一对一(就是类中的属性包含另一个类)
collection
映射一个嵌套集合属性,一对多(就是累中的属性是一个集合)
基于OGNL表达式
使用动态SQL完成多条件查询等逻辑实现
用于实现动态SQL的元素主要有
if
trim 灵活的祛除无用关键字
where
set
choose(when,otherwise)
foreach
简单的条件选择
简化where的条件判断
属性
prefix 在前面加 比如where
suffix 在后面加 比如where id=#{id}
prefixOverrides 忽略前面 比如and
suffixOverrides 忽略后面 比如逗号
更灵活的祛除多余关键字
替代where
拼接SQL的前缀或者后缀
例:
可以灵活的判断是否加入一个where语句 忽略拼接条件开头的and或者or关键字
set标签 + if标签
update set 列名=值,列名=值 where条件
set标签配合if标签可以判断值是否需要更改 而且可以忽略句尾的逗号
备注:实际开发当中,用户只要执行了更新操作,就要按照客户的要求进行更新,哪怕是传入空参也要尊重用户的意愿,所以实际工作当中几乎不会使用set + if进行操作
迭代一个集合,通常适用于in条件
属性:
item - 每个元素迭代时的别名
index - 迭代过程中每次迭代到的位置 可以省略
collection:必须指定 - 指定相应入参属性的值 有以下情况
list
array
map-key
open - 表示以什么未开始 一般是” ( ”
separator - 每次迭代用什么符号进行间隔 一般是 “,”
close - 语句以什么结束 一般是” ) ”
limit(起始位置,页面容量)
查询用户列表的方法增加2个参数
from
pageSize
例: DAO接口 List @Param("userRole")Integer roleId, @Param("from")Integer correntPageNo, @Param("pageSize")Integer pageSize);
|
XML:
select u.* from smbms_user u , smbms_role r where u.userRole = r.id order by creationDate DESC limit #{from},#{pageSize}
|
Test @Test public void getUserList() throws IOException { SqlSession session = MyBatisUtil.getSession(); String userName = ""; Integer roleId = null; Integer correntPageNo = 0; Integer pageSize = 5; List userName, roleId, correntPageNo, pageSize); for (User user : userList) { log.debug(user); } } |
MyBatis缓存
一级缓存 会话作用域
二级缓存 全局作用域
二级缓存的配置
1.MyBatis的全局cache配置
2.在MaaperXML文件中设置缓存,默认情况下未开启 -- 只在一个mappers中有效
3.在MaaperXML文件配置支持cache后,若需要对个别查询进行调整,可以单独设置cache
MyBaits是一个ORM持久化框架
2.uuid技术:
生成一个随机数 利用uuid()函数
resultType:返回值类型
keyProperty:字段名
order:加载顺序
slect uuid()
3.面试题
1.谈谈你对Mybatis框架的理解
MyBatis是一个ORM的持久化框架,简化JDBC代码,解耦,效率.
2.应用:
CRUD,
特色: 级联查询,缓存
3.注解:
JDK注解
框架注解