简介
apache开源项目(iBatis),2010年改名为mybatis 持久层框架,对jdbc操作数据库的过程进行封装,使开发者只需关注SQL本身
通过xml或注解的方式,将statement(statement、preparedStatement、CallableStatement)配置,通过Java对象和statement中的sql进行映射生成sql语句,最后由mybatis框架执行sql并将结果映射成Java对象返回
配置
SqlMapConfig.xml 全局配置文件,配置mybatis的运行环境等信息
mapper.xml sql映射文件,配置操作数据库的sql语句,需要在SqlMapConfig.xml中加载。在mapper.xml中书写SQL语句,注意,在服务器的客户端执行通过后在写进文件,修改条件即可
架构
对架构的详细描述
配置配置文件
构造SqlSessionFactory即会话工厂
创建会话(sqlSession),操作数据库需要通过sqlSession进行
Executor执行器接口操作数据库,Executor接口由两个实现,一个使基本执行器,一个使缓存执行器
Mapped Statement mybatis 底层封装对象,它包装了 mybatis 配置信息及 sql 映射信息等。 mapper.xml 文件中一个 sql 对应一个 MappedStatement 对象, sql 的 id 即是 Mapped statement 的 id。
Mapped Statement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、 pojo, Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对 preparedStatement 设置参数。
Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、 pojo, Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至java 对象中,输出结果映射过程相当于 jdbc 编程中对结果的解析处理过程。
#{}与${}
#{} 占位符号,可有效防止sql注入,字符串类型自动加引号 简单类型 #{}中可以写value或id 建议能用#{}就不用${}
${} 拼接sql串 占位符号,有sql注入风险,字符串类型不加引号 。简单类型 #{}中只能写value 一般用于传递数据库对象,传入表名
parameterType 和 resultType resultType 输入/输出映射(类型转换)
parameterType 输入参数类型
paremeterMap 输入结果类型
resultType 输出结果映射
selectOne与selectList
selectOne 查询一条记录,若查询则抛出异常(TooManyResultsException)
selectList查询一条或多条记录
mybatis在JDBC编程问题上中的解决方案
在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接
将SQL语句配置在xxxmapper.xml中,实现与Java代码分离
自动将Java对象映射至sql语句,通过statement中的parameterType定义输入参数类型
自动将 sql 执行结果映射至 java 对象,通过 statement 中的resultType 定义输出结果的类型
mybatis核心对象
SqlSessionFactory接口 由SqlSessionFactoryBuilder对象创建,定义了openSession的不同重载方法,不需要每次操纵数据库是都重新创建,最佳使用单例模式
SqlSession 面向用户的接口,定义数据操作,默认使用DefaultSqlSession实现类 由SqlSessionFactory创建,每个线程都有自己的SqlSession对象,线程不安全,放在方法内最佳,在finally块中关闭
SalMapConfig.xml配置文件
properties 属性 引入外部属性配置文件(db.properties)
typeAliases 类型别名
mappers(映射器) 指定Mybatis映射文件的位置
Mapper动态代理方式
实现原理
只需编写Mapper接口即可,由Mybtatis框架根据接口定义创建接口的动态代理对象
Mapper接口开发需遵循的规范
Mapper.xml文件中的namespace与mapper接口的类路径相同
Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml和mapper.xml中定义的每个sql的resultType的类型相同
加载Mapper.xml文件
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
selectOne和selectList 根据mapper接口的返回值决定调用哪个方法
namespace 建议使用mapper代理方法开发mapper接口,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。
Mapper.xml
定义操作数据库的sql,每个sql是一个statement,mybatis的核心
parameterType(输入参数)
传递简单类型
传递pojo对象
传递map
传递多参数 利用#{index} 索引 从0开始
resultType(输出类型)
输出简单类型
输出pojo对象
输出pojo列表
//输出 pojo 对象和输出 pojo 列表在 sql 中定义的 resultType 是一样的。
resultMap 指定pojo将查询结构映射为pojo,需要pojo的属性名和sql查询的列名一致方可映射成功。如果 sql 查询字段名和 pojo 的属性名不一致,可以通过 resultMap 将字段名和属性名作一个对应关系 , resultMap 实质上还需要将查询结果映射到 pojo 对象中。
为复合唯一约束则定义多个
Property:表示对应实体类的属性。
Column:表示 sql 查询出来的字段名。 即数据库表的字段名
Column 和 property 放在一块儿表示将 sql 查询出来的字段映射到指定的pojo 类属性上。
解决表中类名与实体类中属性不一致的问题
解决映射为复杂类型的 pojo
动态sql 各种标签方法实现动态拼接 sql。
标签
if 判断 常用条件 !=null&&!=’’
where 自动处理多余的And和OR
set 使用
foreach 用于数组和集合的循环遍历
collection:配置的是传递过来的参数类型,它可以是一个 array(数组)、 list(list 集合)、
map 集合的键,或者是 POJO 包装类中数组或集合类型的属性名。
item: 循环中当前的元素
index: 当前元素在集合的位置下标
open:循环开始
close:循环结束
separator:中间分隔符
注意(collection) 必须指定若传入的是单个参数类型是数组和list时可以分别时array和list
若传入多个参数,封装成map,属性值为map ,遍历时 index=key, item是map的值
若传入参数是POJO包装类,属性值就是该包装类中需要进行遍历的数组或者集合的属性、
Sql 片段 Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的,
and id=#{id}
and username like '%${username}%'
select * from user
mapper映射开发步骤:
写sql
验证sql
添加到mapper.xml
定义接口方法
测试方法
获取插入数据的id
方式一
select LAST_INSERT_ID()
insert into user(username,pwd,birthday,sex,address)
values(#{username},#{pwd},#{birthday},#{sex},#{address})
方式二
useGeneratedKeys="true"> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
SqlSession调用close()后,归还到线程池
jdbc获取的Session调用close()后,是销毁了
解决表中类名与实体类中属性不一致的问题
SQL语句中设置别名
resultMap 输出结果映射
多表联查
.vo包 创建对应的类
核心
对JDBC的封装
持久层框架
ORM
工作原理
配置文件 (SqlMapConfig.xml和Mapper.xml)
创建会话工厂 SqlSessionFactory
获取Sql连接 SqlSession
Executor 执行器接口操作数据库
对sql输入和输出参数进行设置
操作数据库
与JDBC比较
不同:
优势
Mybatis优化获取和释放
Mybatis对数据库进行存取操作
Mybatis生成动态sql语句
Mybatis能够对结果集进行映射
不足
jdbc直接操作底层,效率更高。
访问数据库代码的复杂性和重复性。