mybatis配置文件模板及常用标签介绍说明

书欣 MyBatis 2022-09-19 22:22:34 16600 1
下文笔者讲述mybatis中配置文件中常见的标签简介说明及mapper配置文件简介说明,如下所示

mybatis配置文件简介

mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
​
    
    <settings>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
   <!--配置和数据库链接相关的信息-->
    <!--四大件
    驱动
    地址
    用户名
    密码
    -->
    <!--
    default 默认的环境, 在这个配置文件中 可以创建多个环境,如果有多个的时候需要指定默认值,这个值就是下面环境的id值
    -->
    <environments default="">
        <environment id="">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql:///数据库名?useUnicode=true&characterEncoding=utf8"/>
                <property name="username" value="" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- 注册映射文件 -->
    <mappers>
        <!--第一种-->
         <mapper resource="com/qianfeng/mybatis/mapper/UserMapper.xml"/>
        <!--第二种-->
        <!-- 使用下面的注册方式需要满足以下三点要求:
            1) 映射文件要与Dao接口在同一个包下
            2) 映射文件名要与Dao接口的简单类名相同
            3) 映射文件的<mapper/>标签的namespace属性值为Dao接口的全限定性类名
            
            满足以上三个条件,那么这里的class属性值就可以填写Dao接口的全限定性类名
         -->
        <mapper class="com.qianfeng.mybatis.mapper.OderMapper"/>
        <!--第三种-->
        <!-- 使用下面的注册方式需要满足以下四点要求:
            1) 映射文件要与Dao接口在同一个包下
            2) 映射文件名要与Dao接口的简单类名相同
            3) 映射文件的<mapper/>标签的namespace属性值为Dao接口的全限定性类名
            4) 使用动态Mapper
            
            满足以上四个条件,那么这里的name属性值就可以填写Dao接口所在的包名
         -->
        <package name="com.qianfeng.mybatis.mapper"/>
        
        <!--第四种-->
        <!-- 下面的方式可以使映射文件存放到本地文件系统,但此方式不常用 -->
        <mapper url="file:///e:/mapper.xml"/>
    </mappers>
</configuration>

mapper.xml

<?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">
<!--namespace 命名空间
对sql的statement进行分类的,我们调用这里面sql
语句的时候会使用
在进行接口式编程时这里是对应接口的全限定名称
如<mapper namespace="com.qianfeng.mybatis.mapper.UserMapper">
-->
<mapper namespace="">
  ​
</mapper>

select标签

<!-- id 代表当前sql语句的id,我们需要通过这个id来找到这个sql语句
    parameterType: 代表的是参数的数据类型, mybatis内部帮我们封装了一些类型  比如 int代表的是       java.lang.Integer
    resultType: 返回结果的全限定名称,或者是mybatis内置的类型
    public String com.qianfeng.mybatis.pojo.User.getId()//方法的全限定名称
    #{} 占位符,相当于我们在使用jdbc的时候的? ,里面写什么呢? 如果是一个参数,并且参数的类型是基本数据类型或者是字符串的时候,可以随便写
    但是为了方便了解是做什么或者是为了方便知道参数的含义,建议写对应的数据名字
    -->
​
<!--在进行接口式编程时
    id必须和接口中对应方法的名字一样
    parameterType 必须和方法的参数一致
    resultType必须和方法的返回值一致
    -->
    <select id="findUserById" parameterType="int" resultType="com.qianfeng.mybatis.pojo.User">
      SELECT * FROM user WHERE id=#{id}
    </select>

insert标签

    <!--
        insert是sql里面最特殊的一个语句,只有两种结果,一个是成功,一个是抛异常,不像update
        #{username}代表从user对象中获取一个名字叫username的属性(注意不是变量名),属性就是get/set        方法去掉getting/set后首字母小写
        当参数是一个对象的时候,这里面要通过占位符的方式进行填写参数,参数的名字就是要作为参数值的属性的        属性名
    -->
    <insert id="insertUser" parameterType="com.qianfeng.mybatis.pojo.User">
        INSERT INTO tb_user (username,password,email,gender,flag,role,code) VALUES (#           {username},#{password},#{email},#{gender},#{flag},#{role},#{code})
    </insert>

selectkey标签

    <!--
    selectKey: 获取主键
    resultType: 主键值的类型
    keyProperty: 代表主键的值放入到参数中的哪个属性上面,比如当前期望将主键的值放到我们的user对象的id属性上面
    order: 代表selectKey对应的sql语句的执行顺序,在下面真正的sql语句执行之前还是之后执行,此处我们需要插入数据之后才能知道结果,所以是after
    SELECT LAST_INSERT_ID() 获取最后一次插入的主键,这个方法只能获取当前事物中的最后一次插入主键
    -->
    <insert id="insertUser1" parameterType="com.qianfeng.mybatis.pojo.User">
​
      <selectKey resultType="int" keyProperty="id" order="AFTER">
​
          SELECT LAST_INSERT_ID()
      </selectKey>
​
        INSERT INTO user (iusername,password,email,gender,flag,role,code) VALUES (#{username},#{password},#{email},#{gender},#{flag},#{role},#{code})
    </insert>

动态sql标签

mybatis的动态sql语句是基于OGNL表达式的,可以方便的在sql语句中实现某些逻辑。
mybatis的动态sql标签分为以下几类

  if标签(简单的条件判断)
where标签(主要用来简化sql语句中的wheret条件判断
    能够智能处理 and or,不必担心多余导致语法错误)
choose标签(when,otherwize)相当于java中的switch,与jstl中的choose类似
trim标签(对包含的内容加上prefix,或者suffix等,前缀和后缀)
set标签(主要用于更新时)
foreach标签(主要用于mybatis in 语句查询时)

if标签

<select id="findUserLike" resultType="User">
     SELECT * FROM user WHERE  1 =1 
     <if test="name != null">
     AND name like #{name}
     </if>
</select>
​

where标签

<!--查询数据的时候,会有多个条件
        但是这些条件会出现可能会有,可能没有的情况
    select * from xxx where a=xxx and b =xxx and c =xxx
    不允许出现where 1=1 因为这会导致数据库索引失效
      <where> 会自动去掉第一个符合条件的and
    -->
<select id="findUserByMult" resultType="com.qianfeng.mybatis.pojo.User">
    SELECT  id, username, password, email, gender, flag, role, code from tb_user
  <where>
    <if test="username!=null and username !=''">
        and username=#{username}
    </if>
    <if test="email!=null and email !=''">
        and email=#{email}
    </if>
  </where>
</select>

choose标签

<!--当when标签条件成立时就执行,然后跳出,当所有的when标签条件都不成立的时候,执行otherwiseb标签中的内容
when和otherwise条件只有一个会输出
-->
<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
     select * from user where 1 = 1
     <choose>
         <when test="name != null">
         and name = #{name}
         </when>
         <when test="info != null">
         and info = #{info}
         </when>
         <otherwise>
         and owner = "owner1"
         </otherwise>
     </choose>
 </select>

set标签

<!--set标签主要用于更新操作的时候
    主要是在包含语句前面输出一个set
    如果包含语句是以逗号(,)结束的话,会将其忽略
    如果set包含内容为空的话,会报错
    使用set可以动态更新修改字段
    -->
<update id="updateUser_if_set" parameterType="com.qianfeng.mybatis.pojo.User">
     UPDATE user
     <set>
         <if test="username!= null and username != '' ">
         username = #{username},
         </if>
         <if test="sex!= null and sex!= '' ">
         sex = #{sex},
         </if>
         <if test="birthday != null ">
         birthday = #{birthday},
         </if>
     </set>
     WHERE user_id = #{userid};
</update> 

trim标签

trim标签是更加灵活用于去除多余关键字的标签,它可以用来实现where和set的效果

主要包括四个属性

prefix:在包含内容之前加上某些前缀

suffix:在包含内容之后加上某些后缀

prefixOverrides:把包含内容首部的某些内容覆盖掉,即忽略

suffixOverrides:把包含内容尾部的某些内容覆盖掉,即忽略

trim代替where

<select id="dynamicTrimTest" parameterType="User" resultType="User">
     select * from user
     <trim prefix="where" prefixOverrides="and |or">
         <if test="name != null">
         name = #{name}
         </if>
         <if test="info != null">
         and info = #{info}
         </if>
         <if test="owner != null">
         or owner = #{owner}
         </if>
     </trim>
 </select>
 

trim代替set

<update id="updateUser_if_trim" parameterType="User">
     UPDATE user
     <trim prefix="SET" suffixOverrides=",">
         <if test="username != null and username != '' ">
         username = #{username},
         </if>
         <if test="sex != null and sex != '' ">
         sex = #{sex},
         </if>
         <if test="birthday != null ">
         birthday = #{birthday},
         </if>
     </trim>
     WHERE user_id = #{user_id}
</update> 

foreach标签

foreach标签主要用于构建in条件中

主要包括六个属性
index: 指定一个名字,用于迭代过程中,每次迭代到的位置
collection: 代表要遍历的存放参数的集合
item: 每次遍历后的参数存放的位置
open: 遍历之前添加什么内容
close: 遍历完成之后添加什么
separator: 分隔符 ,每次遍历之后添加分隔符,但是最后一次遍历不添加
collection属性的值必须指定,但是在不同情况下,该属性的值是不一样的

主要有以下三种情况

<!--第一种-->
<!--单参数,且参数类型是一个list的时候 collection属性值为list-->
<select id="dynamicForeachTest" resultType="User">
     select * from user where id in
     <foreach collection="list" index="index" item="item" open="(" separator=","
    close=")">
     #{item}
     </foreach>
 </select>
​
<!--第二种-->
<!--单参数,且参数类型是一个array的时候 collection属性值为array-->
<select id="dynamicForeach2Test" resultType="User">
     select * from user where id in
     <foreach collection="array" index="index" item="item" open="(" separator=","
    close=")">
     #{item}
     </foreach>
</select> 
​
<!--第三种-->
<!--如果传入的参数是多个的话,我们就需要把它封装成map集合
    当然单参数也可以封装成map,实际上如果你在传入参数的时候,
    在breast里面也是会把它封装成一个Map的,
    map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key。
    -->
​
<select id="dynamicForeach3Test" resultType="User">
     select * from user where title name "%"#{name}"%" and id in
     <foreach collection="ids" index="index" item="item" open="("
    separator="," close=")">
     #{item}
     </foreach>
</select>

include标签

    <!--
    声明一个sql语句,此语句可以被复用 使用方式在使用的地方通过include id= sql id
    -->
    <sql id="getall">
        SELECT  id, username, password, email, gender, flag, role, code from user
    </sql>
    <!--
    include
    导入一条已经声明好的sql语句
    -->
    <select id="findUserByMult1" resultType="User">
        <include refid="getall"/>
        <where>
            <if test="username!=null and username !=''">
                and username=#{username}
            </if>
            <if test="email!=null and email !=''">
                and email=#{email}
            </if>
        </where>
    </select>

resultmap标签

    <!--
    resultMap 返回结果的映射,主要用于,返回的列的name与对象本身不一致,或者是多表关联的时候
    属性
    id 当前resultmap的标记
    type 当前resultmap真正的返回结果类型
​
    标签
    id sql中返回的列中主键的列名, 
        column sql语句返回的列名,property代表在最终对象上面的属性名
    result 普通属性
        
    -->
    <resultMap id="orderby" type="Order">
        <id column="id_" property="id"  javaType="string"></id>
        <result column="money_" property="money"/>
        <result column="status_" property="status"/>   
    </resultMap>
​
    <!--
  将返回结果通过resultmap进行解析处理
    -->
    <select id="findOrderById1" parameterType="string" resultMap="orderby">
        select id id_ ,  money money_ , status status_  from tb_order where id =#{id}
    </select>

association标签(一对一关系)

    <resultMap id="addressresultmap" type="Address">
        <id column="aid" property="id"></id>
        <result property="detail" column="detail"></result>
        <result property="name" column="name"></result>
        <!--对一的标签
        property 当前这个一的对象在最终返回结果对象中的属性名
        javaType 指的是关联对象的类型,不设置javatype的话不会给我们自动创建对象
        -->
        <association property="user" javaType="User">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="password" property="password"></result>
        </association>
​
    </resultMap>
​
​
    <select id="findAddressAndUserInfoByAddressId" resultMap="addressresultmap" parameterType="int">
        SELECT  a.id aid,a.detail , a.name,a.phone,a.level,u.id,u.username,u.password,u.email,u.gender,u.flag,u.role,u.code  from tb_address  a ,tb_user u where a.uid=u.id and a.id=#{id}
    </select>

collection标签(一对多关系)

<!--
一对多的关系
collection 在user对象中 oders集合的属性名, 也就多的一方在少的一方中的属性名
ofType 集合的泛型
-->
​
    <resultMap id="userorderresultmap" type="com.qianfeng.mybatis.pojo.User" extends="basemap">
        <!--<id column="uid" property="id"></id>-->
        <!--<result column="username" property="username"/>-->
        <!--<result column="password" property="password"/>-->
​
            <collection property="orders" ofType="com.qianfeng.mybatis.pojo.Order">
                <id column="id" property="id"></id>
                <result  column="money" property="money"/>
                <result column="status" property="status"/>
            </collection>
    </resultMap>
​
​
    <select id="findUserAndOrderByUserId" resultMap="userorderresultmap">
        select  u.id uid , u.username, u.password,o.id,o.money,o.status from tb_user u ,tb_order o where  u.id=o.uid and u.id =#{id}
​
    </select>
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: http://www.Java265.com/JavaFramework/MyBatis/202209/4464.html

最近发表

热门文章

好文推荐

Java265.com

//www.java265.com

站长统计|USA-001

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者