視頻觀看地址:http://edu.51cto.com/course/14674.html?source=sohtml
以前咱們編寫jdbc模板類中使用屬性文件db.properties文件,在mybatis中也能夠這樣配置java
src目錄下創建一個db.properties文件sql
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>
接下來測試便可apache
是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的相似映射。 session
在mybatis中開啓駝峯命名mybatis
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
設置完畢後,咱們更改一個以前的sql,不採用別名的方式進行oracle
<select id = "selectAll" resultType="cn.org.kingdom.pojo.User"> select * from tb_user </select>
測試該方法,查看日誌app
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類型來搞定dom
每一個mapper文件中關於resultType,parameterType這樣的屬性寫全類名太麻煩,咱們能夠經過此屬性進行優化
在mybatis-config.xml中加入別名設置
單一設置:
<typeAlias type="cn.org.kingdom.pojo.User" alias="User"/>
掃描包設置:
<package name="cn.org.kingdom.pojo"/>
直接運行測試便可
類型處理器是在設置參數,以及從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 |
開發環境:開發人員平常開發的時候使用的環境
測試環境:測試人員測試的時候使用環境
預發佈環境:幾乎和線上環境如出一轍,在上線以前在進行一次測試。
生成環境:線上環境。正式的 java 程序運行的環境
MyBatis容許配置多個環境,好比說開發環境,測試環境,生成環境,可是在構建SqlSessionFactory時只能選擇一個,雖然這種方式也能夠作到很方便的分離多個環境,可是在實際場景下咱們是更多的使用Spring來管理數據源,作到環境的分離
既然 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>
四、映射器接口掃描包的方式
<mappers> <package name="org.mybatis.builder"/> </mappers>
在 mybatis 中 dao 層的接口名字不推薦使用Dao,而是修改爲Mapper,例如 UserDao 修改爲 UserMapper
因爲在 dao(mapper)的實現類中對 sqlsession 的使用方式很相似。mybatis 提供了接口的動態代理
1.將dao包更改命名爲cn.org.kingdom.mapper(可選)
2.將接口也改成xxMapper的形式(可選)
3.刪除全部的dao類實現類(必須)由於此時咱們是經過動態代理的方式來生成其操做類
4.將映射文件放在mapper包下,而且將該映射文件名更改成接口的名字.xml
namespace:
根標籤的 namespace 屬性稱爲名稱空間,若是但願使用 mybatis 經過的動態代理的接口,就須要 namespace 中的值,和須要對應的Mapper(dao)接口的全路徑一致
注意此時還須要保證咱們接口中的方法名和配置文件中的id名稱保持一致
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>