MyBatis學習(三)

視頻觀看地址: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 數據庫兼容的 NUMERICBYTE
ShortTypeHandler java.lang.Short, short 數據庫兼容的 NUMERICSHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 數據庫兼容的 NUMERICINTEGER
LongTypeHandler java.lang.Long, long 數據庫兼容的 NUMERICLONG INTEGER
FloatTypeHandler java.lang.Float, float 數據庫兼容的 NUMERICFLOAT
DoubleTypeHandler java.lang.Double, double 數據庫兼容的 NUMERICDOUBLE
BigDecimalTypeHandler java.math.BigDecimal 數據庫兼容的 NUMERICDECIMAL
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 任何兼容的 NUMERICDOUBLE 類型,存儲枚舉的索引(而不是名稱)。
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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章