Mybatis(二)映射文件

本文详细介绍了MyBatis映射文件的使用方法,包括Mapper文件的约束、主配置引入方式、元素节点功能,以及常见属性如id、parameterType、resultType、resultMap等的解释。同时,深入解析了resultMap标签的配置方法,对比了#{}

Mybatis映射文件

    Mapper映射文件是Java实体类与数据库对象之间的桥梁,使用过程中一个Mapper文件对应一个数据库操作Dao接口

一、文件的约束

   加载映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

二、主配置引入

mybatis框架需要加载Mapper.xml映射文件,在主配置文件中添加映射

<mappers>
    <mapper resource="com/fyl/mapper/NewsMapping.xml"/>
    <mapper resource="com/fyl/mapper/UserMapping.xml"/>
</mappers>

三、元素节点

mapper 为元素的根节点

namespace:命名空间,一个namespace对应一个dao接口

        <mapper namespace="com.fyl.mapper.UserMapping">

以<mapper>作为根节点,在根节点中支持9个元素,分别为

cache-给定命名空间的缓存配置。

cache-ref:其他命名空间缓存配置的引用

resultMap:是最复杂最强大的元素,用来描述如何从数据库结果集中来加载

requestMap:

sql:可被其他语句引用的可重用语句块

insert:映射插入语句

update:映射更新语句

delete:映射删除语句

select:映射查询语句

四、常见属性

<select id="find" parameterType="int" resultType="com.fyl.entity.User">
  	select * from user where uid=#{uid}
</select>

    1.id (必须配置)

          id是命名空间的唯一标识符,可被用来代替这条语句,一个命名空间对应一个dao层接口,这个id相当与对应dao里面的某个方法,相当于某个方法的实现,因此id应该与方法名一致

    2.parameterType(可选配置,默认为mybatis自动选择处理)

          将要传入语句的参数的完全限定类名或别名,如果不配置,mybatis会通过ParameterType根据参数类型默认选择何时的typeHandler进行处理。ParameterType主要指定参数类型,可以是int,short,long,亦可以是复杂类型如类,集合等

    3.resultType(返回数据类型)

         返回期望类别类型的完全限定名或别名,集合的情况,是集合包含的类型,而不是集合本身。使用resultMap或resultType。

    4.resultMap(复杂返回)

         返回数据类型,命名引用外部的resultMap。返回map是MyBatis最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。使用resultMap或resultType,但不能同时使用

    5. flushCache

        若将其设置为true,不论语句什么时候被调用,都会导致缓存被清空,默认值:false

    6.statementType(可选配置,默认为PREPARED) 

        STATEMENT<PREPARED或CALLABLE的一个,这会让MyBatis分别使用Statement,PreparedStatement或CallableStatement

    7.KeyProperty(仅对insert有用, 默认:unset,)

       唯一标识一个属性,MyBatis会通过getGenerateKeys的返回值后者通过insert语句selectKey子元素设置它的键值,如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表

    8.KeyColumn(仅对insert和update有用)

       通过生成的键值设置表中的列名,这个设置尽在某些数据库是必须多的,当主键列不是表中的第一列的时候需要设置,如果希望得到过个生成的列,也可以是逗号分割的属性名称列表。

    9.userGeneratekeys(默认为false)

       仅对insert有用,令Mybatis使用jdbc的getGeneratedkeys方法来取出由数据库内部生成的主键(如mysql)管理数据库系统的自动递增字段。

    10.Timeout(默认值为unset,依赖驱动)

      这设置是在抛出异常之前,驱动程序等待数据库返回请求结果的描述,默认为unset(依赖驱动)

五、常见属性分析

     (1)parameterType使用

      Mybatis的传入参数parameterType类型分为:

          基本数据类型:int,string,long,data

          复杂数据类型:实体类和Map

      如何获取参数中的值:

         基本数据类型:#{参数}获取参数中的值

         复杂数据类型:类是#{属性名},map中则是#{key}

       注:传入多个参数如何写:

            无论传入的参数是什么,最后mybatis都会将传入的转换为map的,既然这样,当传入多个参数是,直接map类型,然后mapper.xml通过#{map.key}来获取值即可,实现动态搜索,或多个参数查询

       I :Dao层的函数方法

        public User selectUser(String username,String password);  

<select id=”selectUser”resultType=”User”>
     Select * from user where username=#{0} and password=#{1}>
</select>
注:#{0}代表接收的是dao层的第一个参数,#{1}代表的是dao层的第二个参数

     II: Map传多参数

      DAO:    public User selectUser(Map paramMap);

<select id=”selectUser” resultType=”User”>
Select * from user where username=#{username} and password=#{password}
</select>

     Service:

Private User selectUser(){
Mao paramMap=new hashMap();
 paramMap.put(“username”,”对应具体的参数值”);
 paramMap.put(“password”,”对应具体的参数值“);
User user=xx.selectUser(paramMap);

    III:基于注解(推荐)

        public List<User> selectUser(@Param(“username”)String username, @Param(“password”)String password)

<select id=”selectUser” resultMap=”usermap”>
   <select * from user where username=#{username} and password=#{password}
</select>

    (2) resultType:

        用于指定返回类型,指定的类型可以是基本类型,可以是类,注意类要写全名,并且如果返回是集合,返回类型为集合中泛型的类型

    (3)resultMap:

        resultMap和resultType作用类似,用于引导通过resultMap标签定义的映射类型,查询复杂数据,查询多个表数据映射到一个结果集当中。如果需要查询的只是一个表。可以简单定义实体类,实体代表数据库表中的一条记录,可以使用resultType;如果遇到一对多的问题,查询是需要查询多个表的列信息,那么便要使用resultMap

       使用resultMap 里面的值为:resultMap标签的id

六、resultMap标签详解

      配置resultMap标签

<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id=" " type=" ">
     id :唯一的标识 type:映射的pojo对象
  <id column=" "  jdbcType=" "  property=" " />
  <result column=" "  jdbcType=" "  property=" "/>
  <association property=" "  javaType=" ">
           <!--Property: pojo的一个对象属性-->
           <!--javaType: pojo关联的pojo对象-->
      <id column=" "  jdbcType=" "  property=" "/>
           <!--Column: 关联pojo对象对应表的主键字段-->
           <!--JdbcType:字段类型-->
           <!--Property: 关联pojo对象的主键属性-->
     <result column=" " jdbcType=" " property=" "/>
  </association>
  <!-- 集合中的property须为oftype定义的pojo对象的属性-->
  <collection property=" " ofType=" ">
           <!--Property: pojo的集合属性-->
           <!--ofType: 集合中的pojo对象-->
       <id column=" " jdbcType=" " property=" " />
           <!--Column: 集合中pojo对象对应的表的主键字段-->
           <!--jdbcType: 字段类型-->
           <!--property: 集合中pojo对象的主键属性-->
       <result column=" " jdbcType="字段类型" property=" " />  
           <!--Column: 可以为任意表的字段-->
           <!-- Property: 集合中的pojo对象的属性-->
  </collection>
</resultMap>

     注:resultMap中对象属性类中的字段和前面的字段名字最好别重复,否则查询时会显示前面的值;

            对象属性类中的字段要在sql语句中列出

七、#{}和${}

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

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

 例:实现模糊查询:

      第一种使用#{}完成

     <select id=”queryUser” parameterType=”string”

        resultType=”com.fyl.User”>

        select * from user where username LIKE #{username}

    </select>

     测试:List<Object> list=sqlSession.selectList(“queryUser”,”%张%”);

     第二种:使用${}完成

    <select id=”queryUser” parameterType=”string”

         resultType=”com.fyl.User”>

         select * from user where username LIKE ‘%${value}%’

    <select>

    测试:List<Object> list=sqlSession.selectList(“queryUser”,”张”);

注:Mybatis使用order by 动态传参问题?  

      mybatis在使用order by 时,要使用$符号,而不是#符号。

#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,如

      order by #{id} 传入为id,解析为 order by ‘id’;

$将传入的值直接显示生成在sql中,如order by ${id}传入为id,解析为order by id;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值