mybatis 标签使用及例子

此文章转载来源:https://blog.csdn.net/weixin_40950778/article/details/78655288

一、定义SQL语句

(1)select 标签的使用
   属性介绍:
     id :唯一的标识符.
     parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User或user
     resultType :语句返回值类型或别名。注意,如果是集合,那么这里填写的
     是集合的泛型,而不是集合本身(resultType 与resultMap 不能并用)
   例子:
     sql:
      <select id="userList" parameterType="user" resultType="User">
        select * from user where name =#{name}
      </select>
(2)insert 标签的使用
    属性介绍:
      id :唯一的标识符
      parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User

例子:sql

<insert id="addUser" parameterType="user">
   insert into user values (#{id},#{name})
</insert>

(3)delete 标签的使用
    例:sql

    <delete id="deleteUser" parameterType="int"> 
      delete from user 
      where id = #{id} 
    </delete>

(4)update 更改数据

例子:sql

<update id="addUser" parameterType="user">

update user set name=#{name}

</update>

二、配置对象属性与查询结果集

(1)resultMap 标签的使用

基本作用:建立SQL查询结果字段与实体属性的映射关系信息

 查询的结果集转换为java对象,方便进一步操作

 将结果集中的列与java对象中的属性对应起来并将值填充进去

!注意:与java对象对应的列不是数据库中表的列名,而是查询后结果集的列名

例:
<resultMap id="getStudentRM" type="EStudnet">
  <id property="id" column="ID"/>
  <result property="studentName" column="Name"/>
  <result property="studentAge" column="Age"/>
</resultMap>
<select id="getStudent" resultMap="getStudentRM">
  SELECT ID, Name, Age
    FROM TStudent
</select>
标签说明:
主标签
id:该resultMap的标志
type:返回值的类名,此例中返回EStudnet类
子标签:

id:用于设置主键字段与领域模型属性的映射关系,此处主键为ID,对应id。
result:用于设置普通字段与领域模型属性的映射关系

三、动态拼接SQL

(1)if 标签的使用

if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段,还可以在INSERT语句中用来判断是否插入某个字段的值

例:

<select id="getStuListName" parameterType="Student" resultMap="StudentResultMap">

select * from student s where s.name like concat('%',#{studentName}),'%')

</select>

但是此时如果studentName是null或空字符串,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断。

修改为:

<select id="getStuListName" parameterType="Student" resultMap="StudentResultMap">

select * from student s  

<if test="name!=null and name!='' "

where s.name like concat('%',#{studentName}),'%')  </if>

</select>

(2)foreach 标签的使用
foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。如下:

  <delete id=''deleteStuById"  parametertype='''int'>

delete from student where id in

<foreach collection="array" item ="id" index="index" open="(" close=")" seporator=",">

#{id}

</foreach>

</delete>

  我们假如说参数为----  int[] ids = {1,2,3,4,5}  ----那么打印之后的SQL如下:

  delete form user where id in (1,2,3,4,5)

  释义:

    collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为数组,所以值为array

    item : 表示在迭代过程中每一个元素的别名

    index :表示在迭代过程中每次迭代到的位置(下标)

    open :前缀

    close :后缀

    separator :分隔符,表示迭代时每个元素之间以什么分隔

我们通常可以将之用到批量删除、添加等操作中。

(3)choose 标签的使用


有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
         if是与(and)的关系,而choose是或(or)的关系。


         例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">     
    SELECT * from STUDENT_TBL ST      
    <where>     
        <choose>     
            <when test="studentName!=null and studentName!='' ">     
                    ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      
            </when>     
            <when test="studentSex!= null and studentSex!= '' ">     
                    AND ST.STUDENT_SEX = #{studentSex}      
            </when>     
            <when test="studentBirthday!=null">     
                AND ST.STUDENT_BIRTHDAY = #{studentBirthday}      
            </when>     
            <when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">     
                AND ST.CLASS_ID = #{classEntity.classID}      
            </when>     
            <otherwise>     
                      
            </otherwise>     
        </choose>     
    </where>     
</select>     

(4)set标签

where标签类似的,在update语句里也会碰到多个字段相关的问题。 在这种情况下,就可以使用set标签:

<update id="updateProduct" parameterType="Product">
    update product
<set>
    <if test="name!=null">name=#{name},</if>
    <if test="price1=null">price=#{price}</if>
</set>
where id=#{id}
</update>

(5)choose标签

<select id="listAllProduct" resultType="Product">
        select * from product
    <where>
        <choose>
            <when test="name!=null">
            and name like concat('%',name=#{name},'%')
            </when>
            <when test="price!=null">
                and price>#{price}
            </when>
<!--如果上面条件都没有,执行下面条件-->
<otherwise>
    and id>3
</otherwise>

        </choose>
    </where>
    </select>

(6)foreach标签

4、配置关联关系

(1) association 

一对一

association通常用来映射一对一的关系,例如,有个类user,对应的实体类如下:(getter,setter方法省略)

     private String id;//主键
    private String userName;//用户姓名
 

有个类Article,对应的实体类如下:

     private String id;//主键
    private String articleTitle;//文章标题
    private String articleContent;//文章内容
  
如果我想查询一个用户的时候,也查到他写的一篇文章,可以怎样写呢?在类user加入一个属性article

    private String id;//主键
   private String userName;//用户姓名
   private Article article;//新增的文章属性
 
2、mapper.xml 我在user类的mapper.xml这样配置
<resultMap id="userResultMap" type="test.mybatis.entity.User">
  <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
  <result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//这里把user的id传过去
   <association property="article" column="id"                       
            select="test.mybatis.dao.articleMapper.selectArticleByUserId" />//test.mybatis.dao.articleMapper为命名空间
 </resultMap>
同时,我的article对应的xml这样写:

<resultMap id="articleResultMap" type="test.mybatis.entity.Article">
   <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
   <result column="articleTitle" property="articleTitle" jdbcType="VARCHAR" javaType="java.lang.String"/>
 <result column="articleContent" property="articleContent" jdbcType="VARCHAR" javaType="java.lang.String"/>
  </resultMap>

同时,在article对应的xml有这样的select语句:

 <select id="selectArticleByUserId"
parameterType="java.lang.String"
resultMap="ArticleResultMap" >
select * from
tb_article where userId=#{userId} </select>
(2)collection

一对多

实体类增加对应属性

  private String id;//主键
   private String userName;//用户姓名
   private List<Article> articleList;

userMapper.xml这样配置

 
<resultMap id="userResultMap" type="test.mybatis.entity.User">
  <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
  <result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//这里把user的id传过去
   <collection property="articleList" column="id"                       
            select="test.mybatis.dao.articleMapper.selectArticleListByUserId" />
 </resultMap>
以下省略,类同,Mybatis会把结果封装成List类型。
常用SQL标签:

<select> 查询标签
<insert>新增标签
<update>修改标签
<delete>删除标签
<sql id=""></sql>标签(主要是用来写一些通用的sql语句的,在其他标签中可以使用<include refid=""></include>来引入标签)
<parameterMap type="" id=""></parameterMap>参数集合
<resultMap type="" id=""></resultMap>结果集
<cache></cache>
<cache-ref namespace=""/> 这两个标签都是缓存标签
 

猜你喜欢

转载自blog.csdn.net/qq_33718794/article/details/87969452