Day1 Mybatis初識(一)
阿新 • • 發佈:2018-01-31
定義 gen 細節 manager mapping out 開發效率 導入jar 工廠
框架
將重復的,繁瑣的代碼實現封裝,讓程序員將更多的精力放在業務的理解和分析上。
框架的作用
提高開發效率
隱藏細節
三大框架SSH --> SSM
1) 表述層: 用戶交互 servlet SpringMVC/Struts2
2) 業務邏輯層:業務處理 javabean/ejb Spring
3) 數據持久層:數據庫交互 jdbc Mybatis/Hibernate
傳統JDBC的不足
1) 四個參數的使用有硬編碼(配置文件)
2) statement的使用中有硬編碼
3) 頻繁打開和關閉連接(數據源(連接池))
Mybatis框架
MyBatis 是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。
Mybatis是一個優秀的ORM框架。
ORM:Object Relationship Mapping(對象關系映射)
Mybatis不需要開發人員過多關註數據庫的連接關閉,stmt對象的創建;著重關註sql。
關註映射: 輸入參數 和 輸出結果。
1) mybatis下載
apache ibatis前身。
google code à Mybatis
github
2) https://github.com/mybatis/mybatis-3/releases
Mybatis的開發
1)配置文件 (xml)
a)xfg.xml:核心配置文件(全局配置文件)
連接信息的配置(連接池),事務管理
b) mapper.xml:映射文件
2) SqlSessionFactory:session工廠
3)SqlSession:面向程序員的接口(增刪改查)
4)搭建
a) 創建java項目,導入jar
b)配置核心配置文件(xml)
核心配置文件:
<!-- DTD:定義/約束 --> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- Mybtais核心配置文件:任何的地方都可以獲取 --> <configuration> <!-- environments:環境集合(mysql/oracle) default:默認(環境的id) --> <environments default="development"> <!-- environment:代表一個環境 id:唯一標識 transactionManager:事務管理器(管理事務) type:jdbc dataSource:數據源(連接池) 連接池:當項目啟動,向數據庫請求初始化連接數條連接放置在連接池中管理; 當連接的請求多於初始化連接數,此時會根據步長來增加連接數(創建連接); 最大不超過最大連接數,人就不夠時需要根據超時時間進行等待; 當連接的請求遠低於當前的連接數,此時會根據最小連接數釋放相應的連接。 好處:減少了連接的頻繁關閉。 缺點:連接需要占用資源 必須配置四個參數 driver url username password 流行的數據源:DBCP C3P0 DROID type="POOLED"("池") --> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///bd1711"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <mapper resource="BookMapper.xml"/> </mappers> </configuration>
mapper映射文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mapper:描述對象和記錄之間的映射關系 namespace:隔離sql,在mapper代理時由特殊用法 --> <mapper namespace="com.lee"> <!-- 查詢的映射: (Statement對象) id:該標簽的唯一標識 resultType:結果類型 (輸出結果的映射) #{}:代表占位符 parameterType:輸入參數類型(輸入參數的映射)(可省略) --> <select id="selectBook" resultType="entity.Book"> select * from book where bid = #{bid} </select> </mapper>
測試代碼
//加載配置文件為流
InputStream is = Resources.getResourceAsStream("Mybatis.xml");
//創建SqlSessionFactory(加載)
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//核心接口(發送增刪改查語句)
SqlSession session = ssf.openSession();
Book book = session.selectOne("com.lee.selectBook", 1);
System.out.println(book);
//釋放資源
session.close();
配置詳解
核心配置文件
? properties <!-- 1.配置(動態替換) 1.1 java的屬性文件外部引入 resource="jdbc.properties" 1.2 property標簽中配置 當兩者沖突時,最終使用java的屬性文件的配置。 --> <properties resource="jdbc.properties"> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/> --> </properties> ? settings <!--2.settings 調整:影響整個Mybatis的行為 --> <settings> <!-- 緩存總開關: 默認true,開啟緩存 / false關閉緩存 --> <setting name="cacheEnabled" value="true"/> <!-- 延遲加載總開關: 默認false,默認是立即加載 / true延遲加載 --> <setting name="lazyLoadingEnabled" value="true"/> </settings> ? typealiases <!-- 3.別名 typeAlias:單一類型起別名 type:需要設置別名的全限定名稱 alias:別名 package:包 默認別名就是類型(首字母大小寫均可) --> <typeAliases> <!-- <typeAlias type="entity.Book" alias="book"/> --> <package name="entity"/> </typeAliases> ? typeHandlers: 類型處理器 ? objectFactory:對象工廠 ? enviroment <environment id="development"> <!-- 事務管理器: JDBC: 和JDBC使用同樣的提交和回滾策略 MANAGED:依賴於應用服務器上下文(context)的配置(必須在服務器上運行) --> <transactionManager type="JDBC"/> <!-- 數據源: c3p0,droid UNPOOLED:請求時連接,完畢時關閉 POOLED:連接池 JNDI:依賴於應用服務器(在上下文配置數據源,然後在java獲取上下文的引用從而獲取數據源) --> <dataSource type="POOLED"> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.user}"/> <property name="password" value="${db.pwd}"/> </dataSource> </environment> ? mappers <!-- 映射器 :作用 尋找映射文件,sql--> <mappers> <!-- 1.相對於src映射文件的相對路徑 --> <mapper resource="BookMapper.xml"/> <!-- 2.url:全路徑 --> <!-- 3.class:使用mapper接口的class --> <!-- 4.package:註冊整個包下所有的文件(mapper代理開發) --> </mappers>
映射文件
<!-- 1.使用二級緩存 --> <cache></cache> <!-- 2.引用其他命名空間緩存 --> <cache-ref namespace=""/> <!-- 3.實現復雜的類型封裝 --> <resultMap type="" id=""></resultMap> <!-- 4.可被重用的語句塊 --> <sql id="bookCols"> bid,bname,author,price </sql> 查詢: select (查詢一個,查詢所有,模糊查詢,分頁查詢) <!-- 模糊查詢 :缺陷 有sql註入的風險 / 但是使用不同字段作排序時必須使用 --> <select id="selectLike" resultType="book"> select * from book where bname like ‘%${value}%‘ </select> <!-- 分頁查詢 1.編寫類 2.map 3.rowbounds --> <select id="selectByPage" resultType="book" parameterType="map"> select * from book limit #{startRow},#{length} </select> <select id="selectByPage2" resultType="book"> select * from book </select> 增刪改:insert update delete 主鍵返回 <!-- 插入 主鍵返回(用於建立多表之間的關系) --> <insert id="insertBook" parameterType="book" useGeneratedKeys="true" keyProperty="bid"> insert into book(bname,author,price) values(#{bname},#{author},#{price}) </insert> <insert id="insertBook2" parameterType="book"> <selectKey keyProperty="bid" order="AFTER" resultType="int"> <!-- select LAST_INSERT_ID() --> <!-- select SEQ_BOOK.nextval from dual --> </selectKey> insert into book(bname,author,price) values(#{bname},#{author},#{price}) </insert>
Eclipse導入本地dtd約束
Day1 Mybatis初識(一)