自動化測試---mybatis的使用


mybatis如何實現了對數據庫的操作:

1.通過Resources.getResourceAsReader()或者 Resources.getResourceAsStream()加載mybatis.cfg.xml文件為InputStream 或者reader。

2.通過new SqlSessionFactoryBuilder.build()方法來創建一個SQLSessionFactory實例----工作過程是:通過調用build(InputStream or reader)方法---------此時,會通過一個XMLConfigBuilder的類中的parse()方法來獲得一個Configuration的對象傳遞給build--------------build方法變成build(Configration)-----創建出一個sqlSessionFactory對象

3.再通過SQLSessionFactory.open()方法來創建一個SqlSession對象,這個SqlSession就類似於我們JDBC中的Connection,通過這個才能跟數據庫交互。

 

下面來演示整個myBatis項目的創建過程(鏈接的是mysql數據庫):

創建maven項目,引入mybatis、mysql-Connector、log4j

為了提高代碼的可讀性,作者通常會分別建立beans(存放 成員與我們的數據庫字段一致的類),mapper(存放 接口方法和映射關系文件),tools(對外提供獲得SqlSession的方法)和service包(存放我們的測試類),下面是項目結構圖。

 

 

下面是作者的數據庫表結構:

准備工作完成,下面正式開始:

第一步:先創建一個與該數據庫字段對應的java對象:

package com.cj.mybatis.beans;

public class UserBean {

    
    private int id;
    private String username;
    private String password;
    private double account;

    //構造函數
    
    public UserBean( String username, String password, double account) {
        super();
        
        this.username = username;
        this.password = password;
        this.account = account;
    }
    
    public UserBean() {
        
    }

    
    //getter setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double getAccount() {
        return account;
    }

    public void setAccount(double account) {
        this.account = account;
    }

    
    //toString
    @Override
    public String toString() {
        return "UserBean [id=" + id + ", username=" + username + ", password=" + password + ", account=" + account
                + "]";
    }
    
    

}

第二步:創建我們的接口方法和映射配關系文件

下面是接口:

 package com.cj.mybatis.mapper;

import java.security.PublicKey;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.cj.mybatis.beans.UserBean;

public interface UserMapper {
    /**
     *增加用戶
     * @param user
     * @return
     * @throws Exception
     */
    public int insertUser(UserBean user) throws Exception;
    
    /**
     * 根據id來更新某用戶信息
     * @param user
     * @return
     * @throws Exception
     */
    
    public int updateUser(UserBean user) throws Exception;
    
    /**
     * 根據id來刪除數據
     * @param id
     * @return
     * @throws Exception
     */
    
    public int deleteUser(int id) throws Exception;
    
    /**
     * 根據id查詢用戶信息
     * @param id
     * @return
     * @throws Exception
     */
    public UserBean selectUserById(int id) throws Exception;
    
    /**
     * 查詢所有用戶信息
     * @return
     * @throws Exception
     */
    public List<UserBean> selectAllUser() throws Exception;
    
    

}

 

下面是映射關系文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cj.mybatis.mapper.UserMapper">
    <!-- 自定義結果集,自定義結果集是select語句返回時用的,下面的select語句 中必須指明對應的結果集id-->
    <resultMap id="userMap1" type="UserBean">
        <!-- 這里的id對應表的主鍵字段 -->
        <!-- <id property="id" column="id" javaType="java.lang.Integer"></id> -->

         <!-- 下面是對應表的其他字段-->
        <!-- <result property="username" column="username"
            javaType="java.lang.String"></result>
        <result property="password" column="password"
            javaType="java.lang.String"></result>
        <result property="account" column="account"
            javaType="java.lang.Double"></result> -->
    </resultMap>

    <!-- 在各種標簽中的id屬性必須和接口中的方法名相對應 , id屬性值必須是唯一的,不能夠重復使用。parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型 -->
    <!-- useGeneratedKeys:( 僅 對 insert 有 用 ) 這 會 告 訴 MyBatis 使 用 JDBC 的getGeneratedKeys 
        方法來取出由數據(比如:像 MySQL 和 SQLServer 這樣的數據庫管理系統的自動遞增字段)內部生成的主鍵。默認值: false。 -->
    <!--keyProperty: (僅對 insert有用)標記一個屬性, MyBatis 會通過 getGeneratedKeys或者通過 insert 
        語句的 selectKey 子元素設置它的值。默認:不設置。 -->
    <!--#{}中的內容,為占位符,當參數為某個JavaBean時,表示放置該Bean對象的屬性值 -->
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into user (username,password,account) values
        (#{username},#{password},#{account})
    </insert>

<!--下面使用的是動態sql,判斷字段是否為null,不為空才去賦值--> <update id="updateUser" parameterType="com.cj.mybatis.beans.UserBean"> update user set <if test="username != null"> username=#{username} </if> <if test="password != null"> ,password=#{password} </if> <if test="account != 0.0"> ,account=#{account} </if> where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <select id="selectUserById" parameterType="int" resultMap="userMap1"> select * from user where id=#{id} </select> <select id="selectAllUser" resultMap="userMap1"> select * from user </select> </mapper>

 

第三步:將我們的映射文件告知到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>
    <!-- 引入外部配置文件 -->
    <properties resource="mysql.properties"></properties>

    <!-- 為JAVA Bean起類別名 -->
    <typeAliases>
        <!-- 別名方式1,一個一個的配置 type中放置的是類的全路徑,alias中放置的是類別名 <typeAliase type="com.cy.mybatis.beans.UserBean" 
            alias="UserBean"/> -->
        <!-- 別名方式2,自動掃描,將JAVA類的類名作為類的類別名 -->
        <package name="com.cj.mybatis.beans" />
        
    </typeAliases>


    <!-- 配置mybatis運行環境 -->
    <environments default="cjbatis-claire2">
        <environment id="cjbatis-claire2">
            <!-- type=jdbc 代表使用JDBC的提交和回滾來管理事物 -->
            <transactionManager type="JDBC" />

            <!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC數據源連接池 -->
            <!-- UNPOOLED 表示不支持數據 源連接池 -->
            <!-- JNDI表示支持外部數據源連接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />

            </dataSource>
        </environment>
    </environments>

    <mappers>
    <!-- 當自己使用的是接口方法和Mapper.xml的方式時 ,這里是告知的是.xml的映射文件 -->
        <!-- 告知映射文件方式1,一個一個的配置 --> 
        <!-- <mapper resource="com/cj/mybatis/mapper/UserMapper.xml"/> -->
        <mapper class="com.cj.mybatis2.mapper.UserInterfaceFunction"/>
        <!-- 告知映射文件方式2,直接將包地址寫上,會自動去包里找 。如果要使用這種方式,必須要求接口名稱和映射文件名稱必須完全一樣才可以,否則報Invalid bound statement-->
        <package name="com/cj/mybatis/mapper"/>
    

    </mappers>

</configuration>

上面配置文件中引入了mysql的配置文件,將mysql的配置文件准備好:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://XXX.XXX.XXX.XXX:3306/game?autoReconnect=true&failOverReadOnly=false
jdbc.username=yourusername
jdbc.password=youpassword

為了方便打印日志信息,還需要配置log4j.properties

###根logger設置###
log4j.rootLogger = INFO,console,file

### 輸出信息到控制台###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.Threshold = warn 
log4j.appender.console.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss} method: %l----%m%n

###輸出INFO 級別以上的日志文件設置###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = E:/log/web.log
log4j.appender.file.Append = true
log4j.appender.file.Threshold = warn 
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} method: %l - [ %p ]----%m%n

 

第四步:准備一個DBtools類,來對外提供一個獲取SqlSession的方法:

package com.cj.mybatis.tools;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class DBTools {
    public static SqlSessionFactory SessionFactory;
    static {
        
        try {
            //加載mybatis的配置文件
            Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
        
            //構建sqlSession的工廠
            SessionFactory = new SqlSessionFactoryBuilder().build(reader);
        
        } catch (IOException e) {
            
            e.printStackTrace();
        }
    }
    
    //對外提供可以獲得sqlSession的方法
    public static SqlSession getSqlSession() {
        return SessionFactory.openSession();
    }

}

第五步:提供測試類,去執行增刪改查:

package com.cj.mybatis.service;

import java.util.Date;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.cj.mybatis.beans.ProductBean;
import com.cj.mybatis.beans.UserBean;
import com.cj.mybatis.mapper.ProductMapper;
import com.cj.mybatis.mapper.UserMapper;
import com.cj.mybatis.tools.DBTools;

public class UserService {
public static void main(String[] args) throws Exception {
    SqlSession session = DBTools.getSqlSession();
    
    UserMapper usermapper = session.getMapper(UserMapper.class);
    System.out.println("----------------");
    
    UserBean user3 = new UserBean();
    user3.setUsername("Claire6");//修改name字段
    //user3.setPassword("iiiiii");
    user3.setAccount(20.9);
    user3.setId(36);
    usermapper.updateUser(user3);// 修改的某條id值為36的數據
    session.commit();
    
    UserBean userBean = usermapper.selectUserById(36);
    System.out.println(userBean);
    
    


    
}
}

 

 

總結:

上面使用的是依賴映射實現的,在映射文件中修改sql來完成自己的測試。

其中的updateUser的sql使用 if實現了動態生成。在平時的測試當中,大多數時候並不會更新整條數據庫信息,所以建議掌握這一種。

 

 

下面介紹通過注解的方式,來使用mybatis(不需要映射文件的方式):

其他都是一樣的,只是不需要創建映射文件,接口方法中直接使用注解即可:

package com.cj.mybatis2.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.cj.mybatis.beans.UserBean;

public interface UserInterfaceFunction {
    
    @Insert("INSERT INTO t_user(username,`password`,account) VALUES(#{username},#{password},#{account})")
    public int add(UserBean user);
    
    
    @Delete("DELETE from t_user where id = #{id}")
    public int delete(int id);
    
    @Update("UPDATE t_user SET username=#{username},password=#{password},account=#{account} WHERE id =#{id}")
    public int update(UserBean user);
    
    @Select("SELECT * FROM t_user")
    public List<UserBean> select();
    
    @Select("SELECT * FROM t_user WHERE id=#{id}")
    public UserBean selectOne(int id);

}

 

注意:這種方式需要在mybatis的配置文件添加下面的語句:

<!-- 接口類的類全名 -->
<mapper class="com.cj.mybatis2.mapper.UserInterfaceFunction"/>

 
        
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM