SSM Spring SpringMVC Mybatis框架整合Java配置完整版

  • 2019 年 10 月 5 日
  • 筆記

  以前用著SSH都是老師給配好的,自己直接改就可以。但是公司主流還是SSM,就自己研究了一下Java版本的配置。網上大多是基於xnl的配置,但是越往後越新的項目都開始基於JavaConfig配置了,這也是寫此文章的原因。不論是eclipse還是myeclipse 都沒有集成mybatis的相關組件,Spring也沒有對其進行兼容,所以說我們會用到一些mybatis提供的核心jar包。下面先看一下我們的項目結構,我先自建了一個集成spring4.1的 ssm web項目(紅色箭頭指向注意刪除web.xml配置,因為後期會和我們的java配置衝突而導致項目失敗),結構如下圖:

(一)介紹Mybatis

  當你看到這裡說明你並不是很了解mybatis,或者只是有其他框架的開發經驗。所以建議你還是看下去。工欲善其事必先利其器,想要用mybatis必須先了解哦我們的mybatis。這裡不說mybatis的起因來源,也不說他的深層機理。就簡單談一談在ssm框架中的位置。以前用的ssh 我一直寫的是HQL sq語句,web項目中的mvc框架一直佔據了主流,幾乎所以的CURD都是遵循這個框架來實現的,開發者通常會建立對應的service,dao,web層進行分層操作。為了程式碼的健壯性和可修改性,那些分層通常設計為介面類型,然後功能實現再通過相應的介面實現。而mybatis特殊的是,通過資料庫逆向工程生成的XXXmapper.java全是介面文件,一個XXXmapper.java對應一個XXXmapper.xml 來實現持久層的操作。

  剛剛說到的mybatis逆向工程,熟悉hibernate的知道,hibernate給不一樣的ide都適配了逆向工程的專用插件。而mybatis沒有,但是官方給出的方法更是簡單,使用簡單的xml配置搭上相應的java程式碼一運行,就可以實現資料庫的逆向工程。生成我們所需要的l實體,和操作映射。這個時候我們就可以把逆向工程的對應文件路徑進行設置,分別對應我們的model和dao層。說了這麼多就是這一句分層的思想。下面簡單看一下逆向工程程式碼:

官方給出的java主文件,起名為GeneratorSqlmap:主要修改這一語句:File configFile = new File("./resources/generatorConfig.xml");這裡我們的配置xml放在resources資源文件夾下面。

 1 package com.gede.reversedb;   2 /**   3 * @author gede   4 * @version date:2019年6月18日 上午10:10:49   5 * @description :   6 */   7 import java.io.File;   8 import java.util.*;   9  10 import org.mybatis.generator.api.MyBatisGenerator;  11 import org.mybatis.generator.config.Configuration;  12 import org.mybatis.generator.config.xml.ConfigurationParser;  13 import org.mybatis.generator.internal.DefaultShellCallback;  14  15 public class GeneratorSqlmap {  16  17     public void generator() throws Exception {  18         List<String> warnings = new ArrayList<String>();  19         boolean overwrite = true;  20         // 指定配置文件  21         File configFile = new File("./resources/generatorConfig.xml");  22         ConfigurationParser cp = new ConfigurationParser(warnings);  23         Configuration config = cp.parseConfiguration(configFile);  24         DefaultShellCallback callback = new DefaultShellCallback(overwrite);  25         MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);  26         myBatisGenerator.generate(null);  27     }  28     // 執行main方法以生成程式碼  29     public static void main(String[] args) {  30         try {  31             GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();  32             generatorSqlmap.generator();  33         } catch (Exception e) {  34             e.printStackTrace();  35         }  36     }  37 }

再看我們resources下的generatorConfig.xml 文件。主要填寫這些資訊:

  • Mysql資料庫連接的資訊:驅動類、連接地址、用戶名、密碼
  • 生成POJO類的位置
  • mapper映射文件生成的位置
  • mapper介面生成的的位置
  • 指定數據表
 1 <?xml version="1.0" encoding="UTF-8"?>   2 <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">   3   4 <generatorConfiguration>   5   <context id="DB2Tables" targetRuntime="MyBatis3">   6     <commentGenerator>   7         <!-- 是否去除自動生成的注釋 -->   8         <property name="suppressAllComments" value="true"/>   9     </commentGenerator>  10     <!-- Mysql資料庫連接的資訊:驅動類、連接地址、用戶名、密碼 -->  11     <jdbcConnection driverClass="com.mysql.jdbc.Driver"  12         connectionURL="jdbc:mysql://localhost:3306/hotel"  13         userId="root"  14         password="112233">  15     </jdbcConnection>  16  17     <!-- 默認為false,把JDBC DECIMAL 和NUMERIC類型解析為Integer,為true時  18     把JDBC DECIMAL 和NUMERIC類型解析為java.math.BigDecimal -->  19     <javaTypeResolver >  20         <property name="forceBigDecimals" value="false" />  21     </javaTypeResolver>  22  23     <!-- targetProject:生成POJO類的位置 -->  24     <javaModelGenerator targetPackage="com.gede.model" targetProject=".src">  25         <!-- enableSubPackages:是否讓schema作為包的後綴 -->  26         <property name="enableSubPackages" value="false" />  27         <!-- 從資料庫返回的值被清理前後的空格 -->  28         <property name="trimStrings" value="true" />  29     </javaModelGenerator>  30  31     <!-- targetProject:mapper映射文件生成的位置 -->  32     <sqlMapGenerator targetPackage="com.gede.dao"  targetProject=".src">  33         <!-- enableSubPackages:是否讓schema作為包的後綴 -->  34         <property name="enableSubPackages" value="false" />  35     </sqlMapGenerator>  36  37     <!-- targetProject:mapper介面生成的的位置 -->  38     <javaClientGenerator type="XMLMAPPER" targetPackage="com.gede.dao"  targetProject=".src">  39         <!-- enableSubPackages:是否讓schema作為包的後綴 -->  40         <property name="enableSubPackages" value="false" />  41     </javaClientGenerator>  42  43     <!-- 指定數據表 -->  44     <table schema="" tableName="webuser"></table>  45  46     <!-- 有些表的欄位需要指定java類型  47     <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >  48       <property name="useActualColumnNames" value="true"/>  49       <generatedKey column="ID" sqlStatement="DB2" identity="true" />  50       <columnOverride column="DATE_FIELD" property="startDate" />  51       <ignoreColumn column="FRED" />  52       <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />  53     </table> -->  54   </context>  55 </generatorConfiguration>

配置好以後運行我們的java文件,如果自己已經建好包直接打開就可以,如果之前沒有包,記得刷新一下項目。這個時候再看我們的項目結構大致是這樣的:你會發現model下面還多了一個xxxExampled的java文件。他的區別用途如下圖:

圖片原文地址:https://blog.csdn.net/qq_39056805/article/details/80585941

(二)配置spring

  到這裡我們的mybatis相應的文件已經應有具有,本來按常規思路來說應該是先搭建spring+springMVC然後再整合mybatis,但是這裡還是先鋪墊了mybatis。下面我們進行項目spring搭建。

首先設置Spring的啟動,需要ConfigInit.java、WebConfig.java、RootConfig.java

ConfigInit.java

 1 package com.gede.config;   2   3 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;   4   5 /**   6 * @author gede   7 * @version date:2019年6月20日 下午10:09:38   8 * @description :充當web.xml的作用。   9 */  10 public class ConfigInit extends AbstractAnnotationConfigDispatcherServletInitializer{  11     /**  12      * 載入RootConfig配置文件  13      */  14     @Override  15     protected Class<?>[] getRootConfigClasses() {  16         // TODO Auto-generated method stub  17         return new Class<?>[] {RootConfig.class};  18     }  19     /**  20      * 載入網站配置文件  21      */  22     @Override  23     protected Class<?>[] getServletConfigClasses() {  24         // TODO Auto-generated method stub  25         return new Class<?>[] {WebConfig.class};  26     }  27     /**  28      * 設置項目起始目錄路徑為/  29      */  30     @Override  31     protected String[] getServletMappings() {  32         // TODO Auto-generated method stub  33         return new String[]{"/"};  34     }  35  36 }

WebConfig.java

 1 package com.gede.config;   2   3 import org.springframework.context.annotation.Bean;   4 import org.springframework.context.annotation.ComponentScan;   5 import org.springframework.context.annotation.Configuration;   6 import org.springframework.web.servlet.ViewResolver;   7 import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;   8 import org.springframework.web.servlet.config.annotation.EnableWebMvc;   9 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  10 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;  11 import org.springframework.web.servlet.view.InternalResourceViewResolver;  12  13 /**  14 * @author gede  15 * @version date:2019年6月20日 下午10:09:49  16 * @description :  17 */  18 @Configuration  19 @ComponentScan("com.gede.controller")  20 @EnableWebMvc  21 public class WebConfig extends WebMvcConfigurerAdapter{  22     /**  23      * 配置試圖控制器  24      * 統一解析/WEB-INF/view/下的jsp文件  25      * @return  26      */  27     @Bean  28     public ViewResolver viewResolver()  29     {  30         InternalResourceViewResolver resolver = new InternalResourceViewResolver();  31         resolver.setPrefix("/WEB-INF/view/");  32         resolver.setSuffix(".jsp");  33         return resolver;  34     }  35     /**  36      * 允許靜態資源解析  37      */  38     @Override  39     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)  40     {  41         configurer.enable();  42     }  43 }

RootConfig.java

 1 package com.gede.config;   2   3 import org.springframework.context.annotation.Configuration;   4 import org.springframework.web.servlet.config.annotation.EnableWebMvc;   5   6 /**   7 * @author gede   8 * @version date:2019年6月20日 下午10:10:01   9 * @description :  10 */  11 @Configuration  12 @EnableWebMvc  13 public class RootConfig {  14  15 }

到這一步我們已經把Spring以及SpringMVC啟動配置類做完了,我們需要一個index.jsp和控制器IndexController.java來實現一個最簡單mvc;

IndexController.java

 1 package com.gede.controller;   2   3 import static org.springframework.web.bind.annotation.RequestMethod.GET;   4   5 import org.springframework.stereotype.Controller;   6 import org.springframework.web.bind.annotation.RequestMapping;   7   8 /**   9 * @author gede  10 * @version date:2019年6月20日 下午10:18:20  11 * @description :  12 */  13 @Controller  14 public class IndexController {  15     @RequestMapping(value="/",method=GET)  16     public String index(){  17         return "index";  18     }  19 }

(三)整合mybatis

這是我們需要導入的jar包:mybatis基礎包,mybatis逆向工程的三個核心包,mybatis-spring的集成包和我們的mysql驅動jar包,下面開始整合。

我們採用資料庫連接處的DataSource方式,在這裡有兩種選擇,一可以選擇新建DataConfig.java的配置文件,也可以直接配在我們的RootConfig.java 裡面。在這裡我們選擇配在RootConfig中:

配置數據源連接池:

1  @Bean  2     public BasicDataSource dataSource() {  3         BasicDataSource dataSource = new BasicDataSource();  4         dataSource.setDriverClassName("com.mysql.jdbc.Driver");  5         dataSource.setUrl("jdbc:mysql://localhost:3306/hotel?useUnicode=true&characterEncoding=UTF-8");  6         dataSource.setUsername("root");  7         dataSource.setPassword("112233");  8         return dataSource;  9     }

創建sqlSessionFactoryBean工廠

 1   @Bean   2     public SqlSessionFactoryBean sqlSessionFactoryBean() {   3         PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();   4         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();   5         sqlSessionFactoryBean.setDataSource(dataSource());   6         try {   7             sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:com/gede/dao/*.xml"));   8         } catch (IOException e) {   9             e.printStackTrace();  10         }  11         return sqlSessionFactoryBean;  12     }

設置mybatis基礎掃描包和載入sql工廠

1   @Bean  2     public MapperScannerConfigurer mapperScannerConfigurer() {  3         MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();  4         mapperScannerConfigurer.setBasePackage("com.gede.dao");  5         mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");  6         return mapperScannerConfigurer;  7     }

這裡的基礎包掃描也可以使用@MapperScan()注釋來實現,最後的RootConfig.java大致長這個樣子:

 1 package com.gede.config;   2   3 import java.io.IOException;   4   5 import org.apache.commons.dbcp.BasicDataSource;   6 import org.mybatis.spring.SqlSessionFactoryBean;   7 import org.mybatis.spring.annotation.MapperScan;   8 import org.mybatis.spring.mapper.MapperScannerConfigurer;   9 import org.springframework.context.annotation.Bean;  10 import org.springframework.context.annotation.Configuration;  11 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;  12 import org.springframework.web.servlet.config.annotation.EnableWebMvc;  13  14 /**  15 * @author gede  16 * @version date:2019年6月20日 下午10:10:01  17 * @description :  18 */  19 @Configuration  20 @EnableWebMvc  21 //@MapperScan()  22 public class RootConfig {  23     /**  24      * 數據資源配置  25      * @return  26      */  27     @Bean  28     public BasicDataSource dataSource() {  29         BasicDataSource dataSource = new BasicDataSource();  30         dataSource.setDriverClassName("com.mysql.jdbc.Driver");  31         dataSource.setUrl("jdbc:mysql://localhost:3306/hotel?useUnicode=true&characterEncoding=UTF-8");  32         dataSource.setUsername("root");  33         dataSource.setPassword("112233");  34         return dataSource;  35     }  36     /**  37      * mybatis配置  38      * @return  39      */  40     @Bean  41     public SqlSessionFactoryBean sqlSessionFactoryBean() {  42         PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();  43         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();  44         sqlSessionFactoryBean.setDataSource(dataSource());  45         try {  46             sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:com/gede/dao/*.xml"));  47         } catch (IOException e) {  48             e.printStackTrace();  49         }  50         return sqlSessionFactoryBean;  51     }  52  53     /**  54      * mybatis配置  55      * @return  56      */  57     @Bean  58     public MapperScannerConfigurer mapperScannerConfigurer() {  59         MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();  60         mapperScannerConfigurer.setBasePackage("com.gede.dao");  61         mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");  62         return mapperScannerConfigurer;  63     }  64  65 }

這個時候運行我們的項目發小項目報錯了:

org/springframework/dao/support/DaoSupport。。。。。。。。。。。。。

查了一下缺少jar包,網上的都是關於maven的添加依賴,最後我這裡添加了hibernate的框架解決了。啟動成功,到這裡我們的SSM框架就整合完成了。

(四)測試

  添加了hibernate的框架後,我們運行成功,開始寫一些簡單的測試。在這裡我們寫了一個user.jsp來顯示從資料庫中查到的用戶資訊,還有與其對應的SelectController 。

user.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>   2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>   3 <html>   4   <head>   5     <title>User</title>   6   <body>   7     <div >   8      <div><span>id:<c:out value="${user.id}" /></span></div>   9      <div><span>username:<c:out value="${user.username}" /></span></div>  10      <div><span>password:<c:out value="${user.password}" /></span></div>  11      <div><span>sex:<c:out value="${user.sex}" /></span></div>  12      <div><span>tele:<c:out value="${user.tele}" /></span></div>  13      <div><span>qq:<c:out value="${user.qq}" /></span></div>  14      <div><span>enabled:<c:out value="${user.enabled}" /></span></div>  15      <div><span>authority:<c:out value="${user.authority}" /></span></div>  16     </div>  17   </body>  18 </html>

SelectController 。通過調用相應的查詢操作,然後我們讓查詢結果隨model一起返回介面。這個時候我們的jsp上就可以用jstl來獲取我們的值了。

 1 package com.gede.controller;   2   3 import static org.springframework.web.bind.annotation.RequestMethod.GET;   4   5 import org.springframework.beans.factory.annotation.Autowired;   6 import org.springframework.stereotype.Controller;   7 import org.springframework.ui.Model;   8 import org.springframework.web.bind.annotation.RequestMapping;   9  10 import com.gede.model.Webuser;  11 import com.gede.service.GetUserService;  12  13 /**  14 * @author gede  15 * @version date:2019年6月20日 下午10:57:46  16 * @description :  17 */  18 @Controller  19 public class SelectController {  20     private GetUserService getUserService;  21  22     @Autowired  23     public SelectController(GetUserService getUserService) {  24         super();  25         this.getUserService = getUserService;  26     }  27     @RequestMapping(value="/select",method=GET)  28     public String index(Model model){  29         Webuser user=getUserService.select();  30         model.addAttribute("user", user);  31         return "user";  32     }  33 }

GetUserServiceImpl這是我們的service層程式碼,負責調用mybatis逆向生成的mapper介面。

 1 package com.gede.service.impl;   2   3 import org.springframework.beans.factory.annotation.Autowired;   4 import org.springframework.stereotype.Component;   5   6 import com.gede.dao.WebuserMapper;   7 import com.gede.model.Webuser;   8 import com.gede.service.GetUserService;   9  10 /**  11 * @author gede  12 * @version date:2019年6月20日 下午10:54:29  13 * @description :  14 */  15 @Component  16 public class GetUserServiceImpl implements GetUserService {  17  18     private  WebuserMapper webuserMapper;  19  20     @Autowired  21     public GetUserServiceImpl(WebuserMapper webuserMapper) {  22         super();  23         this.webuserMapper = webuserMapper;  24     }  25     @Override  26     public Webuser select() {  27         Webuser webuser=webuserMapper.selectByPrimaryKey(1);  28         return webuser;  29     }  30  31 }

到這裡我們的項目大致如下,運行項目訪問http://localhost:8080/ssm//select:

感謝大家的觀看,如有疑問請聯繫[email protected]。附相關jar包:地址 密碼:i6s7

項目gitub地址:https://github.com/376482000/ssm-

Tags: