1. 程式人生 > 其它 >java中使用MyBatis,簡單例項學習MyBatis框架

java中使用MyBatis,簡單例項學習MyBatis框架

技術標籤:mybatisjavasql

一、定義
MyBatis 是一款優秀的持久層框架,它支援自定義 SQL、儲存過程以及高階對映。MyBatis 免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。
二、java使用mybatis呼叫資料庫的整體思路
(啟動類呼叫Dao層–Dao層呼叫對應的Mapper)
在mybatis中sql是寫在xml對映檔案中的,所以在Java中呼叫資料庫的資料使用mybatis是這樣寫的(xml檔案都放在mapper資料夾下)

在這裡插入圖片描述

<?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.java.dao.ceshiDao">
<!-- 資料庫資訊查詢表  -->
    <select id="ceshixxcx"
resultType="map" > select * from ceshi </select> </mapper>

在xml中namespace指定對應的呼叫Dao層
在這裡插入圖片描述
(注意,Dao層定義的名字ceshixxcx要和其呼叫的xml檔案中的對應sql模組的id相同)

package com.java.dao;

import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.dcits.model.ceshi;

@Repository
public interface ceshiDao
{ List<Map<String, Object>> ceshixxcx(); }

最後,在Java的啟動類裡面呼叫Dao層定義好的ceshixxcx

//定義
@Autowired
private ceshiDao csDao;
//呼叫 獲取資料,其中定義的ceshiResults的資料型別要和Dao中ceshixxcx的資料型別一致
List<Map<String, Object>> ceshiResults= null;
ceshiResults= csDao.ceshixxcx();
//迴圈獲取每一條資料
for(Map<String, Object> csxx:ceshiResults){
//這裡就可以使用獲取每一條資料的每個你想獲取的對應列值
String a = csxx.get("T1").toString();
...
}

三、MyBatis中xml檔案寫法注意點
如果sql中有一些特殊字元的話,在解析xml檔案的時候就會被轉義,因為 在mybatis中sql是寫在xml對映檔案中。
所以不注意這個點的話,有時候寫sql語句在xml裡面卻提示錯誤 比如(select * ceshi t where t.t1<1 )
正確的寫法是,
**方法一:**將">“這個特殊字元轉義,使用”< “替換” <"

<?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.java.dao.ceshiDao">
<!-- 資料庫資訊查詢表  -->
    <select id="ceshixxcx"  resultType="map" >
    select * from ceshi &lt; 1
        </select>
</mapper>

那麼sql語句中用到全部需要注意的特殊字元有哪些呢?
這裡全部列出來,將其對應的替換即可。

<   -----------------   &lt;     ------小於
>   -----------------   &gt;    -------大於
<=  -----------------   &le;     ------小於
>=  -----------------   &ge;    -------大於
'   -----------------   &apos;   ------單引號
"   -----------------   &quot;  -------引號
“   -----------------   &lquot; -------左雙引號
”   -----------------   &rquot; -------右雙引號
‘   -----------------   &lapos;  ------左單引號
’   -----------------   &rapos;  ------右單引號

**方法二:**使用<![CDATA[ ]]>符號 將 “<”放在 <![CDATA[ ]]> 中 ,(其他特殊字元也一樣)

<?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.java.dao.ceshiDao">
<!-- 資料庫資訊查詢表  -->
    <select id="ceshixxcx"  resultType="map" >
    select * from ceshi <![CDATA[ < ]]> 1
        </select>
</mapper>

四、使用mybatis帶變數操作資料庫
理解了一二點;直接例子說明怎麼使用變數:
在主類給一個變數呼叫的:
1、根據變數更新/插入資料庫,這裡只寫更新(插入就將update改為insert即可)

@Autowired
private ceshiDao csDao;
---------------
String num ='123';
csDao.updateceshixx(num) ;

在Dao層定義(對應名字):

package com.java.dao;

import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.dcits.model.ceshi;

@Repository
public interface ceshiDao{
Int updateceshixx(String t1);
}

在mapper中的xml(對應id):

<?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.java.dao.ceshiDao">
<!-- 資料庫資訊查詢表  -->
       <update id="updateceshixx" parameterType="java.lang.VARCHAR" >
    update ceshi
    set t1 = #{t1,jdbcType=VARCHAR}
  </update>
</mapper>

(注意 #{t1,jdbcType=VARCHAR} 中的t1必須是資料表中的列名;jdbcType的型別必須與中的parameterType一致且要注意和資料庫型別一致;Dao層和主類呼叫的賦給變數的型別要與前面兩個的變數型別一致)

如果是要其他型別比如整形,就將型別全部改成jdbcType=INTEGER、

2、根據變數查詢對應資料
呼叫是一樣的,我就只複製不同的:(其中,如果查詢出來的資料只有一條,可以直接這樣定義:Map<String, Object> ceshixx_id(INTEGER t2);
在mapper中的xml(對應id):

       <select id="ceshixx_id" resultType="map"  parameterType="java.lang.INTEGER" >
    select * from ceshi
    where  t2 = #{t2,jdbcType=INTEGER}
  </select >

Dao層定義:

List<Map<String, Object>> ceshixx_id(INTEGER t2);

主類呼叫:

Integer n =1;
List<Map<String, Object>> ceshixx_idResults= null;
ceshixx_idResults=csDao.ceshixx_id(n) ;

其中,如果要將獲取到的某個object型別的值轉換成整形,可以這樣做:

Integer n2 =0;
n2 = Integer.parseInt(ceshixx_idResults.get("T3").toString());

3.整合;
Dao層和xml同一個表的可以就放在同一個檔案中:
如:
Dao層,整合:

package com.java.dao;

import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.dcits.model.ceshi;

@Repository
public interface ceshiDao{
List<Map<String, Object>> ceshixxcx();
Int updateceshixx(String t1);
List<Map<String, Object>> ceshixx_id(INTEGER t2);
}

對應XML:

<?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.java.dao.ceshiDao">
<!-- 資料庫資訊查詢表  -->
    <select id="ceshixxcx"  resultType="map" >
    select * from ceshi
        </select>
        <update id="updateceshixx" parameterType="java.lang.VARCHAR" >
    update ceshi
    set t1 = #{t1,jdbcType=VARCHAR}
  </update>
   <select id="ceshixx_id" resultType="map"  parameterType="java.lang.INTEGER" >
    select * from ceshi
    where  t2 = #{t2,jdbcType=INTEGER}
  </select >
</mapper>

注意: resultType=“map” 輸出資料型別;parameterType=“java.lang.INTEGER” 輸入資料(變數)型別;(根據對應的需要檢視是否寫上這兩個)