---恢復內容開始---
MyBatis
1. Mybatis概述
1.1. Mybatis是什么
Mybatis是一個持久層框架。
1.2. Mybatis的作用
Mybatis是一個持久層框架,當然作用就是操作數據庫的(增刪改查).
1.3. 為什么需要學習Mybatis
Mybatis的理念:讓程序員是10%的代碼就可以實現數據庫的操作。
解決方案: 持久層(DAO)的零實現. 所謂的零實現,就是不用寫實現類代碼,直接使用接口就可以操作數據庫.
Mybatis的定義,提高開發的效率!!!真的寫很少代碼!!!就可以增刪改查。
1.4. Mybatis的作用
Mybatis框架能夠讓我們以最少的代碼就可以操作數據庫。從而提高開發的效率!!!
--如何將代碼減少呢?
持久層的零實現 (不需要寫實現類)
可以自動將數據封裝到對象里面不需要手工編寫映射的關系
1.5. Mybatis配置流程圖
|
|
Resources:資源類,用於讀取總配置文件
SqlSessionFactoryBuilder:會話工廠構造類,通過讀取的總配置文件構建會話工廠
SqlSessionFactory:會話工廠
SqlSession:會話,就是操作數據庫的操作類
2. 入門示例
2.1. 配置流程說明
--獲得數據庫連接
第一步:導入包(任何框架需要的事情)
第二步:創建總配置文件,文件名隨便寫
第三步:創建一個MybatisUtils工具類,(獲得操作對象)
--需求:插入數據到數據庫
第四步:創建一個映射接口
第五步:創建一個映射文件
第六步:在總配置文件加載映射文件。
第七步:編寫測試插入數據代碼
2.2. 配置步驟
2.2.1. 下載mybatis框架
https://github.com/mybatis/mybatis-3
2.2.2. 創建一個普通java項目並導入相關
2.2.3. 創建主配置文件 mybatis-config.xml
在項目的 scr 下面創建 配置文件 mybatis-config.xml
具體配置參考mybatis的官方文檔即可
<?xml version="1.0" encoding="UTF-8" ?> <!-- dtd約束 --> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- 根元素: 用於配置mybatis --> <configuration> <!-- 配置mybatis的運行環境 ,可以配置多個環境,但是一次只能使用一個
default屬性 : 當前使用的環境 ,使用下面環境的id 即可 --> <environments default="dev_mysql"> <!-- 環境配置 id 屬性,就是當前環境的表示 --> <environment id="dev_mysql"> <!-- 配置MyBatis事務管理器 type屬性 : 事物類型 JDBC 使用事務(正常提交commit,異常回滾事務 rollback) 默認 MANAGED : 不使用事務 --> <transactionManager type="JDBC"/> <!-- 配置MyBatis的數據源 type : 配置連接池 POOLED :mybatis內置的一個連接池(默認) 后期都交給spring管理了,配置 dbcp連接池,阿里巴巴的 druid連接池 --> <dataSource type="POOLED"> <!-- 連接數據庫的操作 --> <!-- 數據庫驅動 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 連接數據庫的url --> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <!-- 連接數據庫賬號 --> <property name="username" value="root"/> <!-- 連接數據庫密碼 --> <property name="password" value="admin"/> </dataSource> </environment> </environments> <!-- 配置映射文件 --> <mappers> <!-- 配置包掃描映射文件 --> <!-- <package name=""/> --> <!-- 配置單個映射文件 --> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration> |
2.2.3.1.1.1.1.1.1. 創建MyBatisUtil工具類
MyBatisUtil工具類的作用主要用於 讀取配置文件,創建工廠對象,提供創建SqlSession數據庫操作對象的方法
package cn.zj.mybatis.util;
import java.io.InputStream;
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil { private MyBatisUtil() { }
//SqlSessionFactory 會話工廠對象 private static SqlSessionFactory factory; //類加載到JVM中就立馬執行static代碼塊,並且只會執行一次 static { //資源文件 String resource = "mybatis-config.xml"; //try(){}catch(Exception e){} try的圓括號內部能夠自動釋放/關閉資源 try(InputStream inputStream = Resources.getResourceAsStream(resource)) { //創建SqlSessionFactory 對象 factory = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) { e.printStackTrace(); }
} /** * 創建SqlSession對象 * @return SqlSession對 */ public static SqlSession openSession() { //創建Session對象 SqlSession session = factory.openSession(); return session; }
}
|
2.2.4. 創建數據庫表對應的實體類
package cn.zj.mybatis.pojo;
public class User { private Integer id; private String name; private String password; private Integer age;
public User() { super(); }
public User(Integer id, String name, String password, Integer age) { super(); this.id = id; this.name = name; this.password = password; this.age = age; }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
@Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]"; }
}
|
2.2.5. 創建一個操作接口
package cn.zj.mybatis.mapper;
import cn.zj.mybatis.pojo.User;
/* * 使用MyBatis的動態代理開發編寫代碼遵循四個原則 * 1.映射文件的namespace命名空間的值必須是對應接口的全限定名 2.映射文件的對應功能 id值必須等於映射接口中方法的名稱 3.映射文件的參數類型必須和接口中方法的參數類型一致 4.映射文件查詢的返回結果類型必須和接口的方法的返回數據類型一致, DML操作返回的受影響的行數,除外 */ public interface UserMapper {
int insertUserInfo(User u); }
|
2.2.6. 創建表對應的映射文件 :UserMapper.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"> <!-- 配置映射 namespace : 命名空間(通俗說法: 給當前映射文件的唯一標識:起一個唯一的名字) --> <mapper namespace="cn.zj.mybatis.pojo.UserMapper"> <!-- 新增操作 id: 當前功能的唯一標識,和接口方法同名 parameterType : 參數的類型 useGeneratedKeys:是否返回數據庫生成的主鍵 true是/false否 keyProperty : 數據庫主鍵對應java的pojo對象的屬性 keyColumn : 數據表的主鍵列明 --> <insert id="insertUserInfo" parameterType="User" useGeneratedKeys="true" keyProperty="id" keyColumn="id" ></mapper> |
2.2.7. 創建測試類准備測試
//插入操作 // 新增操作 @Test public void testInsert() throws Exception { //1.創建SqlSession操作對象 SqlSession session = MyBatisUtil.openSession();
//2.創建UserMapper接口的代理對象 UserMapper userMapper = session.getMapper(UserMapper.class);
//3.創建用戶對象 User user = new User(null, "喬峰", "qf", 30);
//4.執行UserMapper的插入操作 userMapper.insertUserInfo(user);
//5.提交事務 session.commit();
//6.關閉session session.close();
} |
2.3. Mybatis框架配置文件提示問題
MyBatis的配置文件使用dtd約束,如果在沒有聯網的情況想,默認開發者在使用時沒有提示,這樣不方便開發者編寫代碼。通過配置約束文件可讓xml文件編寫代碼有提示
1.聯網
2.手動管理DTD約束文件
|
配置完約束文件以后,關閉xml文件,重新打開即可有提示
3. log4j日志框架的配置
3.1. 說明
log4j是一個日志輸出框架,就是用於輸出日志的。
Mybatis的日志輸出是通過Log4J輸出的。主流框架大部分都是Log4j輸出的。Spring框架也可以通過Log4j輸出日志!!
問題:既然Log4j功能類似System.out.println(),為什么使用log4j而不直接使用System.out.println()?
答:Log4j提供了強大的日志輸出的自定義功能。
- 通過級別輸出日志 (調試、信息、警告、錯誤、致命異常)
- 可以指定輸出到控制台,以及輸出到文件。
- 可以設置輸出的日志格式
所以學習LOG4J.需要學會自定義配置LOG4J的輸出格式以及輸出等級
3.2. 下載路徑
Log4j的下載地址:http://logging.apache.org/log4j/1.2/
3.3. 配置步驟
3.3.1. 第一步:導入log4j-1.2.17.jar的包
3.3.2. 第二步:在src下創建一個log4j.propertis文件
注意:文件名必須為log4j.properties
# Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... # log4j.logger.org.mybatis.example.BlogMapper=TRACE # 前綴(log4j.logger)+點(.)需要記錄日志的命名空間 = 日志級別 log4j.logger.cn.zj.mybatis.mapper=TRACE # 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 |
3.4. 運行效果
![]()
|
4. MyBatis完成CRUD操作
4.1. 單行查詢
4.1.1. 映射文件
<!-- 單行查詢 resultType : 查詢結果對應的封裝的返回類型 --> <select id="selectByUserId" parameterType="integer" resultType="cn.zj.mybatis.pojo.User"> select * from user where id = #{id} </select> |
4.1.2. 測試方法
// 單行查詢 @Test public void testFindById() throws Exception { //1.創建SqlSession操作對象 SqlSession session = MyBatisUtil.openSession(); //2.創建UserMapper接口的代理對象 UserMapper userMapper = session.getMapper(UserMapper.class); //3.執行單行查詢操作 User user = userMapper.selectByPrimaryKey(1);
System.out.println(user);
// 4.關閉session session.close();
} |
4.2. 多行查詢
4.2.1. 映射文件
<!-- 多行查詢 resultType : 無論是多行查詢還是單行查詢,返回的結果類型都是對應的JavaBean的類型 --> <select id="selectAll" resultType="cn.zj.mybatis.pojo.User"> select * from user </select> |
4.2.2. 測試方法
@Test public void testFindAll() throws Exception {
SqlSession session = MyBatisUtil.openSession();
// 創建UserMaper的代理對象 UserMapper mapper = session.getMapper(UserMapper.class);
// 3.執行多行查詢 List<User> users = mapper.selectAll(); for (User user : users) { System.out.println(user); }
// 4.關閉session session.close(); } |
4.3. 刪除操作
4.3.1. 映射文件
<!-- 刪除操作 --> <delete id="deleteById" parameterType="integer"> delete from user where id = #{id} </delete>
|
4.3.2. 測試方法
// 刪除操作 @Test public void testDelete() throws Exception { // 1.創建SqlSession操作對象 SqlSession session = MyBatisUtil.openSession(); // 2.創建UserMapper接口的代理對象 UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.執行UserMapper的插入操作 userMapper.deleteById(3);
// 4.提交事務 session.commit();
// 5.關閉session session.close(); } |
4.4. 修改操作
4.4.1. 映射文件
<!-- 修改操作 --> <update id="updateByUserId" parameterType="cn.zj.mybatis.pojo.User"> update user set name = #{name},password = #{password},age = #{age} where id = #{id} </update> |
4.4.2. 測試方法
// 修改操作 @Test public void testUpdate() throws Exception { // 1.創建SqlSession操作對象 SqlSession session = MyBatisUtil.openSession(); // 2.創建UserMapper接口的代理對象 UserMapper userMapper = session.getMapper(UserMapper.class); // 3.創建用戶對象 User user = new User(2, "段譽", "dy", 25);
// 4.執行UserMapper的插入操作 userMapper.updateUserInfo(user);
// 5.提交事務 session.commit();
// 6.關閉session session.close(); } |
5. ResultMap 手動映射
MyBatis的查詢結果集都是自動映射封裝的,單行查詢將數據庫一條數據封裝成對應的Java對象。多行查詢,先將每一行封裝成對象,再將每個對象添加到集合中,最后返回一個List集合對象。
但是:必須保證查詢結果集和pojo對象的屬性名相同,否則無法自動封裝
問題: 如何解決查詢結果集名稱和pojo對象屬性不同的映射封裝?
解決方案:
- 使用手動映射封裝 <ResultMap>標簽
- 可以使用mybatis的駝峰命名法
<?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 namespace="cn.zj.mybatis.mapper.UserMapper">
<!-- resultType : 自動映射 resultMap : 手動映射,值 自定義對應手動映射標簽的 id的值 注意:自動映射和手動映射二選一,不能同時使用 --> <select id="findByUserId" parameterType="Integer" resultMap="user_map"> <!-- #{} OGNL表達式語言 --> select id u_id,name u_name,password u_password ,age u_age from user where id = #{id} </select>
<!-- 手動映射 type :需要手動映射的數據類型 id :唯一標識 --> <resultMap type="User" id="user_map"> <!-- 主鍵列映射 <id column="" property="" javaType="" jdbcType=""/> column :結果的列名 property:domain對象的對應的屬性名 javaType :domian對象的屬性的類型(可選,默認自動關聯) jdbcType :結果集列類型(可選,默認自動關聯)注意大小寫 --> <id column="u_id" property="id" javaType="Integer" jdbcType="INTEGER"/>
<!-- 主鍵列映射 <result column="" property="" javaType="" jdbcType=""/> column :結果的列名 property:domain對象的對應的屬性名 javaType :domian對象的屬性的類型(可選,默認自動關聯) jdbcType :結果集列類型(可選,默認自動關聯) --> <result column="u_name" property="name"/> <result column="u_age" property="age"/> <result column="u_password" property="password"/> </resultMap>
<!-- 多行查詢 注意:查詢不管單行還是多行查詢,返回的數據類型都是數據表對應的domain類型 多行不是放回集合 --> <select id="selectAll" resultMap="user_map"> select id u_id,name u_name,password u_password ,age u_age from user </select>
</mapper> |
6. 主配置文件說明與細節配置
<environments>:環境集標簽,就是用於配置數據庫的連接信息的
<environment>:用於配置具體環境參數
<transactionManager>:配置使用的事務類型,JDBC
<dataSource>:配置數據源的參數,POOLED
具體參數參看PooledDataSource的set方法
<property>:配置屬性
<mappers>:配置映射文件信息的
<mapper class|resource>:配置具體指定的mapper文件
class:配置使用注解時指定有注解的映射接口
resource:指定映射文件
<properties>:mybatis對propertis文件的支持
<typeAliases>:用於配置別名
<typeHandlers>:用於配置自定義類型處理器.
<settings>:配置Mybatis的默認設置的.
總配置文件的標簽順序
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)> |
這句話的意思就是configuration 標簽下的標簽的順序以及標簽出現的個數的聲明
根據這個聲明可以看到順序為:
1.properties
2.settings
3.typeAliases
4.typeHandlers
5.objectFactory
6.objectWrapperFactory
7.reflectorFactory
8.plugins
9.environments
10.databaseIdProvider
11.mappers
DTD規則文件標簽的出現的次數說明
如果聲明的標簽后?:表示出現0-1次
如果聲明的標簽后*:表示出現0-N次
如果聲明的標簽后+:表示出現1-N次
如果聲明的標簽后什么都沒有:表示出現1次
6.1. 別名typeAliases標簽
在UserMapper.xml文件中User無論是作為參數還是作為查詢返回數據類型,都需要寫上全限定名,實際可以寫上簡單類名即可,但是需要配置別名
MyBatis框架提供了兩種別名機制,一種是自定義別名,一種是內置別名
6.1.1. 自定義別名
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" > <!-- XMLConfigBuilder是總配置文件的構建類 --> <configuration> <!-- 別名設置 --> <typeAliases> <!-- 設置單個類的別名 type :要設置別名的全限定名 alias :別名 --> <typeAlias type="cn.zj.mybatis.pojo.User" alias="User"/> </typeAliases>
<!-- 用於配置數據庫的連接參數 ,environments這個標簽可以配置多個數據庫的連接,default表示默認使用的配置--> <environments default="default-msql">
<!-- 數據庫的連接參數 Configuration查看參數--> <!-- 所有框架的靜態屬性都可以在這個框架的類里面找到,不用死記硬背 --> <!-- id:就是一個標識符 --> <environment id="default-msql"> <!-- 事務類型 --> <!-- 事務類型有哪些 JDBC:使用JDBC事務 MANAGED:不用事務 --> <transactionManager type="JDBC"></transactionManager> <!-- 數據源 --> <!-- type表示數據庫的類型 JNDI:使用JNDI獲得數據源. POOLED:使用默認的連接池獲得數據源 UNPOOLED:不用數據源
--> <!-- org.apache.ibatis.datasource.pooled.PooledDataSource --> <dataSource type="POOLED"> <!-- 所有的property對應的是一個set方法 --> <!-- 四要素 --> <property name="driver" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/school"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource>
</environment>
</environments> <!-- 加載映射文件 --> <mappers> <mapper resource="mybatis-mapper/StudentMapper.xml"/> </mappers>
</configuration>
|
如果配置成功,在映射文件里面可以直接使用別名
<?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 namespace="test"> <!-- 單行查詢操作 <select id=""> id :當前功能唯一標識 parameterType : 當前參數的數據類型 resultType :查詢結果要封裝返回對象的數據類型 標簽內部的文本內容: 要操作SQL語句 --> <select id="findById" parameterType="Integer" resultType="User"> <!-- #{} OGNL表達式語言 --> select * from user where id = #{id} </select>
<!-- 多行查詢 注意:查詢不管單行還是多行查詢,返回的數據類型都是數據表對應的pojo類型 多行不是放回集合 --> <select id="findAll" resultType="User"> select * from user </select>
<!-- 新增數據 keyProperty : 數據庫表主鍵對應的pojo類型的屬性 useGeneratedKeys: 是否生成主鍵,如果為true,數據保存以后 MyBatis會自動把數據庫當前數據的主鍵值設置pojo對應的id中去
--> <insert id="insertUserInfo" parameterType="User" keyProperty="id" useGeneratedKeys="true"> <!-- #{對象的屬性名稱} --> insert into user (name,password,age)values(#{name},#{password},#{age}) </insert>
<!-- 刪除數據 --> <delete id="deleteById" parameterType="Integer" > delete from user where id = #{id} </delete>
<!-- 修改操作 --> <update id="updateUserInfoById" parameterType="User"> update user set name = #{name} ,password = #{password},age = #{age} where id = #{id} </update>
</mapper> |
6.1.2. 內置別名
所謂的內置別名,就是Mybatis框架自帶別名.
Mybatis已經將常用的數據類型的別名內置聲明了.所以這些內置的別名不需要配置就可以直接使用.
內置的別名就是,Mybatis框架默認已經設置的別名.
別名 |
映射的類型 |
_byte |
byte |
_long |
long |
_short |
short |
_int |
int |
_integer |
int |
_double |
double |
_float |
float |
_boolean |
boolean |
string |
java.lang.String |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
integer |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
date |
java.util.Date |
decimal |
BigDecimal |
bigdecimal |
BigDecimal |
object |
Object |
map |
java.util.Map |
hashmap |
HashMap |
list |
List |
arraylist |
ArrayList |
collection |
Collection |
iterator |
Iterator |
6.2. properties 讀取配置文件
一般開發會將單獨的數據庫連接字符串配置到一個獨立的 以 .properties 的配置文件中
Mybaits框架中配置文件 的 <properties>標簽可以讀取配置文件中的內容。並可以使用${}的語法設置給框架的數據庫連接操作代碼
6.2.1. 在classpath下面創建一個db.properties數據庫連接配置文件
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=root |
6.2.2. 在mybatis-config.xml主配置文件中配置<properties>標簽讀取配置文件
<!-- 根標簽,在內部配置MyBatis框架信息 --> <configuration>
<!-- 讀取classpath下面的 數據庫配置文件、 讀取以后再下面鏈接數據庫的配置中就可以使用 ${配置文件key} 獲取對應的數據庫連接相關信息 --> <properties resource="db.properties"/> |
6.2.3. 連接數據庫的配置修改為 ${key}的方式
--> <environment id="mysql"> <!-- 配置事務管理器 type : 事務管理器的類型,使用的MyBatis框架自定義的一種別名 JDBC :使用原生的JDBC作為事務管理 --> <transactionManager type="JDBC"/> <!-- 配置MyBatis的數據源 type : 配置連接池 POOLED :mybatis內置的一個連接池(默認) 后期都交給spring管理了,配置 dbcp連接池,阿里巴巴的 druid連接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> |
6.3. settings標簽
Mybatis默認設置了很多默認配置.有時候,我們需求與默認的配置的參數不一樣,
我們就需要修改這些默認配置的參數.
如:Mybatis已經對駱駝命名法的支持,但默認是不開啟的.可以通過mapUnderscoreToCamelCase參數設置為true支持
表示Mybatis啟動可以配置的設置
設置參數 |
描述 |
有效值 |
默認值 |
cacheEnabled |
該配置影響的所有映射器中配置的緩存的全局開關。 |
true | false |
TRUE |
lazyLoadingEnabled |
延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。 |
true | false |
FALSE |
aggressiveLazyLoading |
當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載(參考lazyLoadTriggerMethods). |
true | false |
false (true in ≤3.4.1) |
multipleResultSetsEnabled |
是否允許單一語句返回多結果集(需要兼容驅動)。 |
true | false |
TRUE |
useColumnLabel |
使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。 |
true | false |
TRUE |
useGeneratedKeys |
允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。 |
true | false |
FALSE |
autoMappingBehavior |
指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。 |
NONE, PARTIAL, FULL |
PARTIAL |
autoMappingUnknownColumnBehavior |
指定發現自動映射目標未知列(或者未知屬性類型)的行為。 |
NONE, WARNING, FAILING |
NONE |
NONE: 不做任何反應 |
|||
WARNING: 輸出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等級必須設置為 WARN) |
|||
FAILING: 映射失敗 (拋出 SqlSessionException) |
|||
defaultExecutorType |
配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。 |
SIMPLE REUSE BATCH |
SIMPLE |
defaultStatementTimeout |
設置超時時間,它決定驅動等待數據庫響應的秒數。 |
任意正整數 |
Not Set (null) |
defaultFetchSize |
為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。 |
任意正整數 |
Not Set (null) |
safeRowBoundsEnabled |
允許在嵌套語句中使用分頁(RowBounds)。 If allow, set the false. |
true | false |
FALSE |
safeResultHandlerEnabled |
允許在嵌套語句中使用分頁(ResultHandler)。 If allow, set the false. |
true | false |
TRUE |
mapUnderscoreToCamelCase |
是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。 |
true | false |
FALSE |
localCacheScope |
MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。 |
SESSION | STATEMENT |
SESSION |
jdbcTypeForNull |
當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 |
JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER |
OTHER |
lazyLoadTriggerMethods |
指定哪個對象的方法觸發一次延遲加載。 |
A method name list separated by commas |
equals,clone,hashCode,toString |
defaultScriptingLanguage |
指定動態 SQL 生成的默認語言。 |
A type alias or fully qualified class name. |
org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
callSettersOnNulls |
指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。 |
true | false |
FALSE |
returnInstanceForEmptyRow |
當返回行的所有列都是空時,MyBatis默認返回null。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用於嵌套的結果集 (i.e. collectioin and association)。(從3.4.2開始) |
true | false |
FALSE |
logPrefix |
指定 MyBatis 增加到日志名稱的前綴。 |
Any String |
Not set |
logImpl |
指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 |
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
Not set |
proxyFactory |
指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。 |
CGLIB | JAVASSIST |
JAVASSIST (MyBatis 3.3 or above) |
vfsImpl |
指定VFS的實現 |
自定義VFS的實現的類全限定名,以逗號分隔。 |
Not set |
useActualParamName |
允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的工程必須采用Java 8編譯,並且加上-parameters選項。(從3.4.1開始) |
true | false |
TRUE |
configurationFactory |
Specifies the class that provides an instance of Configuration. The returned Configuration instance is used to load lazy properties of deserialized objects. This class must have a method with a signature static Configuration getConfiguration(). (Since: 3.2.3) |
A type alias or fully qualified class name. |
Not set |
如支持駱駝命名法
<!-- 配置默認的參數 --> <settings> <!-- 默認支持駱駝命名法 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> |
7. MyBatis的注解開發
MyBatis的映射配置除了使用xml配置以外,還支持注解配置sql語句
問題: 為什么有了xml配置還有注解配置
答 :MyBatis的注解開發更簡潔,只需要將對應的SQL語句的注解標注對應的功能方法上即可,直接連 XxxMapper.xml映射文件都可以省略了
本身注解開發就是Java配置的一種趨勢,后期學習SpringBoot時候,發現全部用純注解配置
MyBatis提供了下面注解進行映射文件配置
@Select 查詢數據注解 @Insert 插入數據注解 @Delete 刪除數據注解 @Update 修改數據注解 @Options 選項配置 @Results 手動映射配置 @Result : @results中的具體的某一列的映射信息配置 |
7.1. 案例代碼
package cn.zj.mybatis.mapper; import java.util.List;
import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.One; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update;
import cn.zj.mybatis.domain.User;
/** * * @Select 查詢注解 * @Insert * */ public interface UserMapper {
@Select("select id u_id,name u_name,password u_password,age u_age from user where id = #{id}") @Results({ @Result(id=true,property="id",column="u_id"), @Result(property="name",column="u_name"), @Result(property="password",column="u_password"), @Result(property="age",column="u_age") }) User selectByPrimaryKey(Integer id);
@Select("select * from user") List<User> findAll();
@Insert("insert into user (name,password,age)values(#{name},#{password},#{age})") @Options(keyProperty="id",useGeneratedKeys=true) int insertUserInfo(User user);
@Delete("delete from user where id = #{id}") int deleteByUserId(Integer id);
@Update("update user set name = #{name} ,password = #{password},age = #{age} where id = #{id}") int updateUserInfoById(User user);
}
|
7.2. 注解映射的配置
<mappers> <!-- 配置具體的映射文件 ,映射xml文件--> <!-- <mapper resource="cn/zj/mybatis/mapper/UserMapper.xml"/> --> <!-- 接口映射權限定名 --> <mapper class="cn.zj.mybatis.mapper.UserMapper"/> </mappers> |
8. 方法多參數傳遞使用-@Param注解
Mybatis默認情況下是不支持傳入多個參數的.只能傳入一個參數.
所謂的傳入參數指定是Mybatis操作 (<insert><delete><update><select>)的傳入參數. 方案1:將這些參數封裝到一個對象里面(JavaBean/Map),再傳入. 方案2:給參數設置一個@Param注解支持,而且多參數的類型要統一
問題:為什么不支持多個參數? 因為Java語法1.7以前.是不能通過反射技術獲得方法的參數名的.
解決方案使用 @Param 參數注解 |
案例代碼
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import cn.zj.mybatis.domain.User;
public interface UserMapper {
/** * 模擬登陸操作 * @param user 封裝有賬號密碼的User對象 * @return 查詢結果封裝的User對象 */ User login1(User user);
/** * 模擬登陸操作 * @param user 封裝有賬號密碼的Map集合 * @return 查詢結果封裝的User對象 */ User login2(Map<String, Object> map);
User login3(@Param("username")String name,@Param("pwd")String password);
} |
測試代碼
@Test public void testlogin3() throws Exception {
SqlSession session = MyBatidUtil.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.login3("楊過", "yangguo");
System.out.println(user); } |
9. #{}與${}的區別
在MyBatis框架中支持兩種 OGNL語法
#{}基於JDBC的PreparedStatement類,SQL語句參數使用 ?占位符,在運行階段動態設置參數,但是 ?不能作為表名.
預編譯語句對象的SQL語句只能 操作 DML和DQL 語句,不能操作DDL語句
1.#{}表示設置預編譯的參數,就是?的參數,所以如果要不固定的表名不能使用#{},只能使用${}
2.${}直接把值輸出來,直接把參數拼接到SQL語句中.而#{]是使用?來代替. 所以${}是不安全的.
3.${}只能獲得參數池的值,而#{}可以獲得方法的參數值,也可以獲得參數池的值,如果使用${}獲得參數的值,這個參數必須要加上@Param
如果非必要情況,不要使用${}
問題:那么${}有什么用呢?
答:注意基於JDBC的接口的原來的表名是不可以使用?的,?只能用於傳入的參數。
如果操作的涉及表名這些非參數的 數據時,需要使用${}
9.1. 刪除案例代碼
package cn.zj.mybatis.mapper;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
/** * 動態刪除數據庫中指定表名 * @param tableName 表名 * @return */ int dropTable(@Param("tableName")String tableName); }
|
<?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 namespace="cn.zj.mybatis.mapper.UserMapper">
<!-- 使用 #{} 不能使用在表名操作 --> <delete id="dropTable" parameterType="String"> <!-- drop table #{tableName} --> drop table ${tableName} </delete> </mapper> |
9.2. 打印效果
9.2.1. 使用 #{}
使用此種方法無法刪除數據庫表
|
9.2.2. 使用${}
|
熱愛生活 熱愛coding 敢於挑戰 勇於探索 ...