MyBatis小结

来源:互联网 发布:极限挑战 知乎 编辑:程序博客网 时间:2024/06/07 00:10

(一)使用MyBatis的开发步骤

1.下载mybatis-3.2.2.jar包并导入工程
2.编写MyBatis核心配置文件(configuration.xml)
3.创建实体类-POJO
4.DAO层-SQL映射文件(mapper.xml)
5.创建测试类
读取核心配置文件mybatis-config.xml
创建SqlSessionFactory对象,读取配置文件
创建SqlSession对象
调用mapper文件进行数据操作

(二)MyBatis框架优缺点

优点
◦与JDBC相比,减少了50%以上的代码量
◦最简单的持久化框架,小巧并简单易学
◦SQL代码从程序代码中彻底分离,可重用
◦提供XML标签,支持编写动态SQL
◦提供映射标签,支持对象与数据库的ORM字段映射

缺点
SQL语句编写工作量大,对开发人员有一定要求
◦数据库移植性差

(三)MyBatis基本要素

MyBatis的核心对象
◦SqlSessionFactoryBuilder
◦SqlSessionFactory
◦SqlSession
mybatis-config.xml  系统核心配置文件
mapper.xml SQL映射文件


核心对象最佳生命周期最佳作用域

SqlSessionFactoryBuilder

方法体内方法体内(局部变量)SqlSessionFactory从应用服务启动开始一直到应
用服务停止--application整个应用内SqlSession一次请求的有效期一次请求的有效期内

(四)SQL映射的XML文件

SQL映射文件的几个顶级元素(按照定义的顺序)
◦mapper- namespace
◦cache- 配置给定命名空间的缓存
◦cache-ref– 从其他命名空间引用缓存配置
◦resultMap–用来描述数据库结果集和对象的对应关系
◦sql– 可以重用的SQL块,也可以被其他语句引用
◦insert– 映射插入语句
◦update– 映射更新语句
◦delete– 映射删除语句
◦select– 映射查询语句


1:mapper
namespace:命名空间
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定DAO接口
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id一一对应


2:select
select语句有很多属性可以详细配置每一条语句
id
命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id一一对应
parameterType
传入SQL语句的参数类型

parameterType
◦基础数据类型
–int、String、Date等
–只能传入一个,通过#{参数名}即可获取传入的值
◦复杂数据类型
–Java实体类、Map等
–通过#{属性名}或者#{map的keyName}即可获取传入值

resultType(resultMap)
SQL语句返回值类型的完整类名或别名

resultType:直接表示返回类型
◦基本数据类型
◦复杂数据类型
resultMap:对外部resultMap的引用
◦应用场景:
–数据库字段信息与对象属性不一致
–复杂的联合查询,自由控制映射结果
二者不能同时存在,本质上都是Map数据结构

ps当数据库里的字段和JavaBean里的字段不想同时,可以通过resultMap来解决,例如下面的proName属性,数据库中是proName,但JavaBean中是proname,通过
配置resultMap,就让两个不同的字段关联起来了。
<resultMap type="bean.provider" id="providerResult"><id column="id" jdbcType="BIGINT" property="id" /><result column="proCode" jdbcType="VARCHAR" property="proCode" /><result column="proName" jdbcType="VARCHAR" property="proname" /></resultMap>


ps在一些sql语句中,如果要传入多个值,可以将其封装为一个对象,再传入,例如下面中传入的provider对象。
ps再传入对象的时候,要是存在JavaBean中的字段值与数据库中的字段值不相同(例如resultMap中的proNameproname),在书写sql语句中,proName是数据库中的字段,而#{proname}中的proname是代表的JavaBean中的字段,若无法对应,则会报错。
<select id="findProviderByPronameAndProcode" resultMap="providerResult"parameterType="bean.provider">select * from smbms_provider where proName like CONCAT ('%',#{proname},'%') and proCode like CONCAT ('%',#{proCode},'%')</select>