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)看再多的書,還是動手去做吧,這樣理解的深刻。總有一天會熟悉它,時間的問題。