(一)使用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中的proName与proname),在书写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>