1. 程式人生 > >mybatis基本用法

mybatis基本用法

mybatis 架構

mybatis開發dao的方法:

         1、原始dao開發方法,需要程式設計師編寫dao介面和實現類,此方法在當前企業中還有使用,因為ibatis使用的就是原始dao開發方法。

         2、mapper代理方法,程式設計師只需要寫mapper介面(相當於dao介面),mybatis自動根據mapper介面和mapper介面對應的statement自動生成代理物件(介面實現類物件)。

         開發需要遵循規則:

          1)mapper.xml中namespace是mapper介面的全限定名

          2)mapper.xml中statement的id為mapper介面方法名

          3)mapper.xml中statement的輸入對映型別(parameterType)和mapper介面方法輸入引數型別一致

          4) mapper.xml中statement的輸出對映型別(resultType)和mapper介面方法返回結果型別一致

 傳入多個引數的情況

方案1

public List<XXXBean> getXXXBeanList(String xxId, String xxCode);  

<select id="getXXXBeanList" resultType="XXBean">

  select t.* from tableName where id = #{0} and name = #{1}  

</select>  

由於是多引數那麼就不能使用parameterType, 改用#{index}是第幾個就用第幾個的索引,索引從0開始

方案2(推薦)基於註解

public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);  

<select id="getXXXBeanList" resultType="XXBean">

  select t.* from tableName where id = #{id} and name = #{code}  

</select>  

由於是多引數那麼就不能使用parameterType, 這裡用@Param來指定哪一個

三、Map封裝多引數:  

public List<XXXBean> getXXXBeanList(HashMap map);  

<select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">

  select 欄位... from XXX where id=#{xxId} code = #{xxCode}  

</select>  

其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那個就在#{}使用那個,map如何封裝就不用了我說了吧。 

resultType和resultMap都可以完成輸出對映:

         resultType對映要求sql查詢的列名和輸出對映pojo型別的屬性名一致

         resultMap對映時對sql查詢的列名和輸出對映pojo型別的屬性名作一個對應關係。

動態sql:

         #{}和${}完成輸入引數的屬性值獲取,通過OGNL獲取parameterType指定pojo的屬性名。

    #{}:佔位符號,好處防止sql注入

         ${}:sql拼接符號

步驟:

  1、編寫SqlMapConfig.xml

  2、編寫mapper.xml

           定義了statement

  3、程式設計通過配置檔案建立SqlSessionFactory

  4、通過SqlSessionFactory獲取SqlSession

  5、通過SqlSession操作資料庫

           如果執行新增、更新、刪除需要呼叫SqlSession.commit()

  6、SqlSesion使用完成要關閉

首先建立dao層介面和相關方法

package com.dao;

import java.awt.List;

import org.apache.ibatis.annotations.Param;

import com.pojo.User;

public interface IUserDao {
    User getUserById(@Param(value = "id") int id);   //

    User getUserByName(String username);

    void deleteByid(int id);

    void insert(User u);
    java.util.List<User> getUsers();
}

其次 在IUserDao.xml 中寫相關的方法的實現

<!-- namespace 表示名稱空間 必須和 該mapper對應的介面的全路徑 -->
<mapper namespace="com.dao.IUserDao">
<?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">
<!-- namespace 表示名稱空間 必須和 該mapper對應的介面的全路徑 -->
<mapper namespace="com.dao.IUserDao">
	<!-- id表示 標號 必須和介面的方法一致 -->
	<!-- #裡面的變數名 必須和方法裡面引數一致 -->
	<!-- resultType 返回型別 必須資料庫欄位和屬性名相同才可以賦值 -->
	<resultMap type="com.pojo.User" id="uid">
		<id property="userId" column="user_id" />
		<!-- 名字不一樣必須配置 名字一樣 可以不配的  -->
	</resultMap>
	<select id="getUserById" resultMap="uid">

		select * from user where
		user_id =#{id} ;
	</select>
	<!-- # id和方法id一樣就可以了 但是 $ 最後和@param一起使用 指定名字 -->
	<select id="getUserByName" resultType="com.pojo.User">
		select * from user where
		username =#{username} ;
	</select>
	<delete id="deleteByid">
		delete from user where
		user_id =#{id}

	</delete>
	<!-- 如果穿入物件的時候 我們寫法 直接寫#{該class屬性的屬性} -->
	<insert id="insert" parameterType="com.pojo.User" keyProperty="userId"
		useGeneratedKeys="true">
		insert into user values(null,#{username},1);

	</insert>
	
	
	<!-- 返回list 跟返回單個是一樣的   resultMap-->
	<select id="getUsers" resultMap="uid">

		select * from user ;
	</select>
</mapper>

按照上面的架構具體操作如下:

1   SqlMapConfig.xml的配置  包含兩個部分   1mybatis全域性配置 ,執行環境   2 mapper.xml(<mapper resource="com/dao/UserMapper.xml" />)

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="logImpl" value="STDOUT_LOGGING" />
		<!-- 全域性配置引數 -->
		<!-- 延遲載入總開關 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 設定按需載入 -->
		<setting name="aggressiveLazyLoading" value="true" />
		<!-- 開啟二級快取 -->
		<setting name="cacheEnabled" value="true" />
	</settings>
	<!-- 和spring整合後 environments配置將廢除 -->
	<environments default="development">
		<environment id="development">

			<transactionManager type="JDBC" />

			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/test" />
				<property name="username" value="root" />
				<property name="password" value="mysql" />
			</dataSource>
		</environment>
	</environments>

	<!--載入mapper.xml -->
	<mappers>
		<mapper resource="com/dao/UserMapper.xml" />
	</mappers>

</configuration>

  2  建立測試類

    注意  :   在執行增加,修改,刪除等操作的時候應該要手動提交事務,

        Resources.getResourceAsReader載入檔案時  預設在src目錄下

import java.io.Reader;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.dao.IUserDao;
import com.pojo.User;

public class Test1Hello {
	public static void main(String[] args) throws Exception {
		// 1載入核心配置檔案

		Reader inputStream = org.apache.ibatis.io.Resources.getResourceAsReader("SqlMapConfig.xml");
		// 2獲取Factory
		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);
		// 獲取session
		//
		SqlSession session = sf.openSession();
		IUserDao userDao = session.getMapper(IUserDao.class);
		User u = userDao.getUserById(6);
		System.out.println("==========" + userDao.getUsers());
		// System.out.println(u.getUsername());
		// 刪除操作 以及插入 需要提交事務
		// userDao.deleteByid(4);
		// session.commit();
		// 插入
		// User insertUser = new User(1, "cca");
		// userDao.insert(insertUser);
		// System.out.println(insertUser.getUserId());
		// session.commit();
		// 查詢所有的時候
	}
}

主鍵返回:

<!-- 如果穿日入物件的時候 我們寫法 直接寫#{該class屬性的屬性} -->
	<insert id="insert" parameterType="com.pojo.User" keyProperty="userId"
		useGeneratedKeys="true">
		insert into user values(null,#{username},1);

</insert>

    #{}

表示一個佔位符,向佔位符輸入引數,mybatis自動進行java型別和jdbc型別的轉換。

程式設計師不需要考慮引數的型別,比如:傳入字串,mybatis最終拼接好的sql就是引數兩邊加單引號。

#{}接收pojo資料,可以使用OGNL解析出pojo的屬性值

    ${}

表示sql的拼接,通過${}接收引數,將引數的內容不加任何修飾拼接在sql中。

${}也可以接收pojo資料,可以使用OGNL解析出pojo的屬性值

缺點:不能防止sql注入。

 輸入和輸出對映[重要]

通過parameterType完成輸入對映,通過resultType和resultMap完成輸出對映。

resultType :指定輸出結果的型別(pojo、簡單型別、hashmap..),將sql查詢結果對映為java物件 。

         使用resultType注意:sql查詢的列名要和resultType指定pojo的屬性名相同,指定相同 屬性方可對映成功,如果sql查詢的列名要和resultType指定pojo的屬性名全部不相同,list中無法建立pojo物件的。

resultMap:將sql查詢結果對映為java物件。

         如果sql查詢列名和最終要對映的pojo的屬性名不一致,使用resultMap將列名和pojo的屬性名做一個對應關係 (列名和屬性名對映配置)

Collection裡面的值表示型別,和mapper.java裡面的屬性無關

使用foreach遍歷list:

<delete id="deleteByids">

                   delete from user where user_id in (

                   <foreach collection="list" item="item" separator=",">

                            #{item}

                   </foreach>

                   )

         </delete>

     自定義別名

 

     使用別名

在parameterType、resultType中使用別名:

 

 ResultMap的用法

 where  if 用法

相關推薦

mybatis基本用法

mybatis 架構 mybatis開發dao的方法:          1、原始dao開發方法,需要程式設計師編寫dao介面和實現類,此方法在當前企業中還有使用,因為ibatis使用的就是原始dao開發方法。          2、mapper代理方法,程式設計師只需要寫mapper介面(相當於dao介

mybatis學習筆記(二)之XML方式的基本用法

在前一篇筆記中,我們建立了配置 mybatis-config.xml 檔案,原來 mappers標籤下的內容為: <mappers> <mapper resource="tk/mybatis/simple/mapper/CountryMa

mybatis入門篇(二):Mybatis註解方式的基本用法

batis case left 返回 import Coding print pack hid @Select 1、mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCT

MyBatis從入門到精通(二):MyBatis XML方式的基本用法之Select

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. 明確需求 書中提到的需求是一個基於角色的許可權控制需求(RBAC,即Role-Based Access Control),提到許可權管理,相信大家都不陌

MyBatis從入門到精通(三):MyBatis XML方式的基本用法之多表查詢

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. 多表查詢 上篇部落格中,我們示例的2個查詢都是單表查詢,但實際的業務場景肯定是需要多表查詢的,比如現在有個需求: 查詢某個使用者擁有的所有角色。這個需求

MyBatis從入門到精通(四):MyBatis XML方式的基本用法之增刪改

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. insert用法 1.1 簡單的insert方法 假如現在我們想新增一個使用者,該如何操作呢? 首先,在介面SysUserMapper中新增如下方法。

MyBatis從入門到精通(五):MyBatis 註解方式的基本用法

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. @Select 註解 1.1 使用Sql語句設定別名方式 假設現在有個需求:根據id查詢角色資訊。使用註解方式該如何實現呢? 首先,在介面SysRole

shape的基本用法

enc schema 顏色 顏色漸變 mas utf pad 半徑 start <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/

Pinyin4j的基本用法

nts 人的 此外 中文 put stat -s http any     轉自:http://www.cnblogs.com/bluestorm/archive/2012/07/23/2605412.html 1. 簡單介紹 有時候,需要將漢字編程對應的拼音,以

11.python並發入門(part9 多線程模塊multiprocessing基本用法

python 多進程 multiprocessing 一、回顧多繼承的概念。由於GIL(全局解釋器鎖)的存在,在python中無法實現真正的多線程(一個進程裏的多個線程無法在cpu上並行執行),如果想充分的利用cpu的資源,在python中需要使用進程。二、multiprocessing模塊的簡介

Android屬性動畫完全解析(上),初識屬性動畫的基本用法

fcm 操作 fad 擴展性 改變 內部使用 如果 轉載 @override 轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/43536355 在手機上去實現一些動畫效果算是件比較炫酷的事情,因此Andr

JQuery的基本用法

技術 -1 nbsp jquer 技術分享 9.png log query com JQuery的基本用法

Jquery-zTree的基本用法

etc ssim 希望 取數據 attribute name checked down 個性 【簡介】 zTree 是利用 JQuery 的核心代碼,實現一套能完成大部分常用功能的 Tree 插件 兼容 IE、FireFox、Chrome 等瀏覽器 在一個頁面內可同時

IntBuffer類的基本用法

容量 city out ava test buffer eat ati nis package com.ietree.basicskill.socket.basic.nio; import java.nio.IntBuffer; /** * Created by A

java基礎:運算符的基本用法

自增 另一個 stat 不同 兩個 流程 ava -- 個數 運算符: 就是對常量和變量進行操作的符號。 算數運算符: A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正號 c:字符串連接符 C:/和%的區別 數據做除法操作的時候,/取得是商

windows下boost庫的基本用法

tdi bootstrap c++ org .exe 程序編譯 ring 包括 tar 由於boost都是使用模板的技術,所以全部代碼都是寫在一個.hpp頭文件裏。這樣boost中的大部分內容是不須要編譯生成對應的鏈接庫,僅僅須要設置以下的包括文件夾(或者設置一下環境變

XUtils3框架的基本用法(一)

art put ref undle ret oncreate title 斷點續傳 lis 本文為作者原創,轉載請指明出處: http://blog.csdn.net/a1002450926/article/details/50341173 今天給大

Android_Event Bus 的基本用法

nds lis 接收數據 void ntp this als default blog 1 //事件總線分發 2 public class MainActivity extends ActionBarActivity { 3 Button b

一站式學習Wireshark(一):Wireshark基本用法

11g 實現 alt href ascii 根據 無線網絡 完成 analyze 按照國際慣例,從最基本的說起。 抓取報文: 下載和安裝好Wireshark之後,啟動Wireshark並且在接口列表中選擇接口名,然後開始在此接口上抓包。例如,如果想要在無線網絡上抓取流量

frame與iframe的區別及基本用法

url resize nor ref logs 嵌套 html span 高度 frame 和 iframe 的區別   1、frame 不能脫離 frameset 單獨使用,iframe 可以;   2、frame 不能放到body中,否則將無法顯示;   3、if