1、properties(這個標簽基本上不太使用,了解)
1、mybatis可以使用properties來引入外部properties配置文件的內容
resource是引入類路徑下的資源
url:引入網絡網絡路徑或磁盤路徑下的資源
新建一個file文件命名為dbconfig.properties,內容填充如下
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
mybatis-config.xml文件內容修改如下,添加了properties標簽,將數據庫信息動態傳入。(11、16-19行進行了修改)
(在后面mybatis與spring整合時,這一塊都交給了spring做)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 7 1、mybatis可以使用properties來引入外部properties配置文件的內容 8 resource是引入類路徑下的資源 9 url:引入網絡網絡路徑或磁盤路徑下的資源 10 --> 11 <properties resource="dbconfig.properties"></properties> 12 <environments default="development"> 13 <environment id="development"> 14 <transactionManager type="JDBC" /> 15 <dataSource type="POOLED"> 16 <property name="driver" value="${jdbc.driver}" /> 17 <property name="url" value="${jdbc.url}" /> 18 <property name="username" value="${jdbc.username}" /> 19 <property name="password" value="${jdbc.password}" /> 20 </dataSource> 21 </environment> 22 </environments> 23 <!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要注冊到全局配置文件(mybatis-config.xml)中 --> 24 25 <mappers> 26 <mapper resource="EmployeeMapper.xml" /> 27 </mappers> 28 </configuration>
2、settings
2.1、mapUnderscoreToCamelCase的使用
之前由於字段名沒有和數據庫中的對應上,lastName獲取到的是null(如下圖),使用mapUnderscoreToCamelCase可以使用駝峰命名法,需要將默認值FALSE改為TRUE即可使用了。
將以下代表加入到全局配置mybatis-config.xml文件中
1 <settings> 2 <setting name="mapUnderscoreToCamelCase" value="TRUE"/> 3 </settings>
再次進行測試,可以取到值了
數據庫的字段是last_name,而javabean是lastName,這種情況下使用nice~規范~
(數據庫不區分大小寫,故命名規則是單詞間要加下划線;java區分大小寫,命名規范是駝峰命名法)
3、typeAliases
別名處理器
在xml文件中應用全類名的地方,可以使用別名了,減少工作量
在EmployeeMapper.xml文件中,查詢結果的返回值為com.atguigu.mybatis.bean.Employee,太長了
別名不區分帶小寫
處理方法如下:
(1)從Javabean中的Employee復制全類名放到全局配置文件mybatis-config.xml
1 <typeAliases> 2 <!--typeAlias:為某個java類型起類名 3 type:指定要起別名的類型全類名;默認別名就是類型小寫:employee 4 alias:指定新的別名
5 6 --> 7 <typeAlias type="com.atguigu.mybatis.bean.Employee"/> 8 </typeAliases>
(2)在EmployeeMapper.xml文件中,將返回值改為默認別名即employee,再次測試,成功
或者使用alias指定別名
mybatis-config.xml,修改如下
1 <typeAliases> 2 <!--typeAlias:為某個java類型起類名 3 type:指定要起別名的類型全類名;默認別名就是類型小寫:employee 4 alias:指定新的別名 5 6 --> 7 <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> 8 </typeAliases>
EmployeeMapper.xml修改如下
1 <select id="getEmpById" resultType="emp"> 2 select * from tb1_employee where id = #{id} 3 </select>
運行成功!
如果每次取別名,都用typeAliases就每次只能為一個類型取別名,太麻煩了。使用批量取別名來解決這一問題
package:為某個包內下的所有類批量取別名
name:指定包名(為當前包及下面所有的的后代包的每一一個類都起一個默認別名(類名小寫)
將全局文件中代碼修改如下:
1 <typeAliases> 2 <package name="com.atguigu.mybatis.bean"/> 3 </typeAliases>
將EmpolyeeMapper.xml更改如下
1 <!-- resultType可以寫成Employee或employee,別名不區分大小寫 --> 2 <select id="getEmpById" resultType="Employee"> 3 select * from tb1_employee where id = #{id} 4 </select>
如果使用package,容易產生別名沖突,從而報錯
解決方法:Javabean中使用一個注解,為這個類名指定一個新的別名
@Alias("emp")
並修改EmployeeMapper.xml中的返回值,當然別名不區分大小寫
1 <select id="getEmpById" resultType="emp"> 2 select * from tb1_employee where id = #{id} 3 </select>
運行成功!
根據文檔查看,我們可以看到很多已經取好的別名
我們自己設置的別名一定不能和下面的別名重復
寫全類名比較適合查看按住crtl+鼠標點擊,即可查看javabean,這樣可能會比較方便一些。
4、typeHandlers(粗略介紹,后面再仔細看)
類型處理器,在數據類型和java映射時使用
日期處理:
NOTE If you use classes provided by JSR-310(Date and Time API), you can use the mybatistypehandlers-jsr310.(官方文檔中的一句話)
官方下載地址:https://github.com/mybatis/typehandlers-jsr310
想要更豐富的類型這樣來注冊
<typeHandlers> <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.YearTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" /> <typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" /> </typeHandlers>
但是在mybatis3.4以前的版本需要我們手動注冊這些處理器,以后的版本都是自動注冊的。
5、plugins
插件
現在先簡單了解,到mybatis運行原理以后,對mybatis運行機制了解后詳細講解。
先將四大對象混個眼熟。
Executor 執行器
ParameHandler 參數處理器
ResultSetHandler 結果集處理器
StatementHandler sql語句處理器
6、environments
environments:環境們,mybatis可以配置多種環境,default指定使用某種環境,可以達到快速切換
environment:配置一個具體的環境信息,必須有transactionManager和dataSource才完整,id代表當前環境的唯一表示
transactionManager:事務管理器;
type:事務管理器的類型,有JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory);
自定義事務管理器:實現TransactionFactory接口,type指定為全類名
dataSource:數據源;
type:數據源類型;UNPOOLED(UnpooledDataSourceFactory)|POOLED(PooledDataSourceFactory)|JNDI(JndiDataSourceFactory)
自定義數據源:實現DataSourceFactory接口,type指定為全類名
Ctrl + Shift + T:快捷鍵打開openType,搜索configuration
這里邊注冊了很多別名
7、databaseIdProvider
支持多個數據庫廠商
這個功能支持需要全局配置文件中添加
<databaseIdProvider type="DB_VENDOR" />
此標簽於本人可能用不到先不寫。。
8、mappers
mappers將sql映射注冊到全局配置中
注冊配置文件:
resource:應用類路徑下的sql映射文件
url:引用網路路徑或者磁盤路徑下的sql音色文件
file:///var/mapper/AuthorMapper.xml
注冊接口
class:引用(注冊)接口,
1、有sql映射文件,映射文件名必須和接口同名,並且放在與接口同一目錄下
2、沒有sql映射文件,所有的sql都是利用注解寫在接口上;
resource屬性:
新建一個包,將EmployeeMapper.xml放進去,然后修改配置文件內容resource改為全類名
1 <mappers> 2 <mapper resource="mybatis/mapper/EmployeeMapper.xml" /> 3 </mappers>
class屬性:
EmployeeMapperAnnotation接口代碼:
1 package com.atguigu.mybatis.dao; 2 3 import org.apache.ibatis.annotations.Select; 4 5 import com.atguigu.mybatis.bean.Employee; 6 7 public interface EmployeeMapperAnnotation { 8 9 @Select("select * from tb1_employee where id = #{id}") 10 public Employee getEmpById(Integer id); 11 }
在測試文件中再寫一個測試方法
1 public void test02() throws IOException { 2 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); 3 SqlSession openSession = sqlSessionFactory.openSession(); 4 5 try { 6 EmployeeMapperAnnotation mapper = openSession.getMapper(EmployeeMapperAnnotation.class); 7 Employee empById = mapper.getEmpById(1); 8 System.out.println(empById); 9 }finally { 10 openSession.close(); 11 } 12 13 }
運行成功!
不過還是寫在xml文件上便於維護,推薦必要重要的Dao接口寫sql映射文件,不重要的簡單的Dao接口為了開發快速可以使用注解。
由於mapper都是一個一個注冊的,比較麻煩,故而還有批量注冊的方法。
使用package,name屬性中要寫包名,基於注解版沒有問題,但是,寫了映射文件的可能找不到,故而將映射文件放入同一個包下,文件名和接口名是一樣的,這樣才可以批量注冊。
以后都將接口和xml放在一起,但是為了規整,在conf下建一個與接口文件一樣路徑的包
雖然看起來不是在一個路徑下,實際打開源碼包都都會放在bin的路徑下,bin路徑被我們叫做類文件的開始。