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
對應起來,否則,找不到檔案就報錯了。
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 同時,希望通過技術跟大家作為好朋友