mybaits框架

一.环境搭建

1.1.持久化和ORM。

    1. 持久化就是程序的数据,在瞬时状态(new)和持久状态(数据库等)之间的转化。通过数据库操作进行转化。

    2. ORM.(O=javaBean)(R=关系型数据库)(M=映射)。

             注意:ORM这三方面要保持一致。任意部分的变动都要一起检测。

1.2.Mybatis的概念和优缺点

    优点:

      1.Mybatis是一个“半成品”的“ORM”框架。作用于DAO层。

      2.和hibernate相比,他是一个轻量级的选手。有着灵活的SQL的操作。

      3.小巧简单易学。

      4.和JDBC相比,他实现了SQL和代码的分离。可重用。

    缺点:

      1.SQL编写的量大。需要对sql语句熟悉。

      2.数据库的移植性较差。

1.3.Mybatis的主配置文件:

    1.数据源的相关信息。  

 <!-- environments 可以设置多个数据源, default属性指定了默认的数据源-->

    <environments default="development">

         <!-- environment 设置单个数据源,id属性给数据源指定一个唯一的名称 -->

         <environment id="development">

             <!--配置事务管理,采用JDBC的事务管理  -->

             <transactionManager type="JDBC"></transactionManager>

             <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->

             <dataSource type="POOLED">

                 <property name="driver" value="${driver}"/>

                 <property name="url" value="${url}"/>

                 <property name="username" value="${user}"/>

                 <property name="password" value="${password}"/>

             </dataSource>

         </environment>

    </environments>

  2.相应的子配置的引用。程序中只需要加载主配置文件即可。

            注意:新增子配置文件需要在主配置文件中添加引用。

                      引用的xml的地址。使用的“/”不是“.”

    <!-- 将mapper文件加入到配置文件中 -->

    <mappers>

         <mapper resource="cn/smbms/dao/user/UserMapper.xml"/>

    </mappers>

1.4.Mybatis的子配置文件。(通过namespace属性指定一个整个工程中唯一的标识符)

    1. 要执行的sql语句。(对应增删改查相应的标签)

    2. 实体类的映射信息。

<!-- namespace 指定了命名空间,在整个工程中唯一标识 -->

<mapper namespace="com.dao.EmpMapper">

   <!-- 查询用户表记录数

      select 标签用于执行查询语句

         id属性:在这个mapper中的唯一标识

         resultType 查询结果的返回值类型

   -->

   <select id="count" resultType="int">

      SELECT COUNT(1) as count FROM emp

   </select>

</mapper>

1.5.Mybatis的三个核心对象以及生命周期。

    1. SqlSessionFactoryBuilder:

        作用:加载Mybatis的主配置文件,创建SqlSessionFactory.

        生命周期:用过即丢,只存在与方法体内部。

    2. SqlSessionFactory:

        作用:创建SqlSession实例。

        生命周期:Application范围内,与应用的生命周期保持一致。是个单例模式。

    3. SqlSession

        作用:使用Mybatis的API执行sql。

        生命周期:对应一次数据库会话,用后关闭。线程级别不能共享。

1.6.SqlSession执行sql的两种方式

    1. 通过SqlSession实例直接运行要执行的sql。

        例如:sqlSession.selectList("找到唯一的sql");

    2.基于Mapper接口方式操作数据。(借助于接口的方法来调用sql)

        1.创建一个接口。接口的位置要和Mapper文件同一个目录。命名也要一致。

        2.配置这个接口和对应Mapper的关系。

            使用nameSpace属性建立接口类和Mapper的关系。

   <mapper namespace="com.dao.EmpMapper"> 

          3. 建立接口中方法和Mapper中sql的关系:

            1.方法名要对应 方法名对应id属性

            2.方法的参数要对应 paramterType属性

            3.方法的返回值要对应 resultMap属性和resultType属性     

         <select id="count" resultType="int">

           SELECT COUNT(1) as count FROM emp

         </select>

         public int count();

        4.使用SqlSession的getMapper方法,获取接口对象。

  EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

        5.调用接口的方法,执行sql。

一级缓存:

    1.session级别的缓存。

    2.默认都会有,不需要手动开启。

    3.线程不共享的。

    4.当session关闭或者flush时。session缓存清空。

二级缓存:

    1.sessionFactroy级别的缓存。同一个namespace内的select会被缓存。

    2.默认时不开启。需要手动开启。

    3.线程共享。

    4.当进行增删改的时候,缓存将被清空。

二级缓存开启的步骤:

    1.在mybatis的主配置文件中,开启缓存

<configuration>

   <settings>

      <setting name="Zhang" value="true"/>

      <setting name="Zhang2" value="false"/>

   </settings>

</configuration>

     2.在mapper中的设置缓存

<cache
  eviction="FIFO"    // 回收策略
  flushInterval="60000"  // 缓存刷新的间隔时间
  size="512"         // 缓存大小
  readOnly="true" />  // 默认时false,表示其他线程调用都是复制缓存对象。如果为true,线程使用的时原始的缓存对象

二.Mapper配置详解

select标签。用来执行select语句。需要保证每一个select元素和接口的方法一一对应(方法名、参数和返回值)。

    1.id属性:用来在单个Mapper中做唯一标识。要求和接口中的方法名保持一致。

    2.parameterType属性。相当于方法的参数。有三种值:

             1. 简单数据类型:int,string等。 

  <select id="Zhang" parameterType="int" resultType="map">

       select * from fian where emp_id=#{id} 

    </select>

             2.map。可以传入多个值。key值为map的key值   

    <select id="Zhang"  parameterType="map" resultType="map">

       select * from fang where emp_id=#{id} and dept_id=#{deptid}

    </select>

            3. javaBean。可以传入多个值。key值为属性名   

     <select id="getZhang" parameterType="com.bean.Fang" resultType="Fang">

       select * from fang where emp_id=#{id} and dept_id=#{deptid}

     </select>

   3.resultType属性。相当于方法的返回值。一般有两种值:

             1. 简单数据类型。返回单个值

             2. map。

   4.resultMap属性。主要用于希望返回自定义的javaBean时。

            他的主要作用就是实现数据库结果集(R)和javaBean(O)之间的映射关系。所以在他的配置中既要体现R,也要体现O。在结构和数据上ORM三方都要保持统一。

    例如:在多的一方配置如下:    

  <resultMap type="Emp" id="emp">

       <id property="empId"  column="emp_id" />

       <result property="empName" column="emp_name" />

        <!--多对一-->

       <association property="dept" javaType="com.bean.Dept">

          <id property="deptId" column="dept_id" />

          <result property="deptName" column="dept_name" />

       </association>

   </resultMap>

        下面时一对多的配置:

<resultMap type="com.bean.Dept" id="dept">

       <id property="deptId" column="dept_id" />

       <result property="deptName" column="dept_name" />

        <!--一对多-->

       <collection property="empList" ofType="com.bean.Emp">

          <id property="empId"  column="emp_id" />

          <result property="empName" column="emp_name" />

       </collection>

   </resultMap>

三、update insert delete标签。都没有resultType属性。

    1.他们的返回值均为影响行数。int类型。

    2,增删改默认需要提交事务。

、@param方式进行参数的传入。

public List<Emp> getEmpListEmp(@Param("name")String name);

五、动态SQL-mybatis

5.1.if标签。可以对输入的参数进行判断,来实现动态SQL。

      test属性用来作为判断条件,返回true或者false

select * from emp e where 1=1

<if test="empId!=null">

    and e.emp_id=#{empId}

</if>

5.2.where标签。用来简化where条件。智能的判断是否需要and、or。

    where有两个作用:1.代替where字符串。

                                    2.自动判断where“紧邻”的条件是否需要and、or.    

   select * from fang e ,dept d  

       <where>  

          e.dept_id=d.dept_id

          <if test="empId!=null">

              and e.emp_id=#{empId}

          </if>

          <if test="empName!=null">

              and e.emp_name like concat('%', #{empName} ,'%')

          </if>

       </where>

5.3.set标签。常用在update中。有两个作用:

        1.省略set字符串。

        2.自动判断最后的设置字段,有没有","。

<update id="updateEmp" parameterType="com.bean.Emp">

       update fang e 

          <set>

              <if test="empId!=null">

                 e.emp_id=#{empId},

              </if>

              <if test="empName!=null">

                 e.emp_name=#{empName}

              </if>

          </set>

       where e.emp_id=#{empId}

   </update>

5.4.trim标签。他是一个很灵活的标签。他可以替换set和where标签。有四个属性:

    1.prefix:增加前缀

    2.prefixOverrides: 前缀自动判断省略

    3.suffix:增加后缀

    4.suffixOverrides: 后缀自动判断省略


<trim prefix="where" prefixOverrides="and">

              

</trim>

<trim prefix="set" suffixOverrides="," >

              

</trim>

5.5. foreach标签。用来迭代集合,常用来组合in。

    1.collection:必填。指定要循环的集合。有三种情况:

        1.传入的参数为List时:填写list

        2.传入的参数为数组时:填写array

        3.传入的参数为Map,而map中有一个key值对应为集合时。填写key值

    2.open:在循环开头增加的字符串

    3.close:在循环结束增加的字符串

    4.separator:多次循环中的间隔符

    5.item:每次循环中的对象。

     

   <select id="getIn" parameterType="map" resultMap="fang">

select * from fang e

          where e.fang_id=#{empId} and e.fang_name in

          <foreach collection="names"

                  open="("

                  close=")"

                  separator=","

                  item="bbe" >

              #{nameq}

          </foreach>

   </select>

5.6 choose(when、otherwise)用来做if-else的代替。类似于switch。         

        <choose>

              <when test=""></when>

              <when test=""></when>

              <otherwise></otherwise>

          </choose>

六、resultMap元素

6.1.resultMap元素的属性:

        1.id:resultMap的唯一标识

        2.type:映射的结果类型

6.2 resultMap元素的子元素

        id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能

        result:指定结果集字段和实体类属性的映射关系

        association:映射“多对一”或“一对一”关系

        collection:映射“一对多”关系

七、嵌套结果映射之associationassociation

7.1.复杂的关联类型,映射一个嵌套JavaBean属性

7.2.多对一或一对一

7.3.属性:

        1.property:用来映射查询结果子集的实体属性

        2.javaType:完整Java类名或者别名

        3.esultMap:引用外部resultMap

7.4子元素: id result

八.嵌套结果映射之collection

8.1.复杂类型集合,映射嵌套结果集到一个列表

8.2 一对多

8.3 属性

        1. property:实体类中用来映射查询结果子集的集合属性

        2.ofType:集合中元素的类型,完整Java类名或者别名

        3.resultMap:引用外部resultMap

8.4子元素: id result

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值