Mybatis 基础简单归纳整理

mybatis配置文件sqlMap-Config.xml补充

配置详细介绍见网址:http://www.mybatis.org/mybatis-3/zh/configuration.html
<configeration>
    <!-- 加载属性文件  -->
    <!-- 
        在properties元素体内定义的元素属性优先被读取,
        然后读取properties元素中resource或url加载的属性,他会覆盖已读取的同名属性,
        最后读取parameterType传递的属性,它会覆盖已读取的同名属性  
    -->
    <!-- 建议
            1.不要在properties元素体内定定义任何值,只将属性定义在properties文件中
            2.在properties文件中定义的属性名一定要有特殊性,如xxxx.xxx
    -->
    <properties resource="db.properties">
        <property name="" value=""/>
        <property name="" value=""/>
    </properties>

    <!-- 全局配置参数  -->
    <!-- 使用时再进行配置,否则配错了影响系统 -->
<!--    <setting> -->
<!--    </setting> -->

    <!-- 别名定义  -->
    <typeAliases>
        <!-- 
            针对单个别名定义
                type:类型的路径
                alias:别名
          -->
        <typeAlias type="com.zyl.mybatis.demo.pojo.EbizCode" alias="EbizCode"/>
        <!-- 批量别名定义
            mybatis 自动扫描包中的po类,自动定义别名,别名就是类名(首字母大小写均可)
            注:vo视图层对象,po持久层对象,pojo自定义对象
          -->
        <package name="com.zyl.mybatis.demo.pojo"/>
    </typeAliases>

    <!-- 类型处理器
            mybatis通过typeHandlers完成jdbc类型和java类型的转换,
            通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义
      -->

<!--    <typeHandlers></typeHandlers> -->


    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理, 事务控制由mybatis进行管理  -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池,由mybatis进行管理  -->
            <dataSource type="POOLED">
                <property name="driver" value=""/>
                <property name="url" value=""/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>  
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <!-- 通过resource 一次加载一个映射文件 -->
        <mapper resource="sqlmap/EbizCode.xml" />

        <!-- 通过mapper 加载映射文件 (单个)
            规范:
                需要将mapper接口的类名和mapper.xml映射文件名保持一致,且在一个目录中(使用mapper代理方式)
        -->
<!--        <mapper class=""/>

        <!-- 批量加载mapper映射文件 
            规范:
                需要将mapper接口的类名和mapper.xml映射文件名保持一致,且在一个目录中(使用mapper代理方式)
        -->
<!--        <package name=""/> -->
    </mappers>

</configeration>

mybatis基础简单归纳

一、首先看下sql文件的编写
<!--
     命名空间,作用是对sql进行分类管理,理解sql隔离 
    注意:使用mapper代理方法开发,namesapce有特殊重要的作用
    The content of element type "mapper" must match "EMPTY". 这个错误是上面的头有问题
    (dtd头文件引入出现错误)
-->
<mapper namespace="ebizCode">

    <!-- 定义sql片段 -->
    <!-- 
        一般基于单表来定义sql片段,可重用性高
        一般不要包含<where>标签
     -->
    <sql id="test">

    </sql>

    <!-- 定义resultMap
        将 select id id_, name name_ from pf_customer 和pojo类中的属性做一个映射关系

        type:resultMap最终映射的java对象类型,可以使用别名
        id: resultMap唯一标识

     -->
     <resultMap type="pfCustomer" id="pfCustomerMap">
        <!-- id表示结果集唯一标识 -->
        <id column="id_" property="id" />
        <!-- 普通映射定义 -->
        <result column="name_" property="name" />
     </resultMap>

    <!-- 配置sql语句 -->
    <!-- 
        通过selct执行数据库查询

        id:标识映射文件中的sql,称为statement的id

        将sql语句封装到mapperdstatement对象中

        #{} 表示一个占位符号

        parameterType 指定输入参数的类型

        #{codeType} 其中codeType表示输入的参数,参数名称就是id,若输入参数为简单类型, #{}中参数名可以任意,可以value或其它名称

        resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录(画重点)映射成java对象


     -->
    <select id="getEbizCodeByType" parameterType="String" resultType="com.zyl.mybatis.demo.pojo.EbizCode">
        select * from ebiz_code c where c.code_type= #{codeType} 
    </select>

    <!-- 根据用户名模糊查询,可能返回多条 -->
    <!-- (画重点)resultType:指定就是单条记所映射的java对象类型 -->
    <!-- ${}表示拼接sql串,将接收到的参数不加任何修饰拼接在sql中(容易造成sql注入) 
         ${value}表示输入参数的内容,若传入类型是简单类型,${}中只能传value
    -->
    <select id="getEbizCodeByName" parameterType="String" resultType="com.zyl.mybatis.demo.pojo.EbizCode">
        select * from ebiz_code c where c.code_type like '%#{value}%' 
    </select>

    <select id="getEbizCodeByAll" parameterType="com.zyl.mybatis.demo.pojo.EbizCode" resultType="com.zyl.mybatis.demo.pojo.EbizCode">

        <!-- where标签可以自动去掉第一个and -->
        <where>
            <if test="ebizCode != null">
                and ebizCode.name like '%#{value}%' 
            </if>
            <if test="ebizCode != null">
                and ebizCode.name like '%#{value}%' 
            </if>
            <if test="ebizCode != null">
                and ebizCode.name like '%#{value}%' 
            </if>
            <if test="ebizCode != null">
                and ebizCode.name like '%#{value}%' 
            </if>
            <!--
                 open 是拼接前的连接符 
                 close 是拼接后的连接符
                 separator 每个对象之间的连接符
            -->
            <foreache collecion="待遍历的集合" item="集合中每个对象" open="AND(" close=")" separator="or">

            </foreache>

        </where>
    </select>

    <!-- 引用sql片段 -->
    <select id="getEbizCodeByAll" parameterType="com.zyl.mybatis.demo.pojo.EbizCode" resultType="com.zyl.mybatis.demo.pojo.EbizCode">

        <!-- where标签可以自动去掉第一个and -->
        <where>
            <!-- 引用sql片段id,若片段id不在本mapper中,需要加namespace -->
            <include refid="test" />
            <!-- 还可以引用其他片段 -->
        </where>
    </select>

</mapper>

1. parameterType:在映射文件通过parameterType指定输入 参数的类型;

2. resultType:在映射文件通过resultType指定输出结果类型 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。


3.#{}和${}区别

#{} 表示一个占位符;#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号(会引起sql注入,存在安全隐患,不建议使用)
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

4.selectOne表示查询出一条记录进行映射,使用【4】可以实现,使用【5】也可以。

5. selectList查询出多条记录进行映射,使用【5】可以实现,使用【4】不可以。

6. mybatis / hibernate 本质区别和应用场景:

hibernate是一个标准的ORM框架。入门门槛较高,不需要程序写sql,sql语句自动生成。对sql语句进行优化、修改比较困难。
应用场景:适用于需求变化不多的中小型项目,比如后管系统、erp、oa等。

mybatis是专注sql本身,需要程序猿自己编写sql语句,sql修改、优化比较方便。
mybatis是一个不完全的orm框架,虽然程序员自己写sql,但也可以实现映射(输入/输出映射)。
应用场景:变动多,如互联网项目。

7. mybatis开发dao的方法

    原始dao的方法
        需要程序员自己编写dao接口和实现类
        需要在dao实现类中注入一个sqlSessionFactory工厂

    总结原始dao开发问题
        Ⅰ.dao接口实现类方法中存在大量的模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
        Ⅱ.调用SqlSession方法时,将statement的参数硬编码了。
        Ⅲ.调用SqlSession方法时传入的变量,由于SqlSession方法使用泛型,导致即使变量类型传入错误类
           型,在编译阶段也不会报错,不利于开发。
    mapper代理开发(mybatis才有)
        只需程序员编写mapper接口(就是dao接口)
        程序员再编写mapper.xml(映射文件)和mapper.java需要遵循一些开发规范

    采用mapper代理开发dao接口注意事项:
        Ⅰ.在mapper.xml中 namespace 等于mapper接口全路径地址。
        Ⅱ.mapper.java接口中的方法,方法名和xml中statement的id一致。
        Ⅲ.mapper.java接口中的方法输入参数类型和mapper.xml中statement的paramterType指定的类型一致。
        Ⅳ.mapper.java接口中的方法输出参数类型和mapper.xml中statement的resultType指定的类型一致。

8. SqlSession相关

8.1.SqlSessionFactoryBuilder
    通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
    将SqlSessionFactoryBuilder当成一个工具类,不需要使用单例模式进行管理SqlSessionFactoryBuilder
    在需要创建工厂SqlSessionFactory的时候,只需要new一次SqlSessionFactory即可

8.2.SqlSessionFactory
    通过SqlSessionFactory创建会话SqlSession,使用单例模式管理SqlSessionFactory(一旦创建,一直使用一个实例)。
    mybatis 和 spring 整合后,使用单例模式管理SqlSessionFactory。

8.3.SqlSession
    面向用户(程序员)的接口。
    SqlSession 提供很多操作数据库的方法。
    SqlSession 是线程不安全的。在  SqlSession 的实现类中除了有接口的方法(具体操作数据库的方法),还有数据域属性。     
    SqlSession 最佳应用场合在方法体内,定义成局部变量。

9.执行过程(画重点)

 Ⅰ.配置mybatis文件,sqlMapConfig.xml(名字不固定)      
 Ⅱ.通过配置文件,加载mybatis运行环境,创建sqlSessionFactory会话工厂(sqlSessionFactory实际使用时按单例方式)
 Ⅲ.通过sqlSessionFactory创建sqlSession
     sqlSession是一个面向用户的接口(提供操作数据的方法),实现对象线程不安全,建议sqlSession应用场合在方法体内。
 Ⅳ.调用sqlSession的方法操作数据库
    若需要提交事务,需执行sqlSession的commit方法
 Ⅴ.释放资源,关闭sqlSession
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值