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

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

 

 

(一)介紹Mybatis

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

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

官方給出的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文件。他的區別用途以下圖:git

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

(二)配置spring

  到這裏咱們的mybatis相應的文件已經應有具備,原本按常規思路來講應該是先搭建spring+springMVC而後再整合mybatis,可是這裏仍是先鋪墊了mybatis。下面咱們進行項目spring搭建。web

首先設置Spring的啓動,須要ConfigInit.java、WebConfig.java、RootConfig.javaspring

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;sql

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中:apache

配置數據源鏈接池:

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

 

感謝你們的觀看,若有疑問請聯繫g376482a@163.com。附相關jar包:地址 密碼:i6s7

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

相關文章
相關標籤/搜索