1. 程式人生 > >Spring mvc 註釋 + ibatis 整合

Spring mvc 註釋 + ibatis 整合

Spring mvc+ibatis 整合:

Mvc 是當前最主流的框架之一。收到廣大開發者的熱烈追捧。我也是受影響的人之一。因此,決定在新的專案中,使用 spring mvc + mybatis 進行處理框架搭建。相對以前比較歡迎的SSI來說,缺少了struts2 的使用,自從上次struts的bug事件,導致現在我對struts還心有餘悸。這次使用spring代替struts也是有這方面的影響。

好了,廢話不多說,開始搭建環境。

網上各種翻閱資料,好多。但是大體上都是說,在spring mvc + mybatis 的時候,後臺新增一個sql語句,對應的就需要新增一個藉口!!!我去,這對愛偷懶的我,怎麼能受得了!繼續翻閱資料,檢視是否有有沒有什麼好的解決辦法。…… 好吧,我承認自己鑽研能力不是很好,各種想辦法都沒有找到解決方案。感覺mybatis 單獨為一個sql語句配置xml檔案也就罷了,還要配置藉口,這個我不能接受。想到前一段時間,使用ibatis,讓我想到了使用ibatis替代mybatis,有點倒退的感覺,但是能滿足我現在的需要。不管了,找資料,配置SI  框架。

Jar包預覽

首先,要匯入jar包,我太懶了, spring的依賴包全都放進去了。再加上其他的依賴包,結果就是如下圖所示了:


接上圖:

 

好吧,這是我整合成功之後用到的所有jar包,都在這裡了,其中有一個叫做aopallinacd-1.0.jar 這個包是必須的,少了它報錯,這個包可整死我了!!!

好了,jar包配置完了,就一步一步來,配置框架了。

Web.xml配置檔案

1)  配置web.xml

 <?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_3_0.xsd" 
         id="WebApp_ID" version="3.0">
  <display-name>GameOperators</display-name>
  <!-- 歡迎介面 -->
  <welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
   <!-- mvc 攔截配置 -->
   <servlet>
        <servlet-name>spring-mvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>  <!-- 這裡是配置mvc的攔截配置檔案,自己定義的,如果沒有設定,就是預設的,網上有相關資料 -->
        	<param-name>contextConfigLocation</param-name>  
        	<param-value>/WEB-INF/spring-servlet.xml</param-value>  
    	</init-param>  <!-- 觸發條件為1,表示在一開始的時候,載入啟動 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>  <!-- 表示攔截以 html 結尾的action請求 -->
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
          <!-- 防止亂碼方式,這是一下編碼格式 -->
    <filter>
	    <filter-name>characterEncodingFilter</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>
	</filter>
    <filter-mapping>
    	<filter-name>characterEncodingFilter</filter-name>
    	<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- spring配置,載入資料使用的 -->
    <listener>
 	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
  <context-param> <!-- spring的配置檔名字為 applicationContext.xml, 這裡制定路徑,為  專案中 (預設的) src下面 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext.xml</param-value>
  </context-param>
</web-app>

好了,web.xml檔案配置完成了,下面要配置 spring-mvc 檔案,這個是mvc的配置檔案,用於註釋使用,檔案的位置和名字要跟

<init-param> <!--這裡是配置mvc的攔截配置檔案,自己定義的,如果沒有設定,就是預設的,網上有相關資料 -->

        <param-name>contextConfigLocation</param-name> 

        <param-value>/WEB-INF/spring-servlet.xml</param-value> 

    </init-param

> <!--觸發條件為1,表示在一開始的時候,載入啟動 -->

對應起來,否則,找不到檔案就報錯了。

Sping-servlet.xml mvc配置檔案

1)  spring-servlet.xml mvc的配置檔案如下:

 <?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
     <!-- 啟動註解驅動的Spring MVC功能,註冊請求url和註解POJO類方法的對映-->  
     <mvc:annotation-driven /> 
     <!-- 要對映的包名,表示這裡所定義的包名,全都被可以被註釋使用。 --> 
	<context:component-scan base-package="com.zy.ywyd.gameoperators.action" />
    <context:component-scan base-package="com.zy.ywyd.gameoperators.service" />
    <context:component-scan base-package="com.zy.ywyd.gameoperators.dao" />
	<!-- 完成請求和註解POJO的對映 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="" p:suffix=".jsp" /> <!—定義了返回路徑,以及返回檔案的字尾。-->
</beans>

配置完成之後, spring 的mvc 的配置就差不多完成了,剩下的就是寫一個jsp測試介面和action的類了。

測試mvc的程式碼:

Jsp測試程式碼

Jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head>
<%
	String path = request.getScheme() + "://" + request.getServerName()
			+ ":" + request.getServerPort() + request.getContextPath()
			+ "/";
%>
<base href="<%=path%>" />
	<title>Spring 3.0 MVC Series: Index - ViralPatel.net</title>
</head>
<body>
	<a href="TestAction/helloWorld.html">Say Hello</a>
	<form method="POST" action="TestAction/helloWorld.html" id="test">
		<input type="text" name="name" id="name" value="321">
		<input type="submit">
	</form>
</body>
</html>

程式碼很簡單,這裡提交主要有兩種方式,一個是get 一種是post兩種。感覺應該包含了大部分的要求了。

Java程式碼

Java程式碼:

package com.zy.ywyd.gameoperators.action;
import java.io.IOException;
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.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.zy.ywyd.gameoperators.service.TestService;
@Controller
@RequestMapping("TestAction")
public class TestAction {
	@Autowired
	private TestService testS;
	@RequestMapping(value="helloWorld", method=RequestMethod.POST)
	public void helloWorld(HttpServletRequest request,HttpServletResponse response,
			@RequestParam String name) {
		String message = "Hello World, Spring 3.0!";
		System.out.println(testS.test());
		System.out.println(message);
		System.out.println(name);
		try {
			response.getWriter().write("11111");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		return new ModelAndView("/jsp/hello", "message", message);
	}
}

上面的有幾個註釋要說明一下:

@Controller:

1:spring mvc 中將 controller  認為是 MVC中的C --控制層

       2:規範命名 類名  xxxController 

      3:如果不基於註解:  該類需要繼承  CommandController   或者 其他很多 參見  spring幫助

           如果基於註解:在類名前  加上        @controller   

      4:補充:將類名前加上該註解,當spring啟動 或者web服務啟動  spring會自動掃描所有包(當然,這個可以設定)

        作用:  就是告訴伺服器  這個類是MVC中的C    這個類可以接收使用者請求   處理使用者請求

說白了就是定義介面想java類中的請求,類似struts中的action。只在controller中,也就是控制層使用。如果用到其他類裡面,也能使用,就是太亂了。

@RequestMapping:

定義名稱。負責跳轉使用的。TestAction/ helloWorld.html /前面的是類裡面的,helloword是方法中的。這樣跳轉方便。

@Autowired:

定義變數,只要在其他的類中,有用註釋定義類的,讓spring資源管理器處理的,用這個就能獲取到。

@RequestMapping(value="helloWorld",method=RequestMethod.POST)

這個在後面中,定義了請求方法。如果是非定義的請求方法,就找不到地方了。

Return返回, 定義好返回的jsp介面以及檔案就好了。

Ibatis整合

ApplicationContext-xml配置檔案

Ibatis整合:

配置application.xml檔案,用來定義資料來源。資料庫的訪問,整體上跟ibatis的方式差不多。

Application.xml

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
            
    <tx:annotation-driven transaction-manager="txManager" />
    
<!--     <import resource="com/zy/ywyd/gameoperators/dao/applicationContext-daoImpl.xml"/>  -->
	<!-- mySQL 資料庫配置 -->
	<bean id="mysqldataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	    <property name="preferredTestQuery" value="select 1"/> 
	    <property name="idleConnectionTestPeriod" value="18000"/>  
	    <property name="testConnectionOnCheckout" value="true "/>
	    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>  
	    <!-- 126測試      -->   
		<property name="jdbcUrl" value="jdbc:mysql://192.168.1.126:3306/databaseName"></property>   
		<property name="user"><value>user</value></property>
	    <property name="password"><value>password</value></property>    
	</bean>  
	
	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
        <property name="configLocation"><value>classpath:sql-map-config.xml</value> </property>
        <property name="mappingLocations">
	        <value>classpath:com/zy/ywyd/gameoperators/dao/*-ibatis.xml</value>
	    </property>  	    	      
   		<property name="dataSource"><ref bean="mysqldataSource" /></property>
    </bean>	 
</beans>

Sql-map-config.xml配置檔案

sql-map-config.xml 配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
 
 <sqlMapConfig>
  <settings useStatementNamespaces="true"/>
  	<sqlMap resource="ibates.xml"/>
 </sqlMapConfig>

Ibatis.xml配置檔案

Ibatis.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 
  "http://www.ibatis.com/dtd/sql-map-2.dtd">
 <sqlMap namespace="ibates11">
    <select id="list" resultClass="String">
	select top 1 PINGNAME from PingDao
    </select>
    <insert id="insert" parameterClass="map" >
        insert into PingDao values (#name#)
    </insert>
</sqlMap>

首先需要定義個dao基類,用來配置dao層的資料庫連線。程式碼如下:

package com.zy.ywyd.gameoperators.dao;

//import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.client.SqlMapClient;



@SuppressWarnings("deprecation")
public class Dao  extends  SqlMapClientDaoSupport {
    @Resource(name = "sqlMapClient")
    public SqlMapClient sqlMapClient;

    @PostConstruct
    public void initSqlMapClient() {
        super.setSqlMapClient(sqlMapClient);
    }
/*
	獲取查詢的物件
	public Object selectObject(Map<String,Object> parameter){
		return null;
	};
	獲取查詢的結果集
	public Object selectList(Map<String,Object> parameter){
		return null;
	}
	插入資料
	public Object insert(Map<String,Object> parameter){
		return null;
	}
	更新資料
	public Object update(Map<String,Object> parameter){
		return null;
	}
	刪除資料
	public Object delete(Map<String,Object> parameter){
		return null;
	}*/
}

然後定義分類 TestDao 程式碼如下:

package com.zy.ywyd.gameoperators.dao;

import org.springframework.stereotype.Component;

@Component
public class TestDao extends Dao {


	@SuppressWarnings("deprecation")
	public void getMsg(){
    	System.out.println("123aaaaaaaaaaaaaa");
    	System.out.println("TestDao-ibatis.test");
    	String msg = (String) this.getSqlMapClientTemplate().queryForObject("TestDao-ibatis.test");
    	System.out.println(msg);
    }
}

定義對應的xml 檔案

TestDao-ibatis.xml

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 
  "http://www.ibatis.com/dtd/sql-map-2.dtd">
 <sqlMap namespace="TestDao-ibatis">
	<select id="test" resultClass="String">
	    SELECT test FROM test limit 1,1
	</select>
</sqlMap>

最後就是中間的service 進行action和dao 的銜接。

package com.zy.ywyd.gameoperators.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zy.ywyd.gameoperators.dao.TestDao;

@Service
public class TestService {
	@Autowired
	private TestDao testD;
	
	@Autowired
	public String test(){
		System.out.println("test service");
		System.out.println("testD = " +testD);
		testD.getMsg();
		return "123456";
	}
}

以上是我在專案總,自己總結的。有不對的地方,還請指教,希望能給大家帶來幫助。  qq 2281879713  同時,希望通過技術跟大家作為好朋友