使用Mapper.xml和Mapper接口開發


編寫工具類獲取sqlsession

使用Mybatis的API來創建一個工具類,通過mybatis配置文件與數據庫的信息,得到Connection對象

public class MybatisUtil {
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sqlSessionFactory;

    //加載配置文件 mybatis.xml
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    //禁止外界通過new創建
    private MybatisUtil() {}

    //獲取 SqlSession
    public static SqlSession getSqlSession() {
        //從當前線程中獲取 SqlSession 對象
        SqlSession sqlSession = threadLocal.get();
        // 如果獲取的SqlSession為空,則從已初始化的sqlSessionFactory中獲取
        if (sqlSession == null) {
            sqlSession=sqlSessionFactory.openSession();
            //將SqlSession對象與當前線程綁定
            threadLocal.set(sqlSession);
        }
        return sqlSession;
    }

    //關閉 SqlSession,並解除與當前線程綁定
    public static void closeSqlSession(){
        //從當前線程獲取 SqlSession 對象
        SqlSession sqlSession=threadLocal.get();
        // 如果獲取到的 SqlSession不為空,則關閉,並解除與當前線程的綁定,讓GC盡早回收
        if(sqlSession!=null){
            sqlSession.close();
            threadLocal.remove();
        }
    }
   
}

創建實體類POJO

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Cities {
    private int id;
    private String city;
    private String province;
    private String country;
}

編寫Mapper接口(DAO)

public interface CitiesMapper {
    void insert(Cities cities) throws Exception;
    Cities selectById(int id) throws Exception;
}

Mybatis配置文件

數據庫屬性文件

resources下創建數據庫屬性文件db.properties,配置數據庫的地址及賬號密碼

mysql.driver = com.mysql.jdbc.Driver
mysql.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
mysql.usercity = root
mysql.password = 123456

mybatis配置文件

resources下創建mybatis的配置文件mybatis.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="mysql_dev">

        <!-- 連接環境信息,設置一個任意唯一的id -->
        <environment id="mysql_dev">
            <!-- mybatis使用jdbc事務管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使用連接池方式獲取連接 -->
            <dataSource type="pooled">
                <!-- 配置連接數據庫的4個必要屬性,從db.properties中獲取 -->
                <property city="driver" value="${mysql.driver}"/>
                <property city="url" value="${mysql.url}"/>
                <property city="usercity" value="${mysql.usercity}"/>
                <property city="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 關聯 實體類與表的映射文件,resource為映射文件全路徑名稱 -->
    <mappers>
        <mapper resource="mappers/CitiesMapper.xml"/>
    </mappers>

</configuration>

實體與表的映射文件Mapper.xml

resources下創建一個文件夾mappers(所有映射文件統一管理),在mappers下創建實體與表的映射關系文件CitiesMapper.xml

<?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">

<!-- cityspace是命名空間,為Mapper接口的全限定名-->
<mapper cityspace="mybatis_test.CitiesMapper">
    <!-- resultMap標簽:映射實體類與表
         type屬性:表示實體類全路徑名
         id屬性:為實體類與表的映射取一個任意且唯一的名字
    -->
    <resultMap id="citiesMap" type="mybatis_test.Cities">
        <!-- id標簽:映射表的主鍵
         result標簽:映射表的非主鍵字段
         property:實體類的屬性名
         column:表的字段名
        -->
        <id column="id" property="id"/>
        <result column="city" property="city"/>
        <result column="province" property="province"/>
        <result column="country" property="country"/>
    </resultMap>
    <!-- 在mybatis中使用 #{} 作為占位符,#{} 實際就是調用的get()
         parameterType為DAO層(Mapper接口)的方法指定傳入參數類型,為實體類全路徑
    -->
    <insert id="insert" parameterType="mybatis_test.Cities">
        insert into cities values(#{id},#{city},#{province},#{country});
    </insert>
</mapper>

通過Mapper接口執行Sql

Mybatis中的事務是默認開啟的,因此我們在完成操作以后,需要我們手動去提交事務!

public class CitiesTest {
    @Test
    public void testInsert(){
        Cities cities=new Cities(2,"mianyang","chengdu","cn");
        //得到連接對象
        SqlSession sqlSession= MybatisUtil.getSqlSession();
        //傳入 Mapper接口類,獲取Mapper接口的代理對象
        CitiesMapper citiesMapper=sqlSession.getMapper(CitiesMapper.class);
        try {
            //執行Mapper接口的方法,實際為調用xml映射文件對應的sql(Mapper.xml的命令空間.SQL執行動作的id 調用對應的映射文件中的SQL)
(實際為調用sqlSession.insert())
citiesMapper.insert(cities); //Mybatis中的事務默認開啟,需要手動commit sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); //出現異常回滾 sqlSession.rollback(); }finally { //關閉sqlSession MybatisUtil.closeSqlSession(); } } }

文件結構

 

  • 實體類POJO Cities和 Mapper接口類(DAO) CitiesMapper 在同一包下

  • 數據庫配置文件db.properties和mybatis配置文件mybatis.xml都放在resources下


免責聲明!

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



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