這片文章是對自己學習的總結,學習材料是Java EE互聯網輕量級框架整合開發 SSM框架(Spring MVC + Spring + Mybatis)和Redis實現。作者是楊開振,周吉文,梁華輝和譚茂華。電子工業出版社出版。
MyBatis簡介
MyBatis是用來管理數據庫資源的。傳統操作數據庫的方法比較繁瑣,大部分代碼用來連接和關閉數據庫,而真正的業務代碼只佔了其中很小的一部分。使用MyBatis之後,開發者就不用花太多時間去管理數據庫資源了,只需要專注於業務本身的代碼即可。比如我們定義一個UserDao的接口,裏面有findAll()方法用來查找所有用戶。
public interface UserDao{
public List<User> findAll();
}
傳統的寫法是定一個UserDaoImpl實現類實現findAll()方法,然後在業務層纔可以調用findAll方法,僞代碼如下所示
public class UserDaoImpl implements UserDao{
public List<User> findAll(){...}
}
public class UserServiceImpl implements UserService{
public List<User> findAll(){
return new UserDaoImpl().findAll();
}
}
其中UserDaoImpl中的findAll方法就必然會涉及到管理數據庫資源的代碼,數據庫的連接,關閉等操作。
如果我們使用Mybatis,就不需要寫UserDaoImpl的內容,不存在UserDaoImpl這個類,只需要寫一個配置文件,配置文件的關鍵內容如下所示
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
具體什麼意思先不用管,只需要注意其中的sql語句。使用Mybatis之後,我們就不用管數據庫的資源,只需要專注業務,也就是sql語句,select * from user。
數據庫真正的邏輯就寫在xml之中,那麼我們我們業務層調用持久層的函數就是下面這種寫法。
//先不管session是什麼,只要知道業務層怎麼調用持久層函數就行
SqlSession session = ctx.getBean("session");
List<User> users = userDao.findAll();
//對users進行一些操作
這寫法很簡單。
如何配置MyBatis
一般是在資源目錄下添加mybatis-config.xml用來專門配置mybatis信息。
首先要先引入mybatis。這段代碼基本固定了,以後版本升級的話可能會有一丁點不同。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
之後加入<configuration>標籤,mybatis的詳細配置信息放在其中,比如數據庫配置的信息,定義mysql語句的配置信息。
<configuration>
...
</configuration>
下面講解configuration裏的子標籤
- <environment>標籤
回想使用傳統的JDBC方法,第一件事是獲取Connection。而獲取連接資源需要的參數如下所示
driver = com.mysql.cj.jdbc.driver
url = jdbc:mysql://localhost:3306/mybatis
username = root
password = 1234
這四個參數是獲取Connection的必須參數,java語句很麻煩,但是使用Mybatis就比較容易,直接使用<environment>標籤就可以。<environments>裏就是定義數據庫的配置信息。
<environments default="mysql">
<environment id="mysql">
<!--配置事務類型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置數據源(連接池)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
enviromnets標籤下的其它標籤暫時不管。
現在數據庫資源就配置完成了,接下來就該是配置業務信息。
- <mappers>標籤
<mappers>標籤下只有一個子標籤<mapper>,示例如下。
<mappers>
<mapper resource="com/itheima/dao/UserDao.xml">
</mappers>
值得注意的信息就是resource,它的值表示之前配置的數據庫連接要應用在dao層的哪些類之中。
com.itheima.dao就是目錄名,在idea中我們放在resourceces之下,看下圖。
UserDao和UserDao.xml的路徑要“相對”一致。
那UserDao.xml的作用是什麼?前面我們提到Mybatis不需要寫UserDao接口的實現類也能實現功能,這是因爲具體的實現不是被定義在類中,而是被定義在UserDao.xml中。所以UserDao.xml和UserDao的路徑要“相對”一致。
接下這篇文章詳細說了UserDao.xml裏如何定義具體sql邏輯。
- <settings>標籤
settings是用來規範整個Mybatis行爲的。通過對一些鍵值對的設定,就可以改變Mybatis的行爲。比如說數據庫users表中有一列列名爲user_id,實體類User中對應的成員變量是userId。Mybatis默認是要將實體類的成員變量和數據庫屬性名嚴格對應。比如映射器配置中的語句是
<mapper>
<select id="com.itheima.dao.UserDao" resultType="com.itheima.domain.User">
select user_id as userId from users
</select>
</mapper>
我們必須把user_id重名名爲userId(和java實體內完全一樣),這樣才能將值賦給User類並返回。
但如果我們在<settings>中這樣設置。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
那系統會自動爲我們完成名稱轉化。數據庫中的user_id會自動轉成駝峯形式userId,user_name會自動轉成userName,這樣就簡化了工作量。
<!--自動駝峯轉換-->
<mapper>
<select id="com.itheima.dao.UserDao" resultType="com.itheima.domain.User">
select user_id from users
</select>
</mapper>
待續。。。。。。