mybatis的mapper檔案基礎標籤的使用
阿新 • • 發佈:2021-11-03
一、DQL
1.select
<select id="selectStudents" resultType="com.bjpowernode.domain.student"> <!--要執行的 sql 語句--> select id,name,email,age from student order by id </select>
select 語句屬性配置細節:
屬性 | 描述 | 取值 | 預設 |
---|---|---|---|
id | 在這個模式下唯一的識別符號,可被其它語句引用 | ||
parameterType | 傳給此語句的引數的完整類名或別名 | ||
resultType | 語句返回值型別的整類名或別名。注意,如果是集合,那麼這裡填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能並用) | ||
resultMap | 引用的外部resultMap 名。結果集對映是MyBatis 中最強大的特性。許多複雜的對映都可以輕鬆解決。(resultType 與resultMap 不能並用) | ||
flushCache | 如果設為true,則會在每次語句呼叫的時候就會清空快取。select 語句預設設為false | true/false | false |
useCache | 如果設為true,則語句的結果集將被快取。select 語句預設設為false | true/false | false |
timeout | 設定驅動器在丟擲異常前等待迴應的最長時間,預設為不設值,由驅動器自己決定 | 正整數 | 未設定 |
fetchSize | 設定一個值後,驅動器會在結果集數目達到此數值後,激發返回,預設為不設值,由驅動器自己決定 | 正整數 | 驅動器決定 |
statementType | statement,preparedstatement,callablestatement。預準備語句、可呼叫語句 | STATEMENT、PREPARED、CALLABLE | PREPARED |
resultSetType | forward_only、scroll_sensitive、scroll_insensitive 只轉發,滾動敏感,不區分大小寫的滾動 | FORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE | 驅動器決定 |
<!--對於${}和#{} ${}是字串替換,#{}是預編譯處理,一般使用#{}防止sql注入 使用#{}之後, mybatis執行sql是使用的jdbc中的PreparedStatement物件 -->
mybatis會自動執行下列程式碼
<!-- 1. mybatis建立Connection , PreparedStatement物件 String sql="select id,name, email,age from student where id=?";(每一個#{}都被認定為一個?,即佔位符) PreparedStatement pst = conn.preparedStatement(sql); pst.setInt(1,1001); 2. 執行sql封裝為resultType="com.bjpowernode.domain.Student"這個物件 ResultSet rs = ps.executeQuery(); Student student = null; while(rs.next()){ //從資料庫取表的一行資料, 存到一個java物件屬性中 student = new Student(); student.setId(rs.getInt("id)); student.setName(rs.getString("name")); student.setEmail(rs.getString("email")); student.setAge(rs.getInt("age")); } return student; //給了dao方法呼叫的返回值 -->
注意:
select中的id要與介面中的方法名一致(DML也一樣)
二、DML
1.insert
<!-- 插入學生 --> <insert id="insertStudent" parameterType="StudentEntity"> INSERT INTO STUDENT_TBL (STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, CLASS_ID) VALUES (#{studentID}, #{studentName}, #{studentSex}, #{studentBirthday}, #{classEntity.classID}) </insert>
insert可以使用資料庫支援的自動生成主鍵策略,設定useGeneratedKeys=”true”,然後把keyProperty 設成對應的列,就搞定了。比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.
<insert id="insertStudent" parameterType="StudentEntity" useGeneratedKeys="true" keyProperty="studentID">
推薦使用這種用法。
另外,還可以使用selectKey元素。下面例子,使用MySQL資料庫nextval(‘student’)為自定義函式,用來生成一個key。
<!-- 插入學生 自動主鍵--> <insert id="insertStudentAutoKey" parameterType="StudentEntity"> <selectKey keyProperty="studentID" resultType="String" order="BEFORE"> select nextval('student') </selectKey> INSERT INTO STUDENT_TBL (STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, CLASS_ID) VALUES (#{studentID}, #{studentName}, #{studentSex}, #{studentBirthday}, #{classEntity.classID}) </insert>
insert語句屬性配置細節:
屬性 | 描述 | 取值 | 預設 |
---|---|---|---|
id | 在這個模式下唯一的識別符號,可被其它語句引用 | ||
parameterType | 傳給此語句的引數的完整類名或別名 | ||
flushCache | 如果設為true,則會在每次語句呼叫的時候就會清空快取。select 語句預設設為false | true/false | false |
useCache | 如果設為true,則語句的結果集將被快取。select 語句預設設為false | true/false | false |
timeout | 設定驅動器在丟擲異常前等待迴應的最長時間,預設為不設值,由驅動器自己決定 | 正整數 | 未設定 |
fetchSize | 設定一個值後,驅動器會在結果集數目達到此數值後,激發返回,預設為不設值,由驅動器自己決定 | 正整數 | 驅動器決定 |
statementType | statement、preparedstatement、callablestatement。預準備語句、可呼叫語句 | STATEMENT、PREPARED、CALLABLE | PREPARED |
useGeneratedKeys | 告訴MyBatis 使用JDBC 的getGeneratedKeys 方法來獲取資料庫自己生成的主鍵(MySQL、SQLSERVER 等關係型資料庫會有自動生成的欄位)。預設:false | true/false | false |
keyProperty | 標識一個將要被MyBatis設定進getGeneratedKeys的key 所返回的值,或者為insert 語句使用一個selectKey子元素。 |
selectKey語句屬性配置細節:
屬性 | 描述 | 取值 |
---|---|---|
keyProperty | selectKey 語句生成結果需要設定的屬性。 | |
resultType | 生成結果型別,MyBatis 允許使用基本的資料型別,包括String 、int型別。 | |
order | 可以設成BEFORE 或者AFTER,如果設為BEFORE,那它會先選擇主鍵,然後設定keyProperty,再執行insert語句;如果設為AFTER,它就先執行insert 語句再執行selectKey 語句,通常是insert 語句中內部呼叫資料庫(像Oracle)內嵌的序列機制。 | BEFORE/AFTER |
statementType | 像上面的那樣, MyBatis 支援STATEMENT,PREPARED和CALLABLE 的語句形式, 對應Statement ,PreparedStatement 和CallableStatement 響應 | STATEMENT、PREPARED、CALLABLE |
2.update
update語句屬性配置細節:
屬性 | 描述 | 取值 | 預設 |
---|---|---|---|
id | 在這個模式下唯一的識別符號,可被其它語句引用 | ||
parameterType | 傳給此語句的引數的完整類名或別名 | ||
flushCache | 如果設為true,則會在每次語句呼叫的時候就會清空快取。select 語句預設設為false | true/false | false |
useCache | 如果設為true,則語句的結果集將被快取。select 語句預設設為false | true/false | false |
timeout | 設定驅動器在丟擲異常前等待迴應的最長時間,預設為不設值,由驅動器自己決定 | 正整數 | 未設定 |
fetchSize | 設定一個值後,驅動器會在結果集數目達到此數值後,激發返回,預設為不設值,由驅動器自己決定 | 正整數 | 驅動器決定 |
statementType | statement、preparedstatement、callablestatement。預準備語句、可呼叫語句 | STATEMENT、PREPARED、CALLABLE | PREPARED |
3.delete
<delete id="deleteStudent" parameterType="StudentEntity"> DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #{studentID} </delete>
三、parameterType
<!-- parameterType : dao介面中方法引數的資料型別。 parameterType它的值是java的資料型別全限定名稱或者是mybatis定義的別名 例如:parameterType="java.lang.Integer" parameterType="int" 注意:parameterType不是強制的,mybatis通過反射機制能夠發現介面引數的數型別。 所以可以沒有。 一般我們也不寫。 -->
四、傳參
1.一個簡單型別的引數
mybatis把java的基本資料型別和String都叫簡單型別。
Student selectStudentById(@Param("studentId") Integer id);
<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.bjpowernode.domain.Student"> select id,name, email,age from student where id=${studentId}<!--此處名稱要與介面中方法中定義的名稱相同--> </select>
2.多個引數
(1)第一種
多個引數: 命名引數,在形參定義的前面加入 @Param("自定義引數名稱")
List<Student> selectMultiParam(@Param("myname") String name,
@Param("myage") Integer age);
<!--多個引數,使用@Param命名(掌握)--> <select id="selectMultiParam" resultType="com.bjpowernode.domain.Student"> select id,name, email,age from student where name=#{myname} or age=#{myage} </select>
(2)第二種
多個引數,使用java物件作為介面中方法的引數
List<Student> selectMultiStudent(Student student);
<!--多個引數, 使用java物件的屬性值,作為引數實際值 使用物件語法: #{屬性名,javaType=型別名稱,jdbcType=資料型別} 很少用。 javaType:指java中的屬性資料型別。 jdbcType:在資料庫中的資料型別。 例如: #{paramName,javaType=java.lang.String,jdbcType=VARCHAR} 我們使用的簡化方式: #{屬性名} ,javaType, jdbcType的值mybatis反射能獲取。不用提供 -->
<select id="selectMultiStudent" resultType="com.bjpowernode.domain.Student"> select id,name, email,age from student where name=#{name} or age=#{age}<!--放入介面中引數物件所對應的屬性名--> </select>
(3)第三種
多個引數-簡單型別的,按位置傳值
mybatis.3.4之前,使用 #{0} ,#{1}
mybatis.3.4之後 ,使用 #{arg0} ,#{arg1}
List<Student> selectMultiPosition( String name,Integer age);
<!--多個引數使用位置(不推薦使用)--> <select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student"> select id,name, email,age from student where name = #{arg0} or age=#{arg1} </select>
(4)第四種
多個引數,使用Map存放多個值
List<Student> selectMultiByMap(Map<String,Object> map);
<!--多個引數,使用Map , 使用語法 #{map的key}(不推薦使用)--> <select id="selectMultiByMap" resultType="com.bjpowernode.domain.Student"> select id,name, email,age from student where name = #{myname} or age=#{age1} </select>
五、動態SQL
1.單獨if標籤
<!-- if <if:test="使用引數java物件的屬性值作為判斷條件,語法 屬性=XXX值"> -->
<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student"> select id,name, age, email from student where <if test="name !=null and name !='' "> and name = #{name} </if> <if test="age > 0"> or age > #{age} </if> </select>
注意:當地一個if條件不成立時 sql語句會變成為
select id,name, age, email from student whereor age > #{age}
會出現語法錯誤,所以將其改進為
<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student"> select id,name, age, email from student where id>0 <if test="name !=null and name !='' "> and name = #{name} </if> <if test="age > 0"> or age > #{age} </if> </select>
2.使用where標籤
<!-- where: <where> <if> <if>...</where> 用來包含 多個<if>的, 當多個if有一個成立的, <where>會自動增加一個where關鍵字, 並去掉 if中多餘的 and ,or等 -->
<select id="selectStudentWhere" resultType="com.bjpowernode.domain.Student"> select id,name, age, email from student <where> <if test="name !=null and name !='' "> name = #{name} </if> <if test="age > 0"> or age > #{age} </if> </where> </select>
3.foreach標籤
<!--foreach使用1 , List<Integer>,集合中放資料型別 collection:表示介面中的方法引數的型別, 如果是陣列使用array , 如果是list集合使用list item:自定義的,表示陣列和集合成員的變數,或者是屬性名 open:迴圈開始時的字元 close:迴圈結束時的字元 separator:集合成員之間的分隔符 -->
<select id="selectForeachOne" resultType="com.bjpowernode.domain.Student"> select * from student where id in <foreach collection="list" item="myid" open="(" close=")" separator=","> #{myid} </foreach> </select>
<!--foreach使用2 , List<物件>,集合中放入物件--> <!--<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student"> select * from student where id in <foreach collection="list" item="stu" open="(" close=")" separator=","> #{stu.id} </foreach> </select>--> <!--foreach使用2 , List<物件>,集合中放入物件 比上方的語法更靈活,自己寫語法格式 -->
<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student"> <include refid="studentSql" /> where id in ( <foreach collection="list" item="stu" > #{stu.id}, </foreach> -1 )<!--此處減一是因為要去掉一個內容為逗號的欄位--> </select>
參考:https://www.cnblogs.com/yufeng218/p/6622644.html