SQL映射器Mapper介面 MyBatis基於代理機制,可以讓我們無需再寫Dao的實現。直接把以前的dao介面定義成符合規則的Mapper。 註意事項: 1.介面必須以Mapper結尾,名字是DomainMapper 2.mapper.xml文件要和Mapper介面建立關係,通過namespace ...
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)註冊的路徑也可能寫錯。