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