java中使用MyBatis,簡單例項學習MyBatis框架
一、定義
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 < 1
</select>
</mapper>
那麼sql語句中用到全部需要注意的特殊字元有哪些呢?
這裡全部列出來,將其對應的替換即可。
< ----------------- < ------小於
> ----------------- > -------大於
<= ----------------- ≤ ------小於
>= ----------------- ≥ -------大於
' ----------------- ' ------單引號
" ----------------- " -------引號
“ ----------------- &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” 輸入資料(變數)型別;(根據對應的需要檢視是否寫上這兩個)