1. 程式人生 > >SSM Spring SpringMVC Mybatis框架整合Java配置完整版

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

  以前用著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

&n