本例將描述一張表的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 + '\'' + '}'; } }
<?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
<mappers> <mapper resource="cn/elinzhou/config/sql/User.xml"/> </mappers>
之後的每一張表配置文件都要添加到mappers標籤下。數組
sqlSession.selectList("User.queryAll");
這樣,將得到一個對應的javabean數組。markdown
<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);
<select id="queryByBean" parameterType="cn.elinzhou.bean.User" resultMap="UserResult"> SELECT id,username,password FROM user WHERE 1=1 <if test="username != null and !"".equals(username.trim())"> AND username = #{username} </if> <if test="password != null and !"".equals(password.trim())"> AND password LIKE '%' #{password} '%' </if> </select>
此時傳入的是一個自定義類,因此parameterType要寫該類的全路徑,靜態sql語句部分不解釋了,主要講動態拼接部分。
MyBatis的配置文件的邏輯控制主要經過OGNL表達式,因爲這裏查詢條件存在不肯定性,因此須要進行判斷,經過if標籤,根據test屬性中獲得的布爾值來進行控制。而test中的代碼徹底等同於java代碼,只是一些特殊的符號須要轉義,如上述演示代碼中的" ; " ; 爲轉義後的「」
業務代碼爲app
sqlSession.selectList("User.queryByBean",new User(0,"Tom","1234"));
<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));