框架的概念:java
應用程序的半成品;mysql
提供可用的公用結構;程序員
按必定規則組織的一組組件;sql
主流框架的介紹:數據庫
Struts 2框架:apache
Struts 2以WebWork優秀的設計思想核心,吸取了Struts框架的部分優勢,提供了一個更加整潔的MVC設計模式實現的Web應用程序框架。它引入了幾個新的框架特性:從邏輯中分離出橫切關注點的攔截器,減小或者消除額配置文 件,貫穿整個框架的強大表達式語言,支持可變動和可重用MVC模式的標籤API等。Struts 2充分利用了其餘MVC框架學到的經驗和教訓,使整個框架更加清晰,更加靈活。編程
Hibernate框架:設計模式
Hibernate是一個優秀的持久化框架,負責簡化將對象數據庫保存到數據庫中,或從數據庫中讀取數據並封裝到對象的工做。Hibernat經過簡單配置和編程便可替代JDBC煩瑣的程序代碼。Hibernate已經成爲當前主流的數據庫持久化框 架,被普遍應用。緩存
Spring框架:安全
Spring也是一個開源框架。它的目標是使現有的javaEE技術更容易使用和促進的編程習慣。它是一個輕量級的框架,滲透了javaEE技術的方方面面。它主要做爲依賴注入容器和AOP實現存在,仍是提供了聲明式事務,對DAO層的支 持等簡化開發的功能。Spring還能夠很方便地與SpringMVC,Struts2,mybatis,Hibernate等框架集成,其中大名鼎鼎的SSM集成框架指的就是基於SpringMVC+Spring+mybatis的技術框架,使用這個集成框架將使咱們的應用程序更 加健壯,穩固,輕巧和優雅,這也是當前最流行的java技術框架。
SpringMVC框架:
SpringMVC是Spring框架提供的構建Web應用程序的全功能MVCC模塊,屬於SpringFramework的後續產品,已經融合在Spring Web Flow裏面,是結構最清晰的MVC Model2的實現。而且擁有高度的可配置性,支持多種視圖的技術。 還能夠進行定製開發,至關靈活。此外,Spring整合SpringMVC能夠說是天縫集成,是一個高性能的架構模式。如今愈來愈普遍地應用於在互聯網的開發中。
MyBatis框架:
MyBatis是一個優秀的數據庫持久化層框架,在實體類和SQL語句之間創建映射關係,是一種半自動化的ORM實現。其封裝性要低於Hibernate,性能優秀,而且小巧,簡單易學,如今應用也愈來愈普遍。
mybatis和Hibernate框架的區別
1.Hibernate是全自動化,而mybatis是半自動;
Hibernate 徹底能夠經過對象關係模型實現對數據庫的操做,擁有完整的JavaBean對象與數據庫的映射結構來自動生成SQL。而mybatis僅有基本的字段映射,對象數據庫以及對象實際關係仍然須要經過手寫SQL來實現和管理;
2.Hibernate數據庫移植性遠大於mybatis;
Hibernate經過強大的映射結構和SQL語言,大大下降了對象與數據庫(Oracle,mysql等)的耦合性,而mybatis因爲須要寫sql,所以與數據庫的耦合性直接取決於程序員寫sql的方法,若是sql不具通用性而用了不少某數據庫特性的sql 語句的話,移植性也會隨之下降不少,成本很高;
3.Hibernate擁有完整的日誌系統,mybatis則欠缺一些;
Hibernate日誌系統很是健全,涉及普遍,包括:sql記錄,關係異常,優化警告,緩存提示,髒數據警告等;而mybatis則除了基本記錄功能外,功能薄弱不少;
4.mybatis相比Hibernate須要關心不少細節;
Hibernate胚子要比mybatis複雜的不少,學習成本也比mybatis高,但也正由於mybatis使用簡單,才致使它要比Hibernate關心不少技術細節。mybatis因爲不用考慮很對細節,開發模式上於傳統JDBC區別很小,所以很容易上手開發項· 目,但忽略細節會致使項目前期bug較多,於是開發出相對穩定的軟件很慢,而開發軟件卻很快。Hibernate則正好與之相反。可是若是使用Hibernate很熟練的話,實際上開發效率絲絕不差於甚至超越mybatis。
5.sql直接優化上,mybatis要比Hibernate方便不少;
因爲mybatis的sql都是寫在xml裏,所以優化sql比Hibernate方柏霓不少。而Hibernate的sql不少都是自動生成的,沒法支架維護sql;雖有sql,但功能仍是不急sql強大,見到報表等變態需求時,hql也歇菜,也就是說hql是由侷限的; Hibernate雖然也支持原生sql,但開發模式上卻與orm不一樣,須要轉換思惟,所以使用上不是很是方便。總之寫sql的靈活度上Hibernate不急mybatis。
總結:
mybatis:小巧,方便,高效,簡單,直接,半自動;
hibernate:強大,方便,高效,負載,繞圈子,全自動;
Struts 2 框架和SpringMVC框架的區別
1.攔截機制不一樣
Struts2是類級別的攔截,每次請求就會建立一個Action,和Spring整合時Struts2的ActionBean注入做用域是原型模式prototype,而後經過setter,getter把request數據注入到屬性。Struts2中,一個Action對應一個request,response上 下文,在接受參數時,能夠經過屬性接收,這說明屬性參數是讓對個方法共享的。Struts2中Action的一個方法能夠對應一個url,而其餘類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了,只能設計多例。
SpringMVC是方法級別的攔截,一個方法對應一個Request上下文,因此方法直接基本上是獨立的,獨享request,response數據。而每一個方法同時又和一個url對應,參數的傳遞是直接注入到方法中,是方法所獨有的。處理結果經過 ModeMaop返回給框架。在Spring整合時,SpringMVC的Controller Bean默認單例模式Singleton,因此默認對全部的請求,只會建立一個Controller,又由於沒有共享的屬性,因此是線程安全的,若是要改變默認的做用域,須要添加 @Scope註解修改。
Struts2有本身攔截Interceptor機制,SpringMVC這是用的是獨立Aop方式,這樣致使Struts2配置文件量仍是比SpringMVC大。
2.底層框架的不一樣
Strurs2採用Filter(StrutsPrepareAndExecuteFilter)實現,SpringMVC(DispatcherServlet)則採用Servlet實現。Filter在容器啓動以後即初始化;服務器中止之後墜毀,晚於Servlet。Servlet在是在調用時初始化,先於Fileter調用, 服務器中止後銷燬。
3.性能方面
Struts2類級別的攔截,每次請求對應實例一個新的Action,須要加載全部的屬性值注入,SpringMVC實現了零配置,因爲SpringMVC基於方法的攔截,有加載一次單例模式bea注入。因此SpringMVC開發效率和性能高Struts2。
4.配置方面
SpringMVC和Spring是無縫的。從這個項目的管理和安全上也比Struts高。
MyBatis三大基本要素
➢ 核心接口和類
➢ MyBatis 核心配置文件(mybatis-config.xml)
➢ SQL 映射文件(mapper.xml)
MyBatis核心接口和類
一、每一個 MyBatis 的應用程序都以一個 SqlSessionFactory 對象的實例爲核心,SqlSessionFactory 對象實例能夠經過 SqlSessionFactoryBuilder 對象來得到。首先獲取 SqlSessionFactoryBuilder 對象,能夠根據 XML 配置文件或 Configuration 類的實例構建該對象。而後獲取 SqlSessionFactory 對象,有了 SqlSessionFactory 對象以後,就能夠進而獲取 Sqlsession 實例, Sqlsession 對象中徹底包含以數據庫爲背景的全部執行 SQL 操做的方法。能夠用該實例來 直接執行已映射的 SQL 語句。
二、根據 XML 配置文件構建 SqlSessionFactory 的實例很是簡單,建議使用。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //獲取 SqlSessionFactory 對象實例
SqlSession session = sqlSessionFactory.openSession(); //獲取 SqlSession 對象實例
try {
//業務邏輯代碼:如經過調用 session 對象的一系列 SQL 操做方法,對數據庫表執行 CRUD 操做
int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2); //方式 1
int count= session.getMapper(UserMapper.class).count(2); //方式 2:更簡單,代碼更安全,減小類型轉換錯誤(推薦使用)
} finally {
session.close(); //關閉 SqlSession
}
說明:
一、UserMapper mapper = session.getMapper(UserMapper.class); //獲取映射器實例 mapper
二、映射器是你建立綁定映射語句的接口,映射器接口的實例能夠從 SqlSession 中得到,映射器實例的最佳範圍是方法範圍。即它們應該在使用它們的方法中被請求,而後就拋棄掉。它們不須要明確地關閉。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder做用
SqlSessionFactoryBuilder 負責構建 SqlSessionFactory,而且提供了多個 build() 方法的重載,因爲方法參數 environment 和 Properties 均可覺得 null,那麼去除重複的,真正的重載方法其實只有以下三種:
build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)
經過上述分析,發現配置信息能夠以三種形式提供給 SqlSessionFactoryBuilder 的 build() 方法,分別是 InputStream(字節流)、 Reader(字符流)、 Configuration(類),因爲字節流與字符流都屬於讀取配置文件的方式,因此從配置信息 的來源就很容易想到構建一個 SqlSessionFactory 有兩種方式:讀取 XML 配置文件構造方式和編程構造方式。咱們採用讀取 XML 配置文件的方式來構造 SqlSessionFactory。
SqlSessionFactoryBuilder生命週期和做用域
SqlSessionFactoryBuilder 的最大特色是:用過即丟。一旦建立了 SqlSessionFactory 對象以後,這個類就再也不須要存在了,所以 SqlSessionFactoryBuilder 的最佳範圍就是存在於方法體內,也就是局部變量而已。即最佳範圍是方法 範圍 (本地方法變量)。
SqlSessionFactory
SqlSessionFactory 做用
SqlSessionFactory 簡單的理解就是建立 SqlSession 實例的工廠。全部的 MyBatis 應用都是以 SqlSessionFactory 實例爲中心, SqlSessionFactory 的實例能夠經過 SqlSessionFactoryBuilder 對象來得到。有了它以後,顧名思義,就 能夠經過 SqlSessionFactory 提供的 openSession() 方法來獲取 SqlSession 實例。
說明: openSession() 方法的參數爲 boolean 值時,若傳入 true 表示關閉事務控制,自動提交; false 表示開啓事務控制。若不傳入參數,默認爲 true。
openSession (
boolean
autoCommit)
openSession()
SqlSessionFactory 生命週期和做用域
SqlSessionFactory 對象一旦建立,就會在整個應用運行過程當中始終存在。沒有理由去銷燬或再建立它,而且在應用運行中也不建議屢次建立 SqlSessionFactory 。所以 SqlSessionFactory 的最佳做用域是 Application,即隨着應 用的生命週期一同存在。那麼這種 「存在於整個應用運行期間,而且同時只存在一個對象實例」 的模式就是所謂的單例模式(指在應用運行期間有且僅有一個實例)。即 SqlSessionFactory 的最佳範圍是應用範圍。
SqlSession
SqlSession做用
SqlSession 是用於執行持久化操做的對象,相似於 JDBC 中的 Connection 。它提供了面向數據庫執行 SQL 命令所需的全部方法,能夠經過 SqlSession 實例直接運行已映射的 SQL 語句。
SqlSession生命週期和做用域
正如其名, SqlSession 對應着一次數據庫會話。因爲數據庫會話不是永久的,所以 SqlSession 的生命週期也不該該是永久的。相反,在每次訪問數據庫時都須要建立它(注意:並非說在 SqlSession 裏只能執行一次 SQL,是徹底可 以執行屢次的,可是若關閉了 SqlSession ,那麼就須要從新建立它)。建立 SqlSession 的地方只有一個,那就是 SqlSessionFactory 對象的 openSession()方法。
須要注意的是:每一個線程都有本身的 SqlSession 實例, SqlSession 實例不能被共享,也不是線程安全的。所以最佳的做用域範圍是請求 request 範圍或者方法範圍。
關閉 SqlSession 是很是重要的。必需要確保 SqlSession 在 finally 語句塊中正常關閉。可使用下面的標準方式來關閉:
SqlSession session =sqlSessionFactory.openSession();
try{
//do work
}finally{
session.close(); //關閉 SqlSession
}
SqlSession兩種使用方式
//方式 1:經過 SQLSession 實例調用 selectList、selectOne 等方法來直接執行已映射的 SQL 語句。(不須要編寫 DAO 接口)
// MyBatis 經過 mapper 文件的 namespace 和子元素的 id 來找到相應的 SQL,從而執行查詢操做
userList=sqlSession.selectList("com.smbms.dao.UserMapper.getUserList");
說明:
一、com.smbms.dao.UserMapper.getUserList=namespace+id
二、使用方式一能夠不用寫接口中的方法,由於方式一直接執行映射文件的 SQL 語句。
三、執行 CRUD 操做,有參數傳遞時此方式不適用,應使用方式 2。
//方式 2:基於 mapper 接口方式操做數據。(官方推薦使用)
//建立綁定映射語句的接口 UserMapper.java,並提供接口方法 getUserList(),該接口稱爲映射器。
userList=sqlSession.getMapper(UserMapper.class).getUserList();
說明:
一、接口的方法必須與 SQL 映射文件中 SQL 語句的 id 一一對應。
二、第二種方式是經過 SQLSession 實例調用 getMapper(Mapper.class) 執行 Mapper 接口方法來實現對數據庫的查詢操做。
三、第一種方式是舊版本的 MyBatis 提供的操做方式,雖然如今也能夠正常工做,可是第二種方式是 MyBatis 官方所推薦使用的,其表達方式也更加直白。代碼更加清晰,類型安全,也不用擔憂易錯的字符串字面值以及強制類型轉換。
獲取SqlSession工具類(MyBatisUtil.java)
此 MyBatisUtil.java 文件是優化後獲取 SqlSession ,關閉 SqlSession 的公用工具類。
package cn.mybatis.util;
import java.io.IOException;
import java.io.InputStream;
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 MyBatisUtil {
private static SqlSessionFactory sessionFactory;
static{//在靜態代碼塊下,sessionFactory 只會被建立一次
try {
//讀取 mybatis-config.xml 文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//建立SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
//利用SqlSessionFactoryBuilder對象 去構建sessionFactory工廠
sessionFactory = sessionFactoryBuilder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//建立sqlSession
public static SqlSession getSqlSession(){
//利用sessionFactory工廠對象去生產sqlSession
SqlSession sqlSession = sessionFactory.openSession(false);//false表明不會自動提交事務,true 表明自動提交事務
return sqlSession;
}
//關閉sqlSession
public static void close(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
MyBatis的基本要素——核心配置文件
MyBatis 核心配置文件( mybatis-config.xml),該文件配置了 MyBatis 的一些全局信息,包含數據庫鏈接信息和 MyBatis 運行時所需的各類特性,以及設置和影響 MyBatis 行爲的一些屬性。
mybatis-config.xml文件結構
mybatis-config.xml 文件需配置一些基本元素,須要注意的是,該配置文件的元素節點是有前後順序的,其層次結構以下圖:
說明:
一、從上圖中能夠看出,configuration 元素是整個 XML 配置文件的根節點,其角色就至關因而 MyBatis 的總管, MyBatis 全部的配置信息都會存放在它裏面。 MyBatis 還提供了設置這些配置信息的方法。 Configuration 可從配置 文件裏獲取屬性值,也能夠經過程序直接設置。Configuration 可供配置的內容以下。
二、mybatis-config.xml 文件的元素節點是有必定順序的,節點位置若不按順序排位,那麼 XML 文件會報錯
jdbc.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///smbms
user=root
password=123
mybatis-config.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="jdbc.properties"></properties>
<!-- 環境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 數據庫鏈接相關配置 ,這裏動態獲取config.properties文件中的內容-->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- mapping文件路徑配置 -->
<mappers>
<mapper resource="com/mybatis/Dao/UserMapper.xml"/>
<!-- 若是沒有UserMapper.xml文件 就須要如下操做 要在對應的接口中寫註釋方法 -->
<!--<mapper class="com.mybatis.Dao.UserMapper"></mapper>-->
</mappers>
</configuration>
小配置文件(名稱必須與Dao接口名相同)
<?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爲映射的根節點,namespace指定Dao接口的完整類名
mybatis會依據這個接口動態建立一個實現類去實現這個接口,
而這個實現類是一個Mapper對象-->
<mapper namespace="com.mybatis.Dao.UserMapper">
<!-- parameterType:參數類型
resultType:返回的結果類型
id:對應Dao接口的方法-->
<select id="getOne" resultType="com.mybatis.entity.User">
SELECT * FROM smbms_user
</select>
<delete id="del" parameterType="int" >
DELETE FROM smbms_user WHERE id=#{id}
</delete>
<insert id="add" parameterType="com.mybatis.entity.User" >
INSERT INTO smbms_user(userCode,userName,userPassword,gender,birthday,phone,address,userRole,createdBy,creationDate)
VALUES (#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate})
</insert>
<update id="update" parameterType="com.mybatis.entity.User">
UPDATE smbms_user SET userCode=#{userCode} WHERE id=#{id}
</update>
</mapper>
接口中實現註解方式編寫SQL
若是不想編寫小配置文件需編寫註釋
使用註解測試SQL