你都是会点啥技术(二)--- Mybatis

写在前面的话:大学期间学的是ssh框架,大四实习期间接手的一个项目也是用的是ssh框架。不过当时mybatis已经很流行了,然后正式工作之后就一直用的是mybatis,以前也写过mybatis,jdbc,hibernate的简单比较,在这总结记录一下mybatis环境搭建和个人日常的使用语法,方便以后查询,网上教程很多,我这属于自我总结记录不是教程。主要目的是在工作中可以更熟练的使用它去完成基本开发任务,同时还能节省时间去完成其他任务或者解决其他问题。项目环境:https://github.com/libaolei007/mybatis_demo.git

1.mybatis.cfg.xml(项目的mybatis配置文件)
<?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>


    <!-- 引入外部配置文件 -->
    <properties resource="jdbc.properties"></properties>

    <!-- 全局参数 -->
    <settings>
        <!-- 使全局的映射器启用或禁用缓存。 -->
        <setting name="cacheEnabled" value="true"/>

        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
        <setting name="lazyLoadingEnabled" value="true"/>

        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="true"/>

        <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->
        <setting name="multipleResultSetsEnabled" value="true"/>

        <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
        <setting name="useColumnLabel" value="true"/>

        <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->
        <setting name="useGeneratedKeys" value="false"/>

        <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>

        <!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->
        <setting name="defaultExecutorType" value="SIMPLE"/>

        <!-- 使用驼峰命名法转换字段。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
        <setting name="localCacheScope" value="SESSION"/>

        <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>

    </settings>

    <!-- 类型别名 用法: <resultMap id="userMap" type="org.lbl.mybatis.beans.User">加完别名后简写为<resultMap id="userMap" type="user">-->
    <typeAliases>
        <!-- 单个定义 alias为别名,type为具体实体类 -->
        <typeAlias alias="user" type="org.lbl.mybatis.beans.User" />
        <!-- 批量定义(别名为实体类下的类名,第一个字母大小写都可以 不管有多少实体类,这样直接就全部把别名命名好了,如果想自定义别名,给实体类添加@Alias注解) -->
        <package name="org.lbl.mybatis.beans" />
    </typeAliases>


    <!-- 配置mybatis运行环境 -->
    <environments default="cybatis">
        <environment id="cybatis">
            <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
            <transactionManager type="JDBC"/>

            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>


    <!--mybatis.cfg.xml里注册UserMapper.xml文件-->
    <mappers>
        <!--告知映射文件方式1,一个一个的配置-->
        <mapper resource="org/lbl/mybatis/mapper/UserMapper.xml"/>
        <!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
        <!--<package name="org/lbl/mybatis/mapper"/>-->

    </mappers>


</configuration>

2.resultMap
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id="唯一的标识" type="映射的pojo对象">
  <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
  <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
  <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
    <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
    <result  column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
  </association>
  <!-- 集合中的property须为oftype定义的pojo对象的属性-->
  <collection property="pojo的集合属性" ofType="集合中的pojo对象">
    <id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
    <result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />  
  </collection>
</resultMap>

如果collection标签是使用嵌套查询,格式如下:

<collection column="传递给嵌套查询语句的字段参数" property="pojo对象中集合属性" ofType="集合属性中的pojo对象" select="嵌套的查询语句" > 
 </collection>

注意:使用另一个select查询封装的结果,collection标签中的column为要传递给select查询语句的参数,如果传递多个参数,格式为column= ” {参数名1=表字段1,参数名2=表字段2} ;
参考:https://www.cnblogs.com/kenhome/p/7764398.html

3.select
<select id="getUserByIds" parameterType="java.util.List" resultMap="userMap">
	 select * from user where id in
  <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
    #{item}
  </foreach>
</select>
4.insert
   <!-- 动态添加 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null and username !=''">
                username,
            </if>
            <if test="password != null and password !=''">
                password,
            </if>
            <if test="account != null and account !=''">
                account,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="username != null and username !=''">
                #{username},
            </if>
            <if test="password != null and password !=''">
                #{password},
            </if>
            <if test="account != null and account !=''">
                #{account},
            </if>
        </trim>
    </insert>
	 <!-- 批量添加 -->
    <insert id="insertUsers" useGeneratedKeys="true" keyProperty="id" parameterType="java.util.List">
        insert into user (username,password,account) values
        <foreach collection="list" item="item" index="index" separator=",">
            (
            #{item.username},
            #{item.password},
            #{item.account}
            )
        </foreach>
    </insert>
5.update
<!-- 动态更新 -->
 <update id="updateUser" >
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="username != null and username !=''">
                username = #{username},
            </if>
            <if test="password != null and password !=''">
                password = #{password},
            </if>
            <if test="account != null and account !=''">
                account = #{account},
            </if>
        </trim>
        WHERE id=#{id}
    </update>
<!--动态更新简写-->
    <update id="updateUserSet">
      update user
     <set>
     <if test="username != null and username !=''">username = #{username},</if>
     <if test="password != null and password !=''">password = #{password},</if>
     <if test="account != null and account !=''">account = #{account},</if>
   </set>
        where id=#{id}
    </update>
<!--批量更新-->
<update id="updateUsers" parameterType="java.util.List">
    update user
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="username = case" suffix="end,">
            <foreach collection="list" item="item">
                <if test="item.username != null and item.username != ''">
                    when id = #{item.id} then #{item.username}
                </if>
            </foreach>
        </trim>
        <trim prefix="password=case" suffix="end,">
            <foreach collection="list" item="item">
                <if test="item.password != null and item.password != ''">
                    when id = #{item.id} then #{item.username}
                </if>
            </foreach>
        </trim>
        <trim prefix="account=case" suffix="end,">
            <foreach collection="list" item="item">
                <if test="item.account != null and item.account != ''">
                    when id = #{item.id} then #{item.account}
                </if>
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" index="index" item="item"  separator="or">
        id = #{item.id}
    </foreach>

6.delete
<!--批量删除-->
    <delete id="deleteBatch" parameterType="java.util.List">
        delete from user
        where id in
        <foreach item="id" collection="list" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
7.使用记录

choose, when, otherwise

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>
<![CDATA[ ]]>符号处理特殊字符。<![CDATA[ 2 < #{id} ]]>

连接函数:concat(’%’,#{userName}, ‘%’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值