前記:這是很早之前自學學習myBatis時的筆記,內容比較基礎,適合新手,內容基本是來自網絡,如有雷同,敬請諒解!
jar包
加入mybatis核心包、依賴包、數據驅動包。
配置日誌
在classpath下創建log4j.properties如下:
# Global loggingconfiguration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis默認使用log4j作爲輸出日誌信息。
配置SqlMapConfig.xml
在SqlMapConfig.xml文件中配置:
SqlMapConfig.xml就是myBatis的全局配置文件
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和spring整合後 environments配置將廢除-->
<environmentsdefault="development">
<environment id="development">
<!--用jdbc事務管理-->
<transactionManagertype="JDBC"/>
<!--數據庫連接池-->
<dataSource type="POOLED">
<property name="driver"value="com.mysql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
<property name="username"value="root"/>
<property name="password"value="123"/>
</dataSource>
</environment>
</environments>
</configuration>
SqlMapConfig.xml是mybatis核心配置文件,上邊文件的配置內容爲數據源、事務管理。
映射文件
映射文件命名:
舉例:
User.xml(原始ibatis命名),mapper代理開發映射文件名稱叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml
在映射文件中配置sql語句。
parameterType:定義輸入到sql中的映射類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。
resultType:定義結果映射類型。mybatis將sql查詢結果的一行記錄數據映射爲resultType指定類型的對象。
#{id}表示使用preparedstatement設置佔位符號並將輸入變量id傳到sql。
#{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。#{}可以接收簡單類型值或pojo屬性值。如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。
${}表示拼接sql串,通過${}可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換,${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。
在SqlMapConfig.xml中加載映射文件
舉例:
在sqlMapConfig.xml中加載User.xml:
自增主鍵返回
mysql自增主鍵,執行insert提交之前自動生成一個自增主鍵。
通過mysql函數獲取到剛插入記錄的自增主鍵:
LAST_INSERT_ID()
是insert之後調用此函數。
修改insertUser定義:
<insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">
<!-- selectKey將主鍵返回,需要再返回 -->
<selectKey keyProperty="id"
order="AFTER"
resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address});
</insert>
添加selectKey實現將主鍵返回:
keyProperty:返回的主鍵存儲在pojo中的哪個屬性
order:selectKey的執行順序,是相對與insert語句來說,
由於mysql的自增原理執行完insert語句之後纔將主鍵生成,
所以這裏selectKey的執行順序爲after
resultType:返回的主鍵是什麼類型
LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。
select LAST_INSERT_ID()得到剛insert進去記錄的主鍵值,只適用於自增主鍵。
非自增主鍵返回(使用uuid())
1. 使用mysql的uuid()函數生成主鍵,需要修改表中id字段類型爲string,長度設置成35位。
執行思路:
先通過uuid()查詢到主鍵,將主鍵輸入到sql語句中。
執行uuid()語句順序相對於insert語句之前執行。
注意這裏使用的order是“BEFORE”
2. 通過oracle的序列生成主鍵:
<selectKeykeyProperty="id"
order="BEFORE"
resultType="java.lang.String">
SELECT序列名.nextval()
</selectKey>
insert into user(id,username,birthday,sex,address)
value(#{id},#{username},#{birthday},#{sex},#{address})
注意這裏使用的order是“BEFORE”
總結
1. parameterType 在映射文件中通過parameterType指定輸入 參數的類型。
2. resultType 在映射文件中通過resultType指定輸出結果的類型。
3. #{}和${}
#{}表示一個佔位符號,#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap。
如果接收簡單類型,#{}中可以寫成value或其它名稱。
#{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。
${}表示一個拼接符號,會引用sql注入,所以不建議使用${}。
${}接收輸入參數,類型可以是簡單類型,pojo、hashmap。
如果接收簡單類型,${}中只能寫成value。
${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。
4. selectOne和selectList
selectOne表示查詢出一條記錄進行映射。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個對象)。
selectList表示查詢出一個列表(多條記錄)進行映射。如果使用selectList查詢多條記錄,不能使用selectOne。
如果使用selectOne報錯:
org.apache.ibatis.exceptions.TooManyResultsException:Expected one result (or null) to be returned by selectOne(), but found: 4