黑马程序员技术交流社区

标题: 【重庆校区】-【基础框架总结】-【 Mybatis】 [打印本页]

作者: 陈文老师    时间: 2017-11-22 11:18
标题: 【重庆校区】-【基础框架总结】-【 Mybatis】

要毕业了?要找工作啦?开不开心?紧不紧张?回首黑马这半年,感觉自己是不是被自己的努力所感动,然而仔细想想学了很多,马上要出去找工作了却脑子一片空白。重庆JavaEE就业2期龙师兄毕业后在寝室闭关修炼半个月(当然不建议大家这样做,一定要趁着你刚毕业,什么都知道赶紧出去找工作,越到后面越忘得多)个人总结了咱们6个月以来所学的一些基础框架和淘淘项目的一些核心技能点,要复习的,赶紧看看吧!但是答应我,看完后赶紧出去面试哟~~~不要怂,就是干!!!

【基础框架篇】-【 Mybatis

1    Mybatis
1.1   什么是mybatis?
1.    Mybatis是一优秀的持久层框架,它对jdbc的操作数据库的过程进行了封装,是开发者只需要关注sql本身,而不需要花费精力去处理如注册驱动,创建连接没创建statement等jdbc繁琐的过程代码,mybatis通过xml或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql进行映射生成最终的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
2.    Jdbc编程
a)      步骤
A.    加载数据库驱动
B.    创建jdbc statement对象
C.    设置sql语句
D.   设置sql语句中的参数
E.    通过statement执行sql并获取结果
F.     对sql执行结果进行解析处理
G.    释放资源
b)      Mybatis解决Jdbc存在的问题
A.    数据库连接创建,释放频繁造成系统资源浪费,从而影响到系统的性能,使用数据库连接池可以解决这种问题                                     解决:在SqlMapConfig.xml中配置数据库连接池,使用连接池管理数据库连接
B.    Sql语句在代码中硬编码,造成代码维护很难,实际应用sql变化可能比较大,sql变动需要修改java代码                                               解决:将sql语句配置在xxxxMapper.xml文件中与java代码分离
C.    使用PreparedStatement向占位符传递参数存在硬编码,因为sql语句的where挑件不一定,可能多也可能少,修改sql还需要代码,系统不易维护                                                                             解决:mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数类型
D.   对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便   解决:Mybatis自动将sql执行结果映射至java对象,通过statement中resultType定义输出结果的类型
c)       Mybatis架构
                                                 i.      Mybatis配置:SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息,mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句,此文件需要再SqlMapConfig中加载。
                                               ii.      用过mybatis环境等配置信息构造SqlSessionFactory会话工厂
                                              iii.      由会话工厂创建sqlSession会话,操作数据库需要通过SQLSession进行
                                              iv.      Mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器,一个是缓存执行器。
                                                v.      Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等,mapper.xml文件中一个sql对应一个mappedstatement对象,sql的id即使mapped statement的id
                                              vi.      Mapped statement对sql执行输入参数进行定义,包括hashmap,基本类型,pojo,executor通过mapped statement在执行sql前将输入的java对象映射到sql中,输入参数映射就是jdbc编程中对prepareStatement设置参数
                                             vii.      Mapped statement对输出结果进行定义,包括hashmap,基本类型,pojo,Executor通过mapped statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果解析处理过程
B.    Sqlsession的使用范围:
                                                 i.      SqlSession中封装了对数据库的操作,通过SQLSessionFactory创建sqlSession,而sqlSessionFactory是通过sqlSessionFactoryBuilder进行创建。
C.    SqlSessionFactoryBuilder
                                                 i.      它用于创建sqlSessionFactory,sqlSessionFactory一旦创建完成就不需要sqlSessionFactoryBuilder了,因为sqlSession是用过sqlSessionFactory产生,所以可以将sqlSessionFactoryBuilder当成一个工具使用,最佳使用范围是方法范围即方法体内局部变量
D.   SqlSessionFactory
                                                 i.      SqlSessionFactory使一个借口,接口中定义了openSession的不 同重载方法,sqlSessionFactory的最佳使用范围是整个应用运行期间内,一旦创建后可以重复使用,通常以单例模式管理sqlSessionFactory
E.     
1.2   为什么使用mybatis?
1.    Mybatis的优点:
a)      易于上手和掌握,
b)      Sql写在xml里,便于统一管理和优化
c)       解除sql与程序代码的耦合
d)      提供映射标签,支持与数据库的orm字段关系映射
e)      提供对象关系映射标签,支持对象管组建维护
f)       提供xml标签,支持编写动态sql
2.    缺点:
a)      Sql工作量大
b)      Sql依赖于数据库,可移植性差
c)       Xml里标签必须唯一,导致dao中方法不支持重载
d)      字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖sql
e)      Dao层过于简单,对象组装的工作量很大
f)       不支持级联更行和级联删除
g)      编写动态sql时不方便调试,尤其在逻辑复杂时
h)      提供的写动态sql的xml标签功能过于简单,编写动态sql任然受阻,且可读性很低
i)        若不查询主键字段,容易造成查询出的对象有覆盖现象
j)        参数的数据类型支持不完善
k)      多参数时,使用不方便,功能不够强大
l)        缓存使用不当,容易产生脏数据。
1.3   怎么使用mybatis?
1.    单独使用mybatis
a)      配置SqlMapConfig.xml文件
A.    配置配置environment,默认development
B.    配置事务
C.    配置连接池
b)      配置映射文件XXX.xml
A.    配置mapper,指定namespace
B.    配置sql执行语句,需要指定id,可能需要指定参数类型,肯恩需要指定返回值类型
C.    ${xxx}和#{xxx}的区别;
                                                 i.      ${xxx}:表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接受简单参数类型值或者pojo属性值,如果parameterType传输单个简单类型值${}括号中只能是value
                                               ii.      #{xxx}:表示一个占位符,通过#{}可以实现parameterType向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接受简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括号可以是value或者其他名字。
D.   parameterType和resultType
                                                 i.      parameterType:指定输入参数类型
                                               ii.      resultType:指定输出结果类型
E.    selectOne和selectList
                                                 i.      selectOne:查询一条记录,如果是它查询多条记录则抛异常
                                               ii.      selectList:可以查询一条或多条记录
F.     mysql的自增主键返回
                                                 i.      <selectKey keyProperty=”id”order=”after”>
G.    Mysql使用uuid实现主键
                                                 i.      需要增加select uuid()得到uuid值
                                               ii.      <selectKey >selectuuid()</selectKey>
H.   接口定义有如下特点
                                                 i.      Mapper接口方法名mapper.xml中定义的statement的id相同
                                               ii.      Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
                                              iii.      Mapper接口发的输出参数类型和mapper.xml中定义ststement的resultType的类型相同
c)       加载xxx.xml映射配置文件
A.    在SqlMapConfig.xml文件中添加标签<mappers><mapper resource=”xxx/xxx.xml”/></mappers>
d)      映射器mappers的配置常用的有三种
A.    <mapper resource=”’>:使用相对类路径的资源
B.    <mapper class=””>:使用mapper接口类路径
C.    <package name>:注册指定包下的所有mapper接口
e)      输入映射和输出映射
A.    parameterType:
                                                 i.      传递简单类型、
                                               ii.      Pojo对象类型
1.          Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号的值为pojo属性名,如:${xx.yy}
B.    ResultType
                                                 i.      输出简单类型
                                               ii.      输出pojo对象;一般在resultType中指定pojo类的全限定名或者别名(需要配置)
C.    ResultMap
                                                 i.      resultType可以指定pojo将查询结果映射为pojo,但是需要pojo的属性名和sql查询呢的列名一直才可以完成映射
                                               ii.      如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap是指上海需要将查询结果映射到pojo对象中
                                              iii.      ResultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询
                                              iv.      配置resultMap
                                                v.      <resultMap type=”xxx”id=”xxxResulyMap”>
1.          <id column=”id_”property=”id”>:此属性表示查询结果集的唯一标识,若果多个字段为复合唯一约束则定义多个<id>
2.          <result column=”username_”property=”username”>
3.          Column表示sql查询出来的字段名
4.          Property表示pojo类的属性
D.   动态sql:通过mybatis提供的各种标签方法实现动态拼接sql
                                                 i.      <if test=”条件”>,多个if使用多个<if>标签
                                               ii.      <where>表示sql中的where
                                              iii.      <foreach collection=”集合名” open=”and xx in(” close=”)” item=”xx” separator=”,”>
                                              iv.      Sql片段:sql中可将重复的sql提取出来,使用include引用即可,最终达到sql重用的目的
1.          <sql id=”xx_xx”>
2.          <select id=””parameterType=”” result=””><include refid=”xx_xx”>
3.          如果需要引用其他yyy.xml映射文件中的sql片段时<include refid=”namespace.sql片段”>
E.    一对一查询
                                                 i.      定义专门的pojo类作为输出类型,其中定义了sql查询结果集所有的字段,此方法较为简单,企业中使用普遍
                                               ii.      使用resultMap,定义专门的resultMap用于一对一查询结果
1.          Result的配置
2.          <resultMap type=”xxx”id=”xxxResultMap”>
1.   <id column=”id”property=”id”>
2.   <result column=””property=””>
3.      <associationproperty=”yyy” javaType=””>:associatio表示进行链查询单条记录
4.         <id column=”yyy_id” property=”id”>
5.         <result column=”” property=””>
F.     一对多:例如用户和订单是一对多关系
                                                 i.      使用resultMap
1.          <resultMap type=”user”id=”userOrderResultMap”>
1.   <id property=”id”column=”id”>
2.   <result property=”username”column=”username”>
3.   <collectionproperty=”orders” ofType=”orders”>
4.     <id column=”order_id” property=”id”>
5.     <result column=”order_xx”property=”orderxx”>
f)       Mybatis整合spring
A.    思路:
                                                 i.      SqlSessionFactory对象应该放到spring中作为单列存在
                                               ii.      传统dao开发方式中,应该从spring容器中获取sqlSession。
                                              iii.      Mapper代理形式中,应该从spring容器中直接获取mapper的代理对象
                                              iv.      数据库的连接、数据库连接池、事务管理都交给spring容器来完成
B.    整合步骤:
                                                 i.      创建mybatis的全局配置文件SqlMapConfig.xml,内容可不写
                                               ii.      编写spring的配置文件
1.          数据库连接和连接池
2.          事务管理
3.          SqlSessionFactory对象,配置到spring容器中,
4.          Mapper代理对象或者是dao实现类配置到spring中
5.          只用mapper对象作为参数时使用别名可以如下配置
6.           
                                              iii.      编写dao和mapper文件



作者: zhoufan0628    时间: 2017-11-22 11:33
虽然说看不懂,但是感觉好厉害

作者: Port    时间: 2017-11-22 13:42


作者: 渝鱼鱼    时间: 2017-11-25 10:40
很详细全面,谢谢老师,收藏了
作者: 陈文老师    时间: 2017-11-25 17:10
zhoufan0628 发表于 2017-11-22 11:33
虽然说看不懂,但是感觉好厉害

是的哟,以后慢慢你就能看懂了
作者: 黑马小黄人    时间: 2017-12-8 15:10
怎么感觉没有用过呢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2