1. 程式人生 > >Mybatis 系列(1)—— JSP + Spring + Mybatis+Mysql 框架搭建

Mybatis 系列(1)—— JSP + Spring + Mybatis+Mysql 框架搭建

  小編也是忙裡偷閒的學會java,用吃飯和睡覺前的時間看完了一個Mybatis的介紹,手癢癢的就練了練,學習的時間也不長,兩天時間搭了一個框架,分享給大家。

  MyBatis 是支援普通 SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始對映,將介面和 Java 的POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。之前學過了Hibernate,最近抽空學習了一下Mybatis,在兩者直接做了簡單的對比。


【Hibernate與Mybatis簡單對比】



1.從查詢語句上的區別。


  之前用Hibernate開發,都是用封裝好的語句,完全沒有sql的影子,都是呼叫的方法。但是如果是一些稍微複雜的sql,Mybatis會是一個好的選擇。所以,從查詢效率上來說,對於簡單的查詢,建議用Hibernate封裝好的,這樣 可以節省很多時間,如果你不建議會返回全部欄位的話。。那麼大一些的專案,或許會用到複雜的sql語句,Mybatis動手寫還調整方便,看著也知道自己寫的是個啥,不錯的選擇。


2.從物件管理機制角度考慮。


  用Hibernate 是完整的物件/關係對映,它提供了物件狀態管理,使開發者不再需要理會底層資料庫系統的細節。這樣就是面向物件的方法把資料持久化到資料庫中,不用管資料庫裡面的欄位之類的內容。Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。

  resultMap是MyBatis中最強大的元素,你可以比使用JDBC呼叫結果集省掉90%的程式碼。也可以讓你做許多JDBC不支援的事。事實上,要寫一個等同類似與互動的對映的複雜的語句。可能要上千行的程式碼。ResultMap的目的,就是這樣簡單的語句而不需要多餘的結果對映。


3.快取機制。


  Hibernate中提供了兩級Cache,第一級別的快取是Session級別的快取,它是屬於事務範圍的快取。這一級別的快取由hibernate管理的,一般情況下無需進行干預;第二級別的快取是SessionFactory級別的快取,它是屬於程序範圍或群集範圍的快取。這一級別的快取可以進行配置和更改,並且可以動態載入和解除安裝,屬於多事務級別,要防止事務併發性。快取是以map的形式進行儲存的(key-id,value-object)。

  在Mybatis中,一級快取是基於 PerpetualCache(mybatis自帶)的 HashMap 本地快取,作用範圍為session,所以當session commit或close後,快取就會被清空。二級快取預設也是基於 PerpetualCache,但是可以為其制定儲存源。一級快取快取的是SQL語句,而二級快取快取的是結果物件。

  Hibernate的二級快取配置在SessionFactory生成的配置檔案中進行詳細配置,然後再在具體的表-物件對映中配置是那種快取。MyBatis的二級快取配置都是在每個具體的表-物件對映中進行詳細配置,這樣針對不同的表可以自定義不同的快取機制。




【JSP + Spring + Mybatis+Mysql 框架搭建】



1.建立一個web工程,引入需要的jar包,spring、mybatis和mysql


2.web.xml 配置 

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>MyBatis_Spring3_Jsp</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>
			org.springframework.web.context.ContextCleanupListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
 
</web-app></span>

3. mvc-dispatcher-servlet.xml 檔案配置

<span style="font-family:KaiTi_GB2312;font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

	<context:component-scan base-package="com.yihaomen.controller" />
	<mvc:annotation-driven />
	
	<mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>  
    <mvc:default-servlet-handler/>  
     
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

</beans>


</span>

4. spring applicationContext.XML檔案配置

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="utf-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"  
            default-autowire="byName" default-lazy-init="false"> 
    
 <!--本示例採用DBCP連線池,應預先把DBCP的jar包複製到工程的lib目錄下。 -->   
    <context:property-placeholder    location="classpath:/config/database.properties" />
        
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://127.0.0.1:3307/mybatis?characterEncoding=utf8" 
        p:username="root" p:password="123456"
        p:maxActive="10" p:maxIdle="10">
    </bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
    </bean>
    
     
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <!--dataSource屬性指定要用到的連線池--> 
     <property name="dataSource" ref="dataSource"/> 
     <!--configLocation屬性指定mybatis的核心配置檔案--> 
     <property name="configLocation" value="classpath:config/Configuration.xml" /> 
     <!-- 所有配置的mapper檔案 -->
     <property name="mapperLocations" value="classpath*:com/yihaomen/mapper/*.xml" />
  </bean> 
  
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     <property name="basePackage" value="com.yihaomen.inter" />     
  </bean>
</beans> </span>

5. 新增Mybatis的配置檔案configuration.xml

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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>
    <typeAliases> 
        <typeAlias alias="User" type="com.yihaomen.model.User"/>
        <typeAlias alias="Article" type="com.yihaomen.model.Article"/>  
    </typeAliases> 
	
	<mappers>
	    <mapper resource="com/yihaomen/mapper/User.xml"/>
	</mappers>
	
	
</configuration></span>

5. 編寫controller 類,model類 等

UserController類:

<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.yihaomen.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.yihaomen.inter.IUserOperation;
import com.yihaomen.model.Article;
import com.yihaomen.model.User;

@Controller
@RequestMapping("/article")
public class UserController {
    @Autowired
    IUserOperation userMapper;

    @RequestMapping("/list")
    public ModelAndView listall(HttpServletRequest request,HttpServletResponse response){
        List<Article> articles=userMapper.getUserArticles(1); 
        ModelAndView mav=new ModelAndView("list");
        mav.addObject("articles",articles);
        return mav;
	}
}
</span>
介面類:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.yihaomen.inter;

import java.util.List;

import com.yihaomen.model.Article;
import com.yihaomen.model.User;

public interface IUserOperation {
    
	public User selectUserByID(int id);
	public List<User> selectUsers(String userName);	
	public void addUser(User user);
	public void updateUser(User user);
	public void deleteUser(int id);
	
	public List<Article> getUserArticles(int id);
	
}
</span>

 user.xml(sql寫在這裡)
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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="com.yihaomen.inter.IUserOperation">

	
	<!-- 為了返回list 型別而定義的returnMap -->
	<resultMap type="User" id="resultListUser">
        <id column="id" property="id" />
        <result column="userName" property="userName" />
        <result column="userAge" property="userAge" />
        <result column="userAddress" property="userAddress" />
    </resultMap>
	

	<select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
	   select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article 
	          where user.id=article.userid and user.id=#{id}
	</select>
	

    
</mapper></span>


model類:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.yihaomen.model;

public class Article {
	
	private int id;
	private User user;
	private String title;
	private String content;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}

}
</span>

6. JSP

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test</title>
</head>
<body>
<c:forEach items="${articles}" var="item">  
        ${item.id }--${item.title }--${item.content }<br />
    </c:forEach>
</body>
</html>
</span>



執行效果:


【總結】

1)每個MyBatis應用程式主要都是使用SqlSessionFactory例項的,一個SqlSessionFactory例項可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置檔案或者一個預定義的配置類的例項獲得。用xml檔案構建SqlSessionFactory例項是非常簡單的事情。

2)看再多的書,還是動手去做吧,這樣理解的深刻。總有一天會熟悉它,時間的問題。