視頻觀看地址:http://edu.51cto.com/course/14674.html?source=so
1、配置文件(mybatis-config.xml)
1.1、properties 屬性
之前我們編寫jdbc模板類中使用屬性文件db.properties文件,在mybatis中也可以這樣配置
src目錄下建立一個db.properties文件
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
db.username=scott
db.password=tiger
接下來需要在mybatis-config.xml文件中進行加載
<?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>
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
接下來測試即可
1.2、駝峯命名
是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。
在mybatis中開啓駝峯命名
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
設置完畢後,我們更改一個之前的sql,不採用別名的方式進行
<select id = "selectAll" resultType="cn.org.kingdom.pojo.User">
select *
from tb_user
</select>
測試該方法,查看日誌
DEBUG - Opening JDBC Connection
DEBUG - Created connection 532118459.
DEBUG - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb]
DEBUG - ==> Preparing: select * from tb_user
DEBUG - ==> Parameters:
DEBUG - <== Total: 4
User [userid=2, userName=張三, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
User [userid=3, userName=李四, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
User [userid=4, userName=王五, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
User [userid=5, userName=趙六, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
DEBUG - Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb]
DEBUG - Closing JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb]
DEBUG - Returned connection 532118459 to pool.
但是有的時候,我們的數據庫的列的命名和實體類沒有遵守駝峯命名,此時就需要我們後面講解resultMap類型來搞定
1.3、typeAliases
每個mapper文件中關於resultType,parameterType這樣的屬性寫全類名太麻煩,我們可以通過此屬性進行優化
在mybatis-config.xml中加入別名設置
單一設置:
<typeAlias type="cn.org.kingdom.pojo.User" alias="User"/>
掃描包設置:
<package name="cn.org.kingdom.pojo"/>
直接運行測試即可
1.4、類型處理器
類型處理器是在設置參數,以及從result中檢索值來匹配java數據類型,MyBatis提供了非常多的默認類型處理器,滿足我們的開發要求。不需要自定義
類型處理器 | Java 類型 | JDBC 類型 |
---|---|---|
BooleanTypeHandler |
java.lang.Boolean , boolean |
數據庫兼容的 BOOLEAN |
ByteTypeHandler |
java.lang.Byte , byte |
數據庫兼容的 NUMERIC 或 BYTE |
ShortTypeHandler |
java.lang.Short , short |
數據庫兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler |
java.lang.Integer , int |
數據庫兼容的 NUMERIC 或 INTEGER |
LongTypeHandler |
java.lang.Long , long |
數據庫兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler |
java.lang.Float , float |
數據庫兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler |
java.lang.Double , double |
數據庫兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler |
java.math.BigDecimal |
數據庫兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler |
java.lang.String |
CHAR , VARCHAR |
ClobReaderTypeHandler |
java.io.Reader |
- |
ClobTypeHandler |
java.lang.String |
CLOB , LONGVARCHAR |
NStringTypeHandler |
java.lang.String |
NVARCHAR , NCHAR |
NClobTypeHandler |
java.lang.String |
NCLOB |
BlobInputStreamTypeHandler |
java.io.InputStream |
- |
ByteArrayTypeHandler |
byte[] |
數據庫兼容的字節流類型 |
BlobTypeHandler |
byte[] |
BLOB , LONGVARBINARY |
DateTypeHandler |
java.util.Date |
TIMESTAMP |
DateOnlyTypeHandler |
java.util.Date |
DATE |
TimeOnlyTypeHandler |
java.util.Date |
TIME |
SqlTimestampTypeHandler |
java.sql.Timestamp |
TIMESTAMP |
SqlDateTypeHandler |
java.sql.Date |
DATE |
SqlTimeTypeHandler |
java.sql.Time |
TIME |
ObjectTypeHandler |
Any | OTHER 或未指定類型 |
EnumTypeHandler |
Enumeration Type | VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引) |
EnumOrdinalTypeHandler |
Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 類型,存儲枚舉的索引(而不是名稱)。 |
InstantTypeHandler |
java.time.Instant |
TIMESTAMP |
LocalDateTimeTypeHandler |
java.time.LocalDateTime |
TIMESTAMP |
LocalDateTypeHandler |
java.time.LocalDate |
DATE |
LocalTimeTypeHandler |
java.time.LocalTime |
TIME |
OffsetDateTimeTypeHandler |
java.time.OffsetDateTime |
TIMESTAMP |
OffsetTimeTypeHandler |
java.time.OffsetTime |
TIME |
ZonedDateTimeTypeHandler |
java.time.ZonedDateTime |
TIMESTAMP |
YearTypeHandler |
java.time.Year |
INTEGER |
MonthTypeHandler |
java.time.Month |
INTEGER |
YearMonthTypeHandler |
java.time.YearMonth |
VARCHAR or LONGVARCHAR |
JapaneseDateTypeHandler |
java.time.chrono.JapaneseDate |
DATE |
1.5、environments
開發環境:開發人員日常開發的時候使用的環境
測試環境:測試人員測試的時候使用環境
預發佈環境:幾乎和線上環境一模一樣,在上線之前在進行一次測試。
生成環境:線上環境。正式的 java 程序運行的環境
MyBatis允許配置多個環境,比如說開發環境,測試環境,生成環境,但是在構建SqlSessionFactory時只能選擇一個,雖然這種方式也可以做到很方便的分離多個環境,但是在實際場景下我們是更多的使用Spring來管理數據源,做到環境的分離
1.6、Mapper映射器
既然 MyBatis 的行爲已經由上述元素配置完了,我們現在就要定義 SQL 映射語句了。但是首先我們需要告訴 MyBatis 到哪裏去找到這些語句。 Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裏去找映射文件。你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。例如:
1.使用相對於類路徑的資源引用
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
2.使用完全限定資源定位符(URL)
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
3.使用映射器接口實現類的完全限定類名
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
4、映射器接口掃描包的方式
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
2、基於Mapper接口下的數據操作
2.1、概述
在 mybatis 中 dao 層的接口名字不推薦使用Dao,而是修改成Mapper,例如 UserDao 修改成 UserMapper
由於在 dao(mapper)的實現類中對 sqlsession 的使用方式很類似。mybatis 提供了接口的動態代理
2.2、動態代理的注意事項
1.將dao包更改命名爲cn.org.kingdom.mapper(可選)
2.將接口也改爲xxMapper的形式(可選)
3.刪除所有的dao類實現類(必須)因爲此時我們是通過動態代理的方式來生成其操作類
4.將映射文件放在mapper包下,並且將該映射文件名更改爲接口的名字.xml
namespace:
根標籤的 namespace 屬性稱爲名稱空間,如果希望使用 mybatis 通過的動態代理的接口,就需要 namespace 中的值,和需要對應的Mapper(dao)接口的全路徑一致
注意此時還需要保證我們接口中的方法名和配置文件中的id名稱保持一致
2.3、具體操作
mapper接口實現
package cn.org.kingdom.mapper;
import java.util.List;
import cn.org.kingdom.pojo.User;
public interface UserMapper {
public int insertUser(User vo) throws Exception;
public int updateUser(User vo) throws Exception ;
public int deleteUser(int userid) throws Exception ;
public User selectUserById(int userid) throws Exception ;
public List<User> selectAll() throws Exception;
public int getAllCounts() throws Exception ;
}
將mapper.xml文件複製到mapper包中,並且將該文件的名稱命名爲Mapper接口的名字.xml(UserMapper.xml)
修改mybatis-config.xml文件
<mappers>
<!-- <mapper resource="cn/org/kingdom/mapper/UserMapper.xml"/> -->
<package name="cn.org.kingdom.mapper"/>
</mappers>
測試類進行測試
package cn.org.kingdom.test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import cn.org.kingdom.mapper.UserMapper;
import cn.org.kingdom.pojo.User;
public class MyBatisTest01 {
SqlSessionFactory sqlSessionFactory = null ;
SqlSession sqlSession = null ;
UserMapper userMapper = null ;
@Before
public void setUp() throws Exception {
//加載資源
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void tearDown() throws Exception {
//關閉
sqlSession.close();
}
@Test
public void testInsertUser() {
User vo = new User("阿珂", "123456", 18, "女", new Date());
try {
userMapper.insertUser(vo);
//提交事務
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}
}
@Test
public void testUpdateUser() {
User vo = new User(7,"冰封戰神", "123456", 18, "男", new Date());
try {
userMapper.updateUser(vo);
//提交事務
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}
}
@Test
public void testDeleteUserById() {
int sid = 7 ;
try {
userMapper.deleteUser(sid);
//提交事務
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}
}
@Test
public void testSelectAll() throws Exception {
List<User> list = userMapper.selectAll();
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testGetCount() throws Exception{
int count = userMapper.getAllCounts() ;
System.out.println(count);
}
@Test
public void testFindUserById() throws Exception{
User user = userMapper.selectUserById(2);
System.out.println(user);
}
}
測試完成:
這裏需要大家注意:一定要保證mapper接口中的方法名和mapper.xml中的id名稱保持一致
mapper.xml中的namespace必須是mapper接口的全類名
<?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.org.kingdom.mapper.UserMapper">
<!--
id:保證唯一
-->
<select id="selectUserById" resultType="User">
select userid,user_name as userName,age,pwd,sex,birthday from tb_user where userid = #{userid}
</select>
<insert id="insertUser" parameterType="User">
insert into tb_user(userid,user_name,age,pwd,sex,birthday)
values(seq_user.nextval,#{userName},#{age},#{pwd},#{sex},#{birthday})
</insert>
<update id="updateUser">
update tb_user set user_name=#{userName},age=#{age},pwd=#{pwd},sex=#{sex},birthday=#{birthday}
where userid=#{userid}
</update>
<update id="deleteUser">
delete from tb_user where userid=#{userid}
</update>
<select id = "selectAll" resultType="User">
select *
from tb_user
</select>
<select id = "getAllCounts" resultType="int">
select count(1) from tb_user
</select>
</mapper>