SQL映射器Mapper接口(MyBatis)


SQL映射器Mapper接口

  MyBatis基於代理機制,可以讓我們無需再寫Dao的實現。直接把以前的dao接口定義成符合規則的Mapper。

   注意事項:

  1.接口必須以Mapper結尾,名字是DomainMapper

  2.mapper.xml文件要和Mapper接口建立關系,通過namespace:要能連接到Mapper接口

  3.mapper.xml中寫查詢語句的標簽的傳入參數類型(parameterType)、返回結果類型(resultType)必須和mapper接口中對應方法的傳入參數類型和返回結果類型一致,id名字必須和mapper接口中的對應方法名保持一致。 

操作步驟:

1、 創建一個DomainMapper接口:直接定義方法(共用了xml配置方式接口+注解方式兩種)

注意:映射器Mapper接口,替換dao層,不用再寫mapper層(dao層)實現類;名字統一以Mapper結尾。

package cn.wang._02mapper.mapper;

import cn.wang._02mapper.domain.Product;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface ProductMapper {
   
    /**
     * 查詢一個商品:使用了接口+注解的方式 */
    @Select("select * from Product where id = #{id}")
    Product findOne(Long id);
    /**
     * 查詢所有商品:使用了xml配置方式 */
    List<Product> findAll();
}

 

2、 在mapper目錄(原dao目錄)下創建映射文件DomainMapper.xml(ProductMapper.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">
<!--
    這個Mapper的主要功能就是寫sql
    namespace:mapper接口的完全限定名,在mybatis映射器中是用來和映射器接口產生聯系,而不再是和domain實體類聯系
 -->
<mapper namespace="cn.wang._02mapper.mapper.ProductMapper">
    <!--
        sql的id:mapper接口的對應方法名
        resultType和parameterType都和方法的參數和返回類型對應

        parameterType : 傳入的參數類型(原本應該用的是全限定名,這里用的是別名)  long:大Long  _long:小long (具體的對應請參見文檔)
        resultType : 返回的結果類型(每一條數據返回的對象類型) 自己的對象一定是全限定類名(這里寫的是別名)
                注意:xml配置方式和接口+注解方式兩種方式不能同時對同一sql操作使用
     -->
    <!--查詢一個-->
    <!--<select id="findOne" parameterType="long" resultType="cn.wang._02mapper.domain.Product">
        select * from product where id=#{id}
    </select>-->
    <!--查詢所有-->
    <select id="findAll" resultType="cn.wang._02mapper.domain.Product">
        select * from product
    </select>


</mapper>

 

3、在resources目錄下創建核心配置文件:

<?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>
    <!-- environments:環境集合
        default:默認使用哪一個環境(必須對應一個環境的id)
     -->

    <!--引入外部的屬性文件
        不寫classpath的原因:resources默認到classpath中尋找資源
    -->
    <properties resource="jdbc.properties" />

    <!--
        配置自定義別名
        注意:別名不區分大小寫。
           共兩種配置方式:
            一:一個一個配置(typeAlias)
                    type 類型的完全限定名
                    alias 別名
            二:統一為某個包下的所有類起別名(package)
                    name : 包名,別名就是類名(不區分大小寫)
    -->
    

    <environments default="development">
        <!--
            environment:一個環境  id:為這個環境取唯一一個id名稱
        -->
        <environment id="development">
            <!--
                transactionManager:事務管理(共有兩個值) type:JDBC(支持事務)/MANAGED(什么都不做)
            -->
            <transactionManager type="JDBC" />
            <!-- 數據源, 連接池  type(POOLED):MyBatis自帶的連接池
                     type="UNPOOLED" 不使用連接池
                    type="POOLED" 使用連接池
                    type="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代表的是相應的ORM映射文件 -->
    <mappers>
        <mapper resource="cn/wang/_02mapper/mapper/ProductMapper.xml" />
    </mappers>

</configuration>

MybatisUtils工具類

package cn.wang.Utils;

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 java.io.Reader;

public class MybatisUtils {
    //保證sqlSessionFactory是單例
    private static SqlSessionFactory sqlSessionFactory;

    // SqlSessionFactory類似於JPA的EntityManagerFactory,Hibernate的SessionFactory
    // SqlSession 類似於JPA的EntityManager,Hibernate的Session

    //該類被加載的時候就執行該靜態代碼塊
    static {
        try {
            Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {//異常的類型要寫大一些,才能夠看到具體的報錯
            e.printStackTrace();
        }
    }
    //提供一個外界調用的類
    public static SqlSession getSession(){
        //創建並返回SqlSession對象
        return sqlSessionFactory.openSession();
    }
    //關閉sqlSession,釋放資源(很重要,不然項目上線后會造成內存溢出)
    public static void colseSession(SqlSession sqlSession){
        if(sqlSession !=null){
            sqlSession.close();
        }
    }
}

jdbc.properties文件

 

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mysql數據庫名稱
jdbc.username=用戶名
jdbc.password=密碼

 

  可能遇到的錯誤:

 

    (1)namespace寫錯了,應該對應mapper接口的完全限定名。

    (2)Mapper映射文件忘記在核心配置文件中注冊了。

    (3)注冊的路徑也可能寫錯。

 


免責聲明!

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



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