[資料庫 06] Mybatis 配置優化 欄位名不對應 日誌 分頁
Mybais 優化使用
1. 配置優化
mybatis-config.xml檔案配置標籤:
- properties 屬性
- settings 設定
- typeAliases 類型別名
- environments 環境配置
- mappers 對映器
配置xml檔案中,configure的順序:
"configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"的順序
1. environments 環境變數
預設事務管理器JDBC,預設資料來源是 pooled
結構:
<environments default="">//用於切換預設的環境,選擇id值 <environment id="">//一般有兩套,一套開發,一套測試 <transactionManager type="JDBC|MANAGED"></transactionManager></transactionManager> //事務管理器有兩種型別, JDBC和managed <dataSource type="UNPOOLED|POOLED|JNDI"> //用於選擇資料來源,連線池(DBCP, C3P0, Druid, Hikari(Spring預設) // 預設時pooled,連線之後回收,可以多個連線 <property></property> <property></property> </dataSource> </environment> </environments>
2. 屬性(properties):
- 可以用過
db.properties
檔案來動態配置,降低配置檔案的耦合性,方便維護。
drive=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=123456
- xml配置中引入外部配置檔案:
<properties resource="db.properties"></properties>
properties中可以繼續定義name,value鍵值對,但優先走外部配置檔案
3. typeAliases 類型別名
用來減少完全限定名(全路徑名)的冗餘設定,如返回值resultType引數後的型別不用寫全部包名.實體類名。
有兩種方式:
- 在typeAlias標籤中定義 別名:型別
<typeAliases>
<typeAlias alias="user" type="com.roy.pojo.User"/>
</typeAliases>
- 指定pachage標籤,在標籤中寫入實體類的包名,則可以直接使用
<typeAliases>
<package name="com.roy.pojo"/> // 只指定到實體類的包名
</typeAliases>
在實體類比較少,使用第一種:屬性alias中直接指定別名
實體類比較多,使用第二種:使用註解,在實體類新增 @Alias("another_name")
,則可以在UserMapper.xml中使用返回值物件為resultType = another_name
4. settings 設定
暫時不用
5. mappers 對映器 對映方法
-
使用完全限定名載入UserMapper.xml檔案
<mappers> <mapper resource="com/roy/dao/UserMapper.xml"/> </mappers>
-
使用class檔案去載入(載入的是介面)
兩個問題:介面和Mapper.xml必須同名, 以及兩個檔案必須在同一個包下
<mappers> <mapper class="com.roy.dao.UserMapper"/> </mappers>
-
使用package將介面都註冊為對映器,條件同上2點。
<mappers> <package name="com.roy.dao"/> </mappers>
6. 生命週期和作用域
-
mybatis的流程:
SqlSessionFactoryBuilder: 一旦創建出SqlSessionFactory, 就不需要了,區域性變數
SqlSessionFactory: 相當於連線池,一旦被建立,就一直存在於執行期間,最好使用單例模式
SqlSession: 連線池的一個連線,不是執行緒安全的,用完之後需要儘快關閉
-
SqlSessionFactory和SqlSession 的關係:
SqlSessionFactory 相當於web中的ServletContext, 每一個SqlSession相當於一個個Servlet, Mapper則執行每一個業務
2. 解決屬性名和欄位名不一致問題
1. 原始方法:
修改sql語句,修改為select 欄位名 as 屬性名
2. 結果集對映
在UserMapper.xml檔案中新增結果對映:
<resultMap id="UserMap" type="User"> // id為返回結果map標籤所定義的
<result column="資料庫中的欄位" property="實體類中的屬性"/>
<result column="" property=""/>
<result column="" property=""/>
</resultMap>
<select id="getUserList" resultMap="UserMap"> // 修改返回標籤為resultMap,定義一個名稱
select * from mybatis.user
</select>
3. 日誌
1. 日誌工廠
之前用sout和debug
Setting標籤中,使用logImpl標籤
2. STDOUT_LOGGING 標準日誌輸出
在setting中新增
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
3. Log4j 日誌
不是標準的包,需要匯入。
- 可以控制日誌資訊輸送的目的地,
- 可以控制輸出格式,
- 可以定義日誌資訊的級別,
- 可以使用配置檔案靈活配置,不需要修改應用程式碼。
-
匯入maven依賴,選2012May版本 1. 2
-
resources資料夾下新增log4j.properties檔案,配置日誌輸出設定
#將等級為DEBUG的日誌資訊輸出到console和file這兩個目的地,console和file的定義在下面的程式碼 log4j.rootLogger=DEBUG,console,file #控制檯輸出的相關設定 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.olog4j.appender.console.Threshold=DEBUG log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #檔案輸出的相關設定 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/roy.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日誌輸出級別 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
-
mybatis-config.xml 檔案中的setting標籤中設定日誌型別
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
4. 簡單使用
在要輸出日誌的類中定義屬性:(匯入的包一定是import org.apache.log4j.Logger;
)
static Logger logger = Logger.getLogger(UserMapperTest.class);
在@Test的方法中輸出日誌:可以設定不同的等級。
logger.info("info進入");
logger.debug("debug入");
logger.error("error進入");
4. 分頁實現
1. Limit
sql中:
select *from User
limit 0,2
UserMapper.java介面:
List<User> getUserByLimit(Map<String, Integer> map);
UserMapper.xml介面實現類:
<select id="getUserByLimit" parameterType="map" resultType="com.roy.pojo.User">
select * from mybatis.user limit #{startIndex}, #{pageSize}
</select>
測試:
@Test
public void testGetUserByLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex", 0);
map.put("pageSize", 3);
List<User> userList = userMapper.getUserByLimit(map);
for(User user: userList){
System.out.println(user);
}
sqlSession.close();
}
2. RowBounds(瞭解)
3. PageHelper外掛
自己下載匯入maven配置,匯入plugin配置