Mybatis学习——认识Mappper.xml配置文件

来源:互联网 发布:传奇加载物品数据库 编辑:程序博客网 时间:2024/06/05 05:28

Mybatis最大的好处就是封装了JDBC,减少了50%y以上的JDBC代码量,提供Java中POJOs与数据库之间的映射,在配置文件Mapper.xml中就可以使用SQL语句,消除了sql语句与程序代码之间的耦合。
那么接下来作为新手,我通过查资料学习,总结Mappper.xml配置文件的认识。

认识Mapper文件中的元素

1.映射文件节点元素构成

是以<mapper>...</mapper>作为根节点,在根节点中有9个元素,如下图在Ecplise截图所示:
这里写图片描述
分别为:

1.<sql>...</sql>2.<cache>...</cache>3.<cache-ref>...</cache-ref>4.<parameterMap>...</parameterMap>5.<resultMap>...</resultMap>6.<select>...</select>7.<update>...</update>8.<delete>...</delete>9.<insert>...</insert>

其中6、7、8、9就是sql语句中的增删改查,非常容易理解

2.映射文件元素的作用

  • cache : 配置给定命名空间的缓存。
    Mybatis相比较Hibernate还有一个强大的缓存机制, 可以使我们很方便配置与定制。缓存机制主要分为一级缓存与二级缓存。
    一级缓存:默认情况下Mybatis是没有开启缓存的,是默认session缓存机制的,当session关闭close或者flush刷新以后,在作用域session中所有cache将会清空。
    二级缓存:需要在配置映射文件中加下面的语句
<cache/>

这样就可以实现二级缓存,关于二级缓存的属性,如下所示:

<cache  <!--使用FIFO(先进先出)算法来缓存,默认的是LRU(最近使用最少算法)-->  eviction="FIFO"  <!--每隔60m刷新一次缓存-->  flushInterval="60000"  <!--缓存会存储列表对象或者集合的512个引用,默认为1024个-->  size="512"  <!--返回的对象只读状态-->  readOnly="true"/>

除此之外,当然也可以进行自定义缓存,但是具体的我目前还没进一步加深学习,还没理解透。

  • cache-ref : 从其他命名空间引用缓存配置。
    当你想在namespace命名空间中共享某个相同的缓存机制或者实例,就可以使用cache-ref
<cache-ref namespace="com.xxxx.xxxx"/>
  • resultMap :主要是当对数据库进行负责的联合查询,一对多的情况时候返回的数据类型。
    Mybatis中进行select查询以后,返回的类型通常分为resultType与resultMap。resultType是直接返回的类型,resultMap是高级结果映射,但resultMap与resultType只能在其中用一个。
    resultMap通常用于下列的情况:比如每个学生都有自己的课程安排表student_course,也有自己的兴趣爱好student_hobby。
--表一:studentCREATE TABLE `student` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `name` varchar(255) NOT NULL,     `age` int(3) DEFAULT NULL,    PRIMARY KEY (`id`)  ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;  --表二:student_courseCREATE TABLE `student_course` (    `course_id` varchar(11) DEFAULT NULL,    `course_name` int(11) DEFAULT NULL  `course_time` int(11) DEFAULT NULL     PRIMARY KEY (`course_id`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;   --表三:student_hobbyCREATE TABLE `student_hobby` (    `hobby_id` varchar(255) NOT NULL,    `hobby_name` varchar(255) DEFAULT NULL,    PRIMARY KEY (`hobby_id`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我们需要通过student的id查找到学生的兴趣爱好与课程,这时候就用到resultMap配置了。如下实例代码配置resultMap:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><resultMap type="" id="">        <!-- id, 唯一性,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键            property属性对应javabean的属性名,column对应数据库表的列名            (这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了)        -->        <id property="" column=""/>        <!-- result与id相比, 对应普通属性 -->            <result property="" column=""/>        <!--             constructor对应javabean中的构造方法         -->        <constructor>            <!-- idArg 对应构造方法中的id参数 -->            <idArg column=""/>            <!-- arg 对应构造方法中的普通参数 -->            <arg column=""/>        </constructor>        <!--             collection,对应javabean中容器类型, 是实现一对多的关键             property 为javabean中容器对应字段名            column 为体现在数据库中列名            ofType 就是指定javabean中容器指定的类型        -->        <collection property="" column="" ofType=""></collection>        <!--             association 为关联关系,是实现N对一的关键。            property 为javabean中容器对应字段名            column 为体现在数据库中列名            javaType 指定关联的类型         -->        <association property="" column="" javaType=""></association></resultMap></span>
  • parameterMap :目前已经不用了不,不做学习记录

  • sql : 可以重用的 SQL,如列名、字段名、表名、字段值等。

    <!--表名 -->    <sql id="tableName">        sc_student    </sql>    <!-- 字段 -->    <sql id="Field">    STUDENT_ID,    NAME,    AGE,    BIRTHDAY    </sql>    <!-- 字段值 -->    <sql id="FieldValue">    #{STUDENT_ID},    #{NAME},    #{AGE},    #{BIRTHDAY}    </sql>

通过使用<include refid="" />标签引用,refid=”” 中的值指向需要引用的<sql>中的id=“”属性,可以重复使用sql

<include refid="tableName"><include refid="Field"></include><include refid="FieldValue"></include>
  • insert : 映射插入语句
  • update : 映射更新语句
  • delete –:映射删除语句
  • select: 映射查询语句

    insert、update、delete、select标签用法相类似,都可以使用动态的sql语句

<mapper namespace="com.majing.learning.mybatis.dao.UserDao">      <insert id="addUser" parameterType="student" useGeneratedKeys="true" keyProperty="id">          insert into user(name,password,age) values(#{id},#{name},#{age})      </insert>      <delete id="deleteUser" parameterType="int">          delete from student where id = #{id}      </delete>      <update id="updateUser" parameterType="user" >          update student set name = #{name}, name= #{name}, age = #{age} where id = #{id}      </update>  </mapper> 

这相当于可以理解为:JDBC中的预处理代码,标签中的id就是pst

String sql="insert into stduent(id,name,age) values(?,?,?)";PreparedStatement pst=con.prepareStatement(sql);pst.executeUpdate();
阅读全文
0 0
原创粉丝点击