1.1. Mybatis是什么
mybatis else、Mybatis是一個持久層框架。
1.2. Mybatis的作用
Mybatis是一個持久層框架,當然作用就是操作數據庫的(增刪改查).
java idea、1.3. 為什么需要學習Mybatis
Mybatis的理念:讓開發者是10%的代碼就可以實現數據庫的操作。
解決方案: 持久層(DAO)的零實現. 所謂的零實現,就是不用寫實現類代碼,直接使用接口就可以操作數據庫.
java lambda foreach。Mybatis的定義,提高開發的效率!!!真的寫很少代碼!!!就可以增刪改查。
1.4. Mybatis的作用
Mybatis框架能夠讓我們以最少的代碼就可以操作數據庫。從而提高開發的效率!!!
mybatis、--如何將代碼減少呢?
持久層的零實現 (不需要寫實現類)
可以自動將數據封裝到對象里面不需要手工編寫映射的關系
1.5. Mybatis配置流程圖
Resources:資源類,用于讀取總配置文件
SqlSessionFactoryBuilder:會話工廠構造類,通過讀取的總配置文件構建會話工廠
SqlSessionFactory:會話工廠
SqlSession:會話,就是操作數據庫的操作類
2.1. 配置流程說明
--獲得數據庫連接
第一步:導入包(任何框架需要的事情)
第二步:創建總配置文件,文件名隨便寫
第三步:創建一個MybatisUtils工具類,(獲得操作對象)
--需求:插入數據到數據庫
第四步:創建一個映射接口
第五步:創建一個映射文件
第六步:在總配置文件加載映射文件。
第七步:編寫測試插入數據代碼
2.2.1. 下載mybatis框架
https://github.com/mybatis/mybatis-3
2.2.2. 創建一個普通java項目并導入相關
在項目的 src 下面創建 配置文件 mybatis-config.xml
具體配置參考mybatis的官方文檔即可
<?xml version="1.0" encoding="UTF-8" ?>
<!-- dtd約束 -->
<!DOCTYPE configurationPUBLIC "-//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>
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;}}
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;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]";}}
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);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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>
//插入操作
// 新增操作
@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.關閉sessionsession.close();}
MyBatis的配置文件使用dtd約束,如果在沒有聯網的情況想,默認開發者在使用時沒有提示,這樣不方便開發者編寫代碼。通過配置約束文件可讓xml文件編寫代碼有提示
1.聯網
2.手動管理DTD約束文件
配置完約束文件以后,關閉xml文件,重新打開即可有提示
3.1. 說明
log4j是一個日志輸出框架,就是用于輸出日志的。
Mybatis的日志輸出是通過Log4J輸出的。主流框架大部分都是Log4j輸出的。Spring框架也可以通過Log4j輸出日志!!
問題:既然Log4j功能類似System.out.println(),為什么使用log4j而不直接使用System.out.println()?
答:Log4j提供了強大的日志輸出的自定義功能。
1. 通過級別輸出日志 (調試、信息、警告、錯誤、致命異常)
2. 可以指定輸出到控制臺,以及輸出到文件。
3. 可以設置輸出的日志格式
所以學習LOG4J.需要學會自定義配置LOG4J的輸出格式以及輸出等級
3.2. 下載路徑
Log4j的下載地址:http://logging.apache.org/log4j/1.2/
3.3. 配置步驟
注意:文件名必須為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
4.1. 單行查詢
4.1.1. 映射文件
<!-- 單行查詢resultType : 查詢結果對應的封裝的返回類型--><select id="selectByUserId" parameterType="integer" resultType="cn.zj.mybatis.pojo.User">select * from user where id = #{id}</select>
// 單行查詢
@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.關閉sessionsession.close();
}
<!-- 多行查詢resultType : 無論是多行查詢還是單行查詢,返回的結果類型都是對應的JavaBean的類型--><select id="selectAll" resultType="cn.zj.mybatis.pojo.User">select * from user</select>
@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.關閉sessionsession.close();
}
<!-- 刪除操作 --><delete id="deleteById" parameterType="integer">delete from user where id = #{id}</delete>
// 刪除操作
@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.關閉sessionsession.close();
}
<!-- 修改操作 --><update id="updateByUserId" parameterType="cn.zj.mybatis.pojo.User">update user set name = #{name},password = #{password},age = #{age} where id = #{id}</update>
// 修改操作
@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.關閉sessionsession.close();
}
MyBatis的查詢結果集都是自動映射封裝的,單行查詢將數據庫一條數據封裝成對應的Java對象。多行查詢,先將每一行封裝成對象,再將每個對象添加到集合中,最后返回一個List集合對象。
但是:必須保證查詢結果集和pojo對象的屬性名相同,否則無法自動封裝
問題: 如何解決查詢結果集名稱和pojo對象屬性不同的映射封裝?
解決方案:
1. 使用手動映射封裝 <ResultMap>標簽
2. 可以使用mybatis的駝峰命名法. ResultMap 手動映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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>
<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次
在UserMapper.xml文件中User無論是作為參數還是作為查詢返回數據類型,都需要寫上全限定名,實際可以寫上簡單類名即可,但是需要配置別名
MyBatis框架提供了兩種別名機制,一種是自定義別名,一種是內置別名|
<?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 mapperPUBLIC "-//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>
所謂的內置別名,就是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
一般開發會將單獨的數據庫連接字符串配置到一個獨立的 以 .properties 的配置文件中
Mybaits框架中配置文件 的 <properties>標簽可以讀取配置文件中的內容。并可以使用${}的語法設置給框架的數據庫連接操作代碼
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
<!-- 根標簽,在內部配置MyBatis框架信息 -->
<configuration><!-- 讀取classpath下面的 數據庫配置文件、讀取以后再下面鏈接數據庫的配置中就可以使用${配置文件key} 獲取對應的數據庫連接相關信息--><properties resource="db.properties"/>
--><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>
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 NONENONE: 不做任何反應 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>
MyBatis的映射配置除了使用xml配置以外,還支持注解配置sql語句
問題: 為什么有了xml配置還有注解配置
答 :MyBatis的注解開發更簡潔,只需要將對應的SQL語句的注解標注對應的功能方法上即可,直接連 XxxMapper.xml映射文件都可以省略了
本身注解開發就是Java配置的一種趨勢,后期學習SpringBoot時候,發現全部用純注解配置
MyBatis提供了下面注解進行映射文件配置
@Select 查詢數據注解
@Insert 插入數據注解
@Delete 刪除數據注解
@Update 修改數據注解
@Options 選項配置
@Results 手動映射配置
@Result : @results中的具體的某一列的映射信息配置
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>
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);}
測試代碼
@Testpublic void testlogin3() throws Exception {SqlSession session = MyBatidUtil.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.login3("楊過", "yangguo");System.out.println(user);}
在MyBatis框架中支持兩種 OGNL語法
#{}基于JDBC的PreparedStatement類,SQL語句參數使用 ?占位符,在運行階段動態設置參數,但是 ?不能作為表名.
預編譯語句對象的SQL語句只能 操作 DML和DQL 語句,不能操作DDL語句
1.#{}表示設置預編譯的參數,就是?的參數,所以如果要不固定的表名不能使用#{},只能使用${}
2.${}直接把值輸出來,直接把參數拼接到SQL語句中.而#{]是使用?來代替. 所以${}是不安全的.
3.${}只能獲得參數池的值,而#{}可以獲得方法的參數值,也可以獲得參數池的值,如果使用${}獲得參數的值,這個參數必須要加上@Param
如果非必要情況,不要使用${}
問題:那么${}有什么用呢?
答:注意基于JDBC的接口的原來的表名是不可以使用?的,?只能用于傳入的參數。
如果操作的涉及表名這些非參數的 數據時,需要使用${}
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 mapperPUBLIC "-//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>
使用此種方法無法刪除數據庫表
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态