美文网首页程序员
Mybatis框架基础核心知识总结

Mybatis框架基础核心知识总结

作者: 大小说家RCQ | 来源:发表于2017-04-07 17:17 被阅读0次

    MyBatis介绍

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

    JDBC存在的问题

    1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
    2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
    4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

    Mybatis的架构

    Paste_Image.png

    #{}和${}

    1.#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

    如果传入的是基本类型,那么#{}中的变量名称可以随意写
    如果传入的参数是pojo类型,那么#{}中的变量名称必须是pojo中的属性.属性.属性..
    

    2.${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

    如果传入的是基本类型,那么${}中的变量名必须是value
    如果传入的参数是pojo类型,那么${}中的变量名称必须是pojo中的属性.属性.属性...
    注意:使用拼接符有可能造成sql注入,在页面输入的时候可以加入校验,不可输入sql关键字,不可输入空格
    

    parameterType和resultType

    parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

    resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

    selectOne和selectList

    • selectOne查询一条记录
    • selectList可以查询一条或多条记录

    mysql自增主键返回

    • 通过修改sql映射文件,可以将mysql自增主键返回:
    <insert id="insertUser" parameterType="cn.swun.po.User">
        <!-- selectKey将主键返回,需要再返回 -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
           insert into user(username,birthday,sex,address)
            values(#{username},#{birthday},#{sex},#{address});
    </insert>
    
    • 添加selectKey实现将主键返回

    • keyProperty: 返回的主键存储在pojo中的哪个属性

    • order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after

    • resultType:返回的主键是什么类型

    LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。

    Mysql使用 uuid实现主键

    • 需要增加通过select uuid()得到uuid值
    <insert  id="insertUser" parameterType="cn.itcast.mybatis.po.User">
    <selectKey resultType="java.lang.String" order="BEFORE"  keyProperty="id">
    select uuid()
    </selectKey>
    insert into user(id,username,birthday,sex,address)  values(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
    

    注意:这里使用的order是BEFORE


    Mybatis解决jdbc编程的问题

    1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

    解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

    2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
     解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

    3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

    解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

    4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

    解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。


    动态代理方式(只需要接口)

    mapper接口代理实现编写规则:
    1) 映射文件中namespace要等于接口的全路径名称
    2) 映射文件中sql语句id要等于接口的方法名称
    3) 映射文件中传入参数类型要等于接口方法的传入参数类型
    4) 映射文件中返回结果集类型要等于接口方法的返回值类型


    hibernate和mybatis区别

    • hibernate:

    • 它是一个标准的orm框架,比较重量级,学习成本高.

    • 优点:高度封装,使用起来不用写sql,开发的时候,会减低开发周期.

    • 缺点:sql语句无法优化

    • 应用场景:oa(办公自动化系统), erp(企业的流程系统)等,还有一些政府项目,
      总的来说,在用于量不大,并发量小的时候使用.

    • mybatis:它不是一个orm框架, 它是对jdbc的轻量级封装, 学习成本低,比较简单

    • 优点:学习成本低, sql语句可以优化, 执行效率高,速度快

    • 缺点:编码量较大,会拖慢开发周期

    • 应用场景: 互联网项目,比如电商,P2p等

    • 总的来说是用户量较大,并发高的项目.


    其他知识

    • pojo:不按mvc分层,只是java bean有一些属性,还有get set方法
    • domain:不按mvc分层,只是java bean有一些属性,还有get set方法
    • po:用在持久层,还可以再增加或者修改的时候,从页面直接传入action中,它里面的java bean 类名等于表名,属性名等于表的字段名,还有对应的get set方法
    • vo: view object表现层对象,主要用于在高级查询中从页面接收传过来的各种参数.好处是扩展性强
    • bo: 用在servie层,现在企业基本不用.

    这些po,vo, bo,pojo可以用在各种层面吗?

    可以,也就是po用在表现层,vo用在持久层不报错,因为都是普通的java bean没有语法错误.但是在企业最好不要混着用,因为这些都是设计的原则,混着用比较乱.不利于代码维护.


    进阶知识

    • 输入映射(就是映射文件中可以传入哪些参数类型)
      1)基本类型
      2)pojo类型
      3)Vo类型

    • 输出映射(返回的结果集可以有哪些类型)
      1)基本类型
      2)pojo类型
      3)List类型

    • 动态sql:动态的拼接sql语句,因为sql中where条件有可能多也有可能少
      1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字
      2)if:判断传入的参数是否为空
      3)foreach:循环遍历传入的集合参数
      4)sql:封装查询条件,以达到重用的目的

    • 对单个对象的映射关系:
      1)自动关联(偷懒的办法):可以自定义一个大而全的pojo类,然后自动映射其实是根据数据库总的字段名称和pojo中的属性名称对应.
      2)手动关联: 需要指定数据库中表的字段名称和java的pojo类中的属性名称的对应关系使用association标签

    • 对集合对象的映射关系
      只能使用手动映射:指定表中字段名称和pojo中属性名称的对应关系使用collection标签

    1. spring和mybatis整合

      整合后会话工厂都归spring管理

    原生Dao实现:
    需要在spring配置文件中指定dao实现类
    dao实现类需要继承SqlSessionDaoSupport超类
    在dao实现类中不要手动关闭会话,不要自己提交事务.

    Mapper接口代理实现:
    在spring配置文件中可以使用包扫描的方式,一次性的将所有mapper加载

    • 逆向工程:自动生成Pojo类,还可以自动生成Mapper接口和映射文件

    注意:生成的方式是追加而不是覆盖,所以不可以重复生成,重复生成的文件有问题.如果想重复生成将原来生成的文件删除

    相关文章

      网友评论

        本文标题:Mybatis框架基础核心知识总结

        本文链接:https://www.haomeiwen.com/subject/scmhattx.html