MyBatis單表查詢

本例將描述一張表的CRUD,其中表結構爲:java

CREATE TABLE `message`.`user` ( `id` INT NOT NULL AUTO_INCREMENT , `username` VARCHAR(20) NOT NULL , `password` VARCHAR(20) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB;

javabeansql

package cn.elinzhou.bean;

/** * Created by 烽 on 2015/6/4. */
public class User {
    private int id;
    private String username;
    private String password;

    public User(){}

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  • 首先,在已經搭建好MyBatis環境的基礎下,新建一個cn.elinzhou.config.sql包。
  • 建立一個user.xml文件,在其中加入以下信息
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2009-2012 the original author or authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="User">

</mapper>

其中,爲該配置文件的命名空間,而全部對User表的全部操做都在這裏完成,須要保證在整個項目下命名空間惟一數據庫

  • 在命名空間中寫一個查詢標籤,並寫入最簡單的無條件查詢
<select id="queryAll" resultMap="UserResult">
    SELECT id,username,password FROM user WHERE 1=1
</select>

select標籤中有三個參數,分別是id、resultMap,表示操做標識,返回值類型。
其中操做標識須要在同一命名空間下惟一,能夠任意取
返回值類型就是要返回的模型,也能夠說是javabean,固然,這個是本身定義的,因此在該命名空間下加入以下代碼express

<resultMap id="UserResult" type="cn.elinzhou.bean.User">
    <id column="id" jdbcType="INTEGER" property="id"/>
    <result column="username" jdbcType="String" property="username"/>
    <result column="password" jdbcType="String" property="password"/>
</resultMap>

首先,resultMap標籤有兩個屬性,一個是標識,一樣是同命名空間下惟一,另外一個是類型,是該模型的javabean,須要寫全路徑。
resultMap有兩個子標籤,分別爲id和result,兩個惟一的區別是id用來描述主鍵,result用來描述非主鍵,其中的參數徹底相同,因此以result爲例:
result三個標籤,column表示從數據庫中查詢返回的列名;jdbcType表示該字段的類型,若是不是java.lang下的類須要寫全路徑;property表示對應javabean中的變量名apache

  • 數據表配置文件寫完,就須要把它加入到核心配置文件也就是Configuration.xml中;在configuration標籤中添加
<mappers>
  <mapper resource="cn/elinzhou/config/sql/User.xml"/>
</mappers>

之後的每一張表配置文件都要添加到mappers標籤下。數組

  • 而後能夠直接調用以前獲取到的sqlsession,獲取數據。
sqlSession.selectList("User.queryAll");

這樣,將得到一個對應的javabean數組。markdown

  • 在查詢過程當中每每是須要傳入查詢參數的,這裏舉三個例子,一個是經過基本數據類型查詢,一個經過自定義類查詢,一個經過list查詢
  • 首先經過基本數據類型查詢,這裏對 User中的id查詢。在User.xml中加入以下代碼
<select id="queryByID" parameterType="int" resultMap="UserResult">
    SELECT id,username,password FROM user WHERE id = #{_parameter}
</select>

其中與以前不一樣的第一點是參數多了一個parameterType,表示傳入的參數類型,基本數據類型直接寫類型名,自定義類或非java.lang下的類寫全路徑。
這裏傳入的是int型的id,因此sql須要修改,最後的變量位置寫#{_parameter},#{}爲MyBatis規定的,其中的值同ognl表達式。
具體寫法整理以下:(來自慕課網)
這裏寫圖片描述這裏寫圖片描述session

業務代碼爲mybatis

sqlSession.selectList("User.queryByID"5);
  • 有時候查詢條件不惟一,可是MyBatis只能傳入一個參數,因此須要把查詢數據封裝起來。這裏舉一個不合實際的例子,可是爲了演示須要,經過username和password查詢id
<select id="queryByBean" parameterType="cn.elinzhou.bean.User" resultMap="UserResult">
    SELECT id,username,password
    FROM user
    WHERE 1=1
    <if test="username != null and !&quot;&quot;.equals(username.trim())">
        AND username = #{username}
    </if>
    <if test="password != null and !&quot;&quot;.equals(password.trim())">
        AND password LIKE '%' #{password} '%'
    </if>
</select>

此時傳入的是一個自定義類,因此parameterType要寫該類的全路徑,靜態sql語句部分不解釋了,主要講動態拼接部分。
MyBatis的配置文件的邏輯控制主要經過OGNL表達式,因爲這裏查詢條件存在不肯定性,因此須要進行判斷,經過if標籤,根據test屬性中獲得的布爾值來進行控制。而test中的代碼徹底等同於java代碼,只是一些特殊的符號須要轉義,如上述演示代碼中的&quot ; &quot ; 爲轉義後的「」
業務代碼爲app

sqlSession.selectList("User.queryByBean"new User(0,"Tom","1234"));
  • 經過list查詢,假設如今須要查詢指定id的用戶
<select id="queryByIDs" parameterType="java.util.ArrayList" resultMap="UserResult">
    SELECT id,username,password 
    FROM user 
    WHERE id IN (
        <foreach collection="list" item="item" separator=",">
            #{item}
        </foreach>
    )
</select>

跟以前的差異主要是用了foreach標籤,其做用爲遍歷集合,其中collection爲要遍歷的對象,item爲每個遍歷到的元素的變量名,separator爲元素以前的分割字符,sql中分割是用’,‘分割。
業務代碼爲

sqlSession.selectList("User.queryByIDs",Arrays.asList(1,2,3));
相關文章
相關標籤/搜索