spring4.1.3+springmvc+mybatis3.2.1整合

来源:http://www.cnblogs.com/qq347061329/archive/2016/09/21/5894636.html
-Advertisement-
Play Games

註意:這裡使用了mybatis3.2.1版本,剛開始用了3.4.1的版本,會報一個很奇怪的錯(java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljav ...


註意:這裡使用了mybatis3.2.1版本,剛開始用了3.4.1的版本,會報一個很奇怪的錯(java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;),換了這個包就好了

  1. 所需包,spring的jar包,mybatis的jar包,spring-mybatis.jar,資料庫連接的mysql-connection.jar,日誌的log4j.jar(33個包,如果用到了jstl還需要加入jstl包,36個)

  2. 在web.xml中添加spring的監聽,以及配置springmvc的核心文件。


<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name></display-name>

  <!-- spring文件的監聽 -->

   <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

  <!-- spring 載入配置文件的路徑 -->

  <context-param>

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

    <param-value>classpath:beans.xml</param-value>

  </context-param>  

  <!-- 配置springmvc核心控制器 -->

   <servlet>

        <servlet-name>spring</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

   </servlet>

    <servlet-mapping>

        <servlet-name>spring</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

    <!-- 加個過濾器,讓所有請求頁面的編碼方式都為utf-8 -->

<filter>

    <filter-name>CharEncodingFilter</filter-name>

    <filter-class>com.sram.filter.CharEncodingFilter</filter-class>

    <init-param>

     <param-name>encoding</param-name>

     <param-value>UTF-8</param-value>

    </init-param>

  </filter>

  

  <filter-mapping>

    <filter-name>CharEncodingFilter</filter-name>

    <!-- /*表示所有的請求都過濾 -->

    <url-pattern>/*</url-pattern>

  </filter-mapping>

  

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

至此,web.xml文件配置結束

  1. 在WEB-INF目錄添加spring-servlet.xml(ps:web.xml中配置的servlet核心名字叫spring,它就會去找叫spring-servlet.xml的springmvc配置文件)

配置如下:


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 

xmlns:mvc="http://www.springframework.org/schema/mvc"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:p="http://www.springframework.org/schema/p" 

    xmlns:context="http://www.springframework.org/schema/context"

    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.sram.controller"/>

<!-- 打開mvc驅動 -->

<mvc:annotation-driven />


    <bean 

      class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/WEB-INF/jsp/"/>

    <property name="suffix" value=".jsp"/>

</bean>

 

</beans>
  1. 在src目錄下添加spring的配置文件,beans.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: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 ">

 

<!-- 打開spring的Annotation -->

<context:annotation-config/>


<!-- 設置spring去哪些包中找Annotation -->

    <context:component-scan base-package="com.sram"/>

    

    

    <!-- 創建資料庫連接 -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" value="${jdbc.driverClassName}"/>

    <property name="url" value="${jdbc.url}"/>

    <property name="username" value="${jdbc.username}"/>

    <property name="password" value="${jdbc.password}"/>

</bean>


<!-- 引入src目錄下的jdbc.properties文件 -->

    <context:property-placeholder location="classpath:jdbc.properties"/>

    

<!-- 創建spring的SqlSessionFactory -->

<bean id="sqlSessionFactory" 

class="org.mybatis.spring.SqlSessionFactoryBean">

    <property name="dataSource" ref="dataSource"/>

     

    <!-- 載入實體類映射文件 -->

    <property name="mapperLocations" value="classpath:com/sram/model/*.xml"></property>

<!--  載入實體類對象 -->

<property name="typeAliasesPackage" value="com.sram.model"></property>

 </bean>

 

<!-- 配置spring的事務處理 -->

 <!-- 創建 事務管理器 -->

 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"></property>

 </bean>

 <!-- 配置aop,spring是通過aop進行事務管理 -->

 <aop:config>

    <!-- 設置在哪些方法中打開事務 -->

    <aop:pointcut id="allMethods" 

            expression="execution(* com.sram.dao.*.*(..))"/>

    <!-- 加入事務控制的具體位置 -->

    <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>

  </aop:config>


  <!-- 配置哪些方法要加入事務控制 -->

  <tx:advice id="txAdvice" transaction-manager="txManager">

    <tx:attributes>

     <!-- 所有方法加入事務 -->

     <tx:method name="*" propagation="REQUIRED"/>

    </tx:attributes>

  </tx:advice>

 

</beans>
  1. 數據源文件jdbc.properties內容如下

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/mybatis

jdbc.username=root

jdbc.password=root

  1. 日誌文件log4j.properties

log4j.rootLogger=INFO, stdout  

#log4j.logger.test=info  

#log4j.logger.org.apache.jasper = DEBUG  

#log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG  

#log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG  

#log4j.logger.com.fiscal = DEBUG  

#log4j.logger.com.system = DEBUG  

log4j.logger.com.ibatis = DEBUG  

log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG  

log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG  

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG  

log4j.logger.java.sql.Connection = DEBUG  

log4j.logger.java.sql.Statement = DEBUG  

log4j.logger.java.sql.PreparedStatement = DEBUG 

log4j.logger.java.sql.ResultSet = INFO  

log4j.appender.stdout=org.apache.log4j.ConsoleAppender   

#log4j.appender.fileout=org.apache.log4j.RollingFileAppender  

#log4j.appender.fileout.File=e:/log/ibatis.log   

#log4j.appender.fileout.MaxFileSize=10000KB   

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   

#log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n   

#log4j.appender.fileout.layout=org.apache.log4j.PatternLayout   

#log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n  

#log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout   

# log4j.logger.org=info 

配置文件結束 jdbc.propertise和log4j.propertise放在src根目錄下

  1. 下麵寫測試代碼
  • UserController.java

package com.tt.controller;



/**

 * Created by lx7ly on 9/17/16.

 */



import javax.annotation.Resource;



import com.tt.dao.IUserDao;

import com.tt.model.User;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;



@Controller("userController")

@RequestMapping("user")

public class UserController {



    private IUserDao userDao;



    @Resource

    public void setUserDao(IUserDao userDao) {

        this.userDao = userDao;

    }



    public UserController() {



    }



    @RequestMapping(value = "/users", method = RequestMethod.GET)

    public String list(Model model) {

        User u = userDao.loadById(1);

        System.out.println(u);

        //model.addAttribute("users", users);

        return "list";

    }

}
  • CharEncodingFilter.java

package com.tt.filter;



import javax.servlet.*;

import java.io.IOException;



/**

 * Created by lx7ly on 9/17/16.

 */

public class CharEncodingFilter implements Filter{

    private String encoding;



   public void destroy() {



   }



   public void doFilter(ServletRequest request, ServletResponse response,

         FilterChain chain) throws IOException, ServletException {



      request.setCharacterEncoding(encoding);

      //response.setCharacterEncoding(encoding);

      chain.doFilter(request, response);

   }



   public void init(FilterConfig config) throws ServletException {



      //config中保存這過濾器的配置信息,如果在web.xml中配置的過濾器編碼不是utf8,則改成utf8;

      String e = config.getInitParameter("encoding");

      if(e == null || e.equals("")) {

         encoding = "UTF-8";

      }

      else {

         encoding = e;

      }

   }

}
  • User.java

package com.tt.model;



/**

 * Created by lx7ly on 9/17/16.

 */

public class User {

    private int id;

    private String name;

    private String password;



    public User() {

    }



    public User(String name, String password) {

        super();

        this.name = name;

        this.password = password;

    }





    public User(int id, String name, String password) {

        super();

        this.id = id;

        this.name = name;

        this.password = password;

    }



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public String getPassword() {

        return password;

    }



    public void setPassword(String password) {

        this.password = password;

    }



    public int getId() {

        return id;

    }



    public void setId(int id) {

        this.id = id;

    }



    @Override

    public String toString() {

        return "User [id=" + id + ", name=" + name + ", password="

                + password + "]";

    }

}
  • User.xml

<?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.tt.model.User">



   <select id="load" parameterType="int" resultType="com.tt.model.User">

      select * from t_user where id = #{id}

   </select>



</mapper>
  • UserException.java

package com.tt.model;



/**

 * Created by lx7ly on 9/17/16.

 */

public class UserException extends RuntimeException {

    public UserException() {

        super();



    }



    public UserException(String message, Throwable cause,

                         boolean enableSuppression, boolean writableStackTrace) {

        super(message, cause, enableSuppression, writableStackTrace);



    }



    public UserException(String message, Throwable cause) {

        super(message, cause);



    }



    public UserException(String message) {

        super(message);



    }



    public UserException(Throwable cause) {

        super(cause);



    }

}
  • IUserDao.java

package com.tt.dao;



import com.tt.model.User;



/**

 * Created by lx7ly on 9/17/16.

 */

public interface IUserDao {

    void add(User user);



    void delete(int id);



    void update(User user);



    User loadById(int id);



    User loadByName(String username);



    User login(String username, String password);

}
  • UserDao.java

package com.tt.dao;



import com.tt.model.User;

import com.tt.model.UserException;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.springframework.stereotype.Repository;



import javax.annotation.Resource;



/**

 * Created by lx7ly on 9/17/16.

 */



@Repository("userDao")

public class UserDao implements IUserDao{

    private SqlSessionFactory sqlSessionFactory = null;



   @Resource

   public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {

      this.sqlSessionFactory = sqlSessionFactory;

   }



   public void add(User user) {



   }



   public void delete(int id) {



   }



   public void update(User user) {



   }



   @Override

   public User loadById(int id) {

      SqlSession sqlSession = null;

      User u = null;

      try{

         sqlSession = sqlSessionFactory.openSession();

         u = sqlSession.selectOne("com.tt.model.User.load", id);

      }finally{

         assert sqlSession != null;

         sqlSession.close();

      }

      return u;

   }



   public User loadByName(String username) {



      return null;

   }



   public User login(String username, String password) {

      User u = this.loadByName(username);

      if(u == null){

         throw new UserException("用戶不存在");

      }else if(!password.trim().equals(u.getPassword())){

         throw new UserException("密碼不對!!");

      }

      return u;

   }

}
  • IUserService.java

package com.tt.service;



import com.tt.model.User;



/**

 * Created by lx7ly on 9/17/16.

 */

public interface IUserService {



    User loadById(int id);

}

+ UserService.java



package com.tt.service;



import com.tt.dao.IUserDao;

import com.tt.model.User;

import org.springframework.stereotype.Service;



import javax.annotation.Resource;



/**

 * Created by lx7ly on 9/17/16.

 */

@Service("userService")

public class UserService implements IUserService{





    private IUserDao userDao;



    @Resource

    public void setUserDao(IUserDao userDao) {

        this.userDao = userDao;

    }



    @Override

    public User loadById(int id) {

        return userDao.loadById(1);

    }

}
  • UserServiceTest.java

package com.tt.service;



import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;



import javax.annotation.Resource;



/**

 * Created by lx7ly on 9/17/16.

 */

@RunWith(SpringJUnit4ClassRunner.class)       //表示繼承了SpringJUnit4ClassRunner類

@ContextConfiguration(locations = {"classpath:spring.xml"})

public class UserServiceTest {



    private IUserService userService;



    @Test

    public void testSetUserDao() throws Exception {



    }



    @Test

    public void testLoadById() throws Exception {

        System.out.println(userService.loadById(1));

    }



    @Resource

    public void setUserService(IUserService userService) {

        this.userService = userService;

    }



}
  • list.jsp

<%--

  Created by IntelliJ IDEA.

  User: lx7ly

  Date: 9/17/16

  Time: 5:34 PM

  To change this template use File | Settings | File Templates.

--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

  <head>

    <title>list.jsp</title>

  </head>

  <body>

    helloworld !! this is list.jsp

  </body>

</html>
  • ssm.sql

create database ssm;



use ssm;



create table t_user (id int primary key auto_increment, name varchar(20), password varchar(20));



insert into t_user(name, password) values ('root', 'root');

insert into t_user(name, password) values ('zhangsan', '123');

insert into t_user(name, password) values ('李四', '123');
  1. 測試spring+mybatis

  2. 測試spring+mybatis+springmvc

    url: http://127.0.0.1:8080/ssm/user/users


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用 PostMessage、SendNotifyMessage、SendMessageCallback 等非同步函數發送系統消息時,參數里不可以使用指針,因為發送者並不等待消息的處理就返回,接受者還沒處理指針就已經被釋放了。 5、在 Windows 2000/XP 里,每個消息隊列最多只能存放 10, ...
  • 題目:簡單主機批量管理工具 需求: 流程圖: Readme: ### 作者介紹: * author:lzl ### 博客地址: * http://www.cnblogs.com/lianzhilei/p/5881434.html ### 功能實現 題目:簡單主機批量管理工具 需求: 主機分組 登錄後 ...
  • 本文原創,轉載請註明:http://www.cnblogs.com/fengzheng/p/5889312.html 為什麼要有mybatis mybatis 是一個 Java 的 ORM 框架,ORM 的出現就是為了簡化開發。最初的開發方式是業務邏輯和資料庫查詢邏輯是分開的,或者在程式中編寫 sq ...
  • 在談Spring事務管理之前我們想一下在我們不用Spring的時候,在Hibernate中我們是怎麼進行數據操作的。在Hibernate中我們每次進行一個操作的的時候我們都是要先開啟事務,然後進行數據操作,然後提交事務,關閉事務,我們這樣做的原因是因為Hibernate預設的事務自動提交是false ...
  • 本節探討Java中的容器類ArrayList,它有哪些方法?內部是如何實現的?有什麼特點?與數組如何轉換?迭代是什麼?為什麼要有它?內部是如何實現的?有哪些易犯的錯誤?Collection/List/RandomAccess都用於什麼目的? ...
  • 1、需求 做一個項目會有很多模塊,主要是方便復用,通過各個模塊之間聚合。模塊也可以獨立出來,如公用類庫,也可以在做其它項目中使用。該文的實例會有兩個模塊:分別為dallin web模塊,dallin utils工具類模塊 2、新建一個Maven父項目 1. 打開IDEA工具,通過file——new— ...
  • 還記得那些美妙的夜晚嗎 你洗洗打算看一個小電影就睡了,這個時候突然想起來今天晚上是伺服器更新的日子,你要在凌晨時分去把最新的代碼更新到伺服器,以保證明天大家一覺醒來打開網站,發現昨天的 Bug 都不見了。這時候你瞬間沒有了看電影的興緻了,這應該就是一個運維人員的日常了吧! 為什麼要在凌晨時分去更新服 ...
  • 上面運行結果是 [49 50][51 50] 。 --> 結論: bytes.Buffer Reset之後,如果再寫入新的數據,如果數據的長度沒有超過Reset之前緩衝區的長度,那麼Buffer內部不會重新開闢記憶體,也就是說, 寫入的數據會覆蓋之前的數據。 在本例中,這裡【之前的數據】就是那個 b ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...