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
posted on 2019-06-21 08:16 g歌德a 閱讀(...) 評論(...) 編輯 收藏