JavaWeb学习之路——SSM框架之Mybatis(二)
1.簡(jiǎn)介:
框架: 是整個(gè)或部分系統(tǒng)的可重用設(shè)計(jì),表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實(shí)例間交互的方法;另一種定義認(rèn)為,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架。前者是從應(yīng)用方面而后者是從目的方面給出的定義。它是一個(gè)半成品,一個(gè)框架是在一個(gè)給定的問題領(lǐng)域內(nèi),一個(gè)應(yīng)用程序的一部分設(shè)計(jì)與實(shí)現(xiàn)。
?
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫中的記錄。
整體項(xiàng)目框架圖:
2.導(dǎo)包
?
?
3.在src下新建全局配置文件(?編寫JDBC四個(gè)變量)
在全局配置文件中引入DTD或schema
Window->preferences->XML->XMLcatlog
新建xml文件為mybatis.xml,配置jdbc變量
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- default引用當(dāng)前環(huán)境的id --><environments default="default"><environment id="default"><!-- 使用事物進(jìn)行配置jdbc四個(gè)變量 --><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/likui"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments></configuration>?
4.新建以mapper結(jié)尾的包:在里面新建mapper.xml配置數(shù)據(jù)庫sql語句
? 編寫需要執(zhí)行的SQL命令,相當(dāng)于實(shí)現(xiàn)類
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.likui.mapper"><!-- id:方法名parameterType:定義參數(shù)類型如果方法返回時(shí)list,在resultType中寫list的類型,因?yàn)閙ybatis對(duì)jdbc封裝,一行一行讀取數(shù)據(jù)--><select id="selAll" resultType="com.likui.pojo.Flower">select * from?flower</select></mapper>對(duì)應(yīng)的Flower類:
package com.likui.pojo;public class Flower {private int id;private String name;private double price;private String production;public Flower(int id, String name, double price, String production) {super();this.id = id;this.name = name;this.price = price;this.production = production;}public Flower() {super();}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getProduction() {return production;}public void setProduction(String production) {this.production = production;}}數(shù)據(jù)庫表結(jié)構(gòu):
?
5.測(cè)試結(jié)果(只有在單獨(dú)使用mybatis時(shí)使用,最后在ssm中不需要)
mybatis可以自動(dòng)映射,將數(shù)據(jù)庫表中字段值名稱和類中實(shí)體名寫成一致形式
package com.likui.pojo;public class Mybatis {public static void main(String[] args) throws IOException {InputStream is = Resources.getResourceAsStream("mybatis.xml");//使用工廠設(shè)計(jì)模式SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//生產(chǎn)SqlSessionSqlSession session=factory.openSession();List<Flower> list = session.selectList("a.b.selAll");System.out.println("id\t\tname\t\tprice\t\tproduction");for (Flower flower : list) {System.out.println(flower.getId()+"\t\t"+flower.getName()+"\t\t"+flower.getPrice()+"\t\t"+flower.getProduction());}session.close();}}?
6.實(shí)現(xiàn)JDBC tomcat?Pool步驟
UNPOOLED– 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)只是每次被請(qǐng)求時(shí)打開和關(guān)閉連接。雖然有點(diǎn)慢,但對(duì)于在數(shù)據(jù)庫連接可用性方面沒有太高要求的簡(jiǎn)單應(yīng)用程序來說,是一個(gè)很好的選擇。 不同的數(shù)據(jù)庫在性能方面的表現(xiàn)也是不一樣的,對(duì)于某些數(shù)據(jù)庫來說,使用連接池并不重要,這個(gè)配置就很適合這種情形。UNPOOLED 類型的數(shù)據(jù)源僅僅需要配置以下 5 種屬性:
- driver?– 這是 JDBC 驅(qū)動(dòng)的 Java 類的完全限定名(并不是 JDBC 驅(qū)動(dòng)中可能包含的數(shù)據(jù)源類)。
- url?– 這是數(shù)據(jù)庫的 JDBC URL 地址。
- username?– 登錄數(shù)據(jù)庫的用戶名。
- password?– 登錄數(shù)據(jù)庫的密碼。
- defaultTransactionIsolationLevel?– 默認(rèn)的連接事務(wù)隔離級(jí)別。
- 作為可選項(xiàng),你也可以傳遞屬性給數(shù)據(jù)庫驅(qū)動(dòng)。要這樣做,屬性的前綴為“driver.”,例如:
- driver.encoding=UTF8
- 這將通過 DriverManager.getConnection(url,driverProperties) 方法傳遞值為?UTF8?的?encoding?屬性給數(shù)據(jù)庫驅(qū)動(dòng)。
POOLED– 這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對(duì)象組織起來,避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間。 這是一種使得并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求的流行處理方式。
JNDI?– 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個(gè) JNDI 上下文的引用。這種數(shù)據(jù)源配置只需要兩個(gè)屬性:
- initial_context?– 這個(gè)屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))。這是個(gè)可選屬性,如果忽略,那么 data_source 屬性將會(huì)直接從 InitialContext 中尋找。
- data_source?– 這是引用數(shù)據(jù)源實(shí)例位置的上下文的路徑。提供了 initial_context 配置時(shí)會(huì)在其返回的上下文中進(jìn)行查找,沒有提供時(shí)則直接在 InitialContext 中查找。
7.全局配置文件
<transactionManager/>
type屬性可選值 :
- JDBC – 這個(gè)配置就是直接使用了 JDBC 的提交和回滾設(shè)置,它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)作用域。
- MANAGED – 這個(gè)配置幾乎沒做什么。它從來不提交或回滾一個(gè)連接,而是讓容器來管理事務(wù)的整個(gè)生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)。 默認(rèn)情況下它會(huì)關(guān)閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設(shè)置為 false 來阻止它默認(rèn)的關(guān)閉行為。
數(shù)據(jù)源(dataSource)
dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對(duì)象的資源。
許多 MyBatis 的應(yīng)用程序會(huì)按示例中的例子來配置數(shù)據(jù)源。雖然這是可選的,但為了使用延遲加載,數(shù)據(jù)源是必須配置的。
有三種內(nèi)建的數(shù)據(jù)源類型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
?
*8.使用數(shù)據(jù)庫連接池:在內(nèi)存中開辟一塊空間,存放多個(gè)數(shù)據(jù)庫連接對(duì)象。JDBC?Tomcat?Pool,直接由tomacat產(chǎn)生數(shù)據(jù)庫連接池,有active、idle狀態(tài),使用數(shù)據(jù)庫連接池的目的,在高頻率訪問數(shù)據(jù)庫時(shí),使用數(shù)據(jù)庫連接池可以降低服務(wù)器系統(tǒng)壓力,提升程序運(yùn)行效率,適用于大型項(xiàng)目。
條件:lib下有數(shù)據(jù)庫驅(qū)動(dòng)文件、META-INF下context.xml文件、src下有serverlet文件
(1)在context.xml中設(shè)置數(shù)據(jù)連接的相關(guān)信息
<Context><Resource driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/likui"username="root" password="123456" maxActive="50" maxIdle="20" name="test"auth="Container" maxWait="10000"? type="javax.sql.DataSource"/></Context>?
(2)在src下新建serverlet文件,用于獲取數(shù)據(jù)庫連接信息并執(zhí)行
@WebServlet("/pool")public class Demoserverlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {try {Context cxt = new InitialContext();DataSource ds = (DataSource) cxt.lookup("java:comp/env/test");? //test是連接的名稱Connection conn = ds.getConnection();PreparedStatement ps = conn.prepareStatement("select * from flower");ResultSet rs = ps.executeQuery();res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();while(rs.next()){out.print(rs.getInt(1)+" "+rs.getString(2)+"<br/>");}out.flush();out.close();rs.close();} catch (NamingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}效果圖如下所示:
*9.三種查詢方式
(1)selectList():返回值為一個(gè)list類型,適用于遍歷查詢所有結(jié)果的需求
xmll配置文件 中:?
<select id="selAll" resultType="com.likui.pojo.Flower">select * from flower</select>java文件中:
List<Flower> list = session.selectList("a.b.selAll");System.out.println("id\t\tname\t\tprice\t\tproduction");for (Flower flower : list) {System.out.println(flower.getId()+"\t\t"+flower.getName()+"\t\t"+flower.getPrice()+"\t\t"+flower.getProduction());}(2)selectOne(),:返回值為一個(gè)object對(duì)象,適用于返回結(jié)果只是一個(gè)變量或一行數(shù)據(jù)時(shí)
xml配置文件中:
? <select id="selById" resultType="int">select count(*) from flower where id=1</select>java文件中:
int count=session.selectOne("a.b.selById");System.out.println(count);(3)selectMap():返回值時(shí)Map,適用于需求在查詢結(jié)果中通過某列值取得相應(yīng)值
xml配置文件 中:?
<select id="c" resultType="com.likui.pojo.Flower">select * from flower</select>Java文件中:
Map<Object,Object> map=session.selectMap("a.b.c", "name");System.out.println(map);注:帶*號(hào)為可選操作
?
總結(jié)
以上是生活随笔為你收集整理的JavaWeb学习之路——SSM框架之Mybatis(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 约塞夫环问题
- 下一篇: JavaWeb学习之路——SSM框架之M