MyBatis學習(三)

視頻觀看地址:http://edu.51cto.com/course/14674.html?source=sohtml

一、配置文件(mybatis-config.xml)

1.一、properties 屬性

以前咱們編寫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

1.二、駝峯命名

是否開啓自動駝峯命名規則(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

1.三、typeAliases

每一個mapper文件中關於resultType,parameterType這樣的屬性寫全類名太麻煩,咱們能夠經過此屬性進行優化

在mybatis-config.xml中加入別名設置

單一設置:

<typeAlias type="cn.org.kingdom.pojo.User" alias="User"/>

掃描包設置:

<package name="cn.org.kingdom.pojo"/>

直接運行測試便可

1.四、類型處理器

類型處理器是在設置參數,以及從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.五、environments

開發環境:開發人員平常開發的時候使用的環境

測試環境:測試人員測試的時候使用環境

預發佈環境:幾乎和線上環境如出一轍,在上線以前在進行一次測試。

生成環境:線上環境。正式的 java 程序運行的環境

MyBatis容許配置多個環境,好比說開發環境,測試環境,生成環境,可是在構建SqlSessionFactory時只能選擇一個,雖然這種方式也能夠作到很方便的分離多個環境,可是在實際場景下咱們是更多的使用Spring來管理數據源,作到環境的分離

1.六、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>

四、映射器接口掃描包的方式

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

二、基於Mapper接口下的數據操做

2.一、概述

在 mybatis 中 dao 層的接口名字不推薦使用Dao,而是修改爲Mapper,例如 UserDao 修改爲 UserMapper

因爲在 dao(mapper)的實現類中對 sqlsession 的使用方式很相似。mybatis 提供了接口的動態代理

2.二、動態代理的注意事項

1.將dao包更改命名爲cn.org.kingdom.mapper(可選)

2.將接口也改成xxMapper的形式(可選)

3.刪除全部的dao類實現類(必須)由於此時咱們是經過動態代理的方式來生成其操做類

4.將映射文件放在mapper包下,而且將該映射文件名更改成接口的名字.xml

namespace:

根標籤的 namespace 屬性稱爲名稱空間,若是但願使用 mybatis 經過的動態代理的接口,就須要 namespace 中的值,和須要對應的Mapper(dao)接口的全路徑一致

注意此時還須要保證咱們接口中的方法名和配置文件中的id名稱保持一致

2.三、具體操做

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>
相關文章
相關標籤/搜索