java框架---->mybatis的使用(一)

  这里我们记录一些mybatis的一些常用知识和项目中遇到的问题总结。快乐人生的三个必要元素是,有要做的事、热爱的事及盼望的事。

mybatis的一些知识

一、mybatis插入返回主键值

  • 插入的java代码:其中返回是当前插入的主键,insert方法返回的是影响的行数。
public void insertUserInfo() {
    Map<String, Object> map1 = new HashMap<>();
    map1.put("userName", "huhx");
    map1.put("age", 35);
    int effectRow = this.sqlSession.insert("login.insertUserInfo", map1);
    System.out.println(map1.get("huhxId")); // 5
    System.out.println(effectRow); // 1
}
  •  语句映射的sql语句:
<insert id="insertUserInfo" parameterType="java.util.HashMap" useGeneratedKeys="true" keyProperty="huhxId">
    INSERT INTO
      puser(user_name, age)
    VALUES
      (#{userName}, #{age})
</insert>

 关于mybatis的官方文档: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

 二、mybatis的一个参数传递的异常

  •  java代码
public Map<String, Object> getUserInfoById(Long userId) {
    return this.sqlSession.selectOne("user.queryUserInfoByUserId", userId);
}
  • xml映射的代码
<select id="queryUserInfoByUserId" parameterType="java.lang.Long" resultType="java.util.HashMap">
    SELECT
        userId, username, password, address, birthday, sex
    FROM
        puser
    WHERE
        1 = 1
    <if test="userId != null">
        AND userId = #{userId}
    </if>
    ORDER BY
      userId DESC
</select>
  • 抛出异常
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userId' in 'class java.lang.Long'

对于这类单个入参然后用if判断的,mybatis有自己的内置对象。如果你在if判断里面写的是你的入参的对象名,那么就会抛出上述的异常。

三、mybatis的查询数据包含上送的数据字段

  这里面注意几点:一、parameterType的类型可以为缩写的形式map;二、SELECT中可以有#{ActivityType} AS ActivityType的写法;三、LEFT JOIN前端的FROM里面的数据需要括号。

<select id="getOtherActivity" parameterType="map" resultType="map">
    SELECT 
        a.ActivitySeq,
        a.ActivityName,
        a.ActivityDes,
        a.ActivityBeginDate,
        a.ActivityEndDate,
        a.ActivityStatus,
        b.ActivityChannel,
        c.ToolName,
        c.ToolType,
        c.ToolDesc,
        #{ActivityType} AS ActivityType
    FROM
        (A_ACTIVITY a, A_ACTIVITY_CHANNEL b, T_TOOL c)
    LEFT JOIN
        <choose>
            <when test="ActivityType != null and ActivityType == 2">
                A_CONVERT d
            </when>
            <when test="ActivityType != null and ActivityType == 3">
                A_DISTRIBUTION d
            </when>
            <when test="ActivityType != null and ActivityType == 6">
                A_MISSION d
            </when>
        </choose>
    ON
        d.ActivitySeq = a.ActivitySeq AND
        d.ToolSeq = c.ToolSeq
    WHERE
        a.ActivitySeq = b.ActivitySeq  
        <if test="ActivityNo != null">
            AND a.ActivitySeq = #{ActivityNo}
        </if>
    ORDER BY
        a.ActivitySeq DESC
</select>

四、mybatis的批量插入传递额外的数据

我们的需求是在批量插入的时候,有些数据是一定的,不需要在遍历的列表里面。

public String batchInsertMap() {
    Map<String, Object> parmMap = new HashMap<>();
    parmMap.put("personId", "1");
    List<Map<String, String>> list = new ArrayList<>();
    for (int i = 0; i < 3; i ++) {
        Map<String, String> map = new HashMap<>();
        map.put("content", "comment " + i);
        list.add(map);
    }
    parmMap.put("list", list);
    // 批量插入数据
    int rowCounts = this.sqlSession.insert("user.insertBatchComments", parmMap);
    return rowCounts + "";
}

mybatis的sql语句如下:

<insert id="insertBatchComments" parameterType="map">
    INSERT INTO comment
        (person_id, content)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
    (
        #{personId},
        #{item.content}
    )
  </foreach>
</insert>

友情链接

原文地址:https://www.cnblogs.com/huhx/p/baseusejavamybatis1.html