標籤:傳回值 圖片 select 類對象 一個個 資料類型 es2017 mapper 重用
MyBatis 真正的強大在於映射語句,專註於SQL,功能強大,SQL映射的配置卻是相當簡單
所以我們來看看對應檔的具體結構
一、xml節點結構
mapper為根節點 - namespace命名空間
cache - 配置給定命名空間的緩衝
cache-ref – 從其他命名空間引用緩衝配置
resultMap –用來描述資料庫結果集和對象的對應關係
sql – 可以重用的SQL塊,也可以被其他語句引用
insert – 映射插入語句
update – 映射更新語句
delete – 映射刪除語句
select – 映射查詢語句
二、各節點作用
此處以MyBatis學習存檔(1)——入門中反向產生的UsersMapper.xml和UsersMapper.java為例
<?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" ><mapper namespace="com.mapper.UsersMapper" > <resultMap id="BaseResultMap" type="com.pojo.Users" > <id column="id" property="id" jdbcType="INTEGER" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="password" property="password" jdbcType="VARCHAR" /> </resultMap> <sql id="Base_Column_List" > id, name, password </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Base_Column_List" /> from users where id = #{id,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" > delete from users where id = #{id,jdbcType=INTEGER} </delete> <insert id="insert" parameterType="com.pojo.Users" > insert into users (id, name, password ) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR} ) </insert> <insert id="insertSelective" parameterType="com.pojo.Users" > insert into users <trim prefix="(" suffix=")" suffixOverrides="," > <if test="id != null" > id, </if> <if test="name != null" > name, </if> <if test="password != null" > password, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=INTEGER}, </if> <if test="name != null" > #{name,jdbcType=VARCHAR}, </if> <if test="password != null" > #{password,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.pojo.Users" > update users <set > <if test="name != null" > name = #{name,jdbcType=VARCHAR}, </if> <if test="password != null" > password = #{password,jdbcType=VARCHAR}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="com.pojo.Users" > update users set name = #{name,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} </update></mapper>
UsersMapper.xml
package com.mapper;import com.pojo.Users;public interface UsersMapper { int deleteByPrimaryKey(Integer id); int insert(Users record); int insertSelective(Users record); Users selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Users record); int updateByPrimaryKey(Users record);}
UsersMapper.java
2.1 mapper節點
作為xml的根節點,它具有一個很重要的屬性——namespace(命名空間)
namespace的值應與其所綁定的映射介面向一致,為保證其唯一性,通常為“包名+類名”,如com.mapper.UsersMapper,即綁定了com.mapper包下的名為UsersMapper的介面
而與其綁定的介面UsersMapper中的方法應與對應檔中SQL語句id一一對應(順序無需一致)
2.2 cache、cache-ref節點
不推薦使用MyBatis內建的緩衝,因此此處不細講
2.3 resultMap節點
可在sql映射語句中被引用,通常用於表示資料庫表和實體類之間的映射關係
resultMap節點有2個屬性:
id:標識作用,應具有唯一性
type:類型,即對應的實體類,若在mybatis-config.xml中設定過別名,也可使用設定的別名
id節點:對應資料庫中的主鍵
result節點:非主鍵的其他欄位
column:資料庫表中對應的欄位名
property:實體類中對應的屬性
jdbcType:資料庫中改欄位的類型
2.4 sql節點
很簡單的一個節點,用於sql語句的重用,其id屬性起到標識作用,應具有唯一性
2.5 select節點
select是MyBatis中最常用的元素之一,對應select語句
id:命名空間中唯一的標識符,介面中的方法與對應檔中的SQL語句id一一對應
parameterType:傳入SQL語句的參數類型,分為2種情況:
1.基礎資料類型
int、String、Date等
只能傳入一個,通過#{參數名}即可擷取傳入的值
2.複雜資料類型
Java實體類、Map等
通過#{屬性名稱}或者#{map的keyName}即可擷取傳入值
resultType:SQL語句傳回值類型的完整類名或別名
resultMap:引用配置的resultMap
2.6 insert、delete、update節點
分別對應添加、刪除、更改語句,屬性與select基本相同,唯一不同之處在於無需配置resultType或resultMap,本身預設返回受影響的行數
因此,對於增刪改這類更新操作,介面方法的傳回值建議為int類型,執行sql影響的行數,最好不要寫boolean類型
三、多參數傳入
如2.5中所說,MyBatis僅支援單個參數的傳入,那麼如何進行多參數的傳入呢?
方法有2種:
1.將多個參數封裝成1個Map,傳入Map即可,但該方法不透明,無法直接看出所需的參數是什麼
或直接傳入一個實體類對象
2.使用註解@Param來傳入多個參數
在介面中對傳入參數進行註解@Param("value"),在對應檔中使用${value}即可獲得該參數
建議:通常傳入參數大於3個時最好封裝成一個對象,而不是一個個傳入
MyBatis學習存檔(3)——mapper.xml對應檔