zoukankan      html  css  js  c++  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

    感谢大家的观看,如有疑问请联系g376482a@163.com。附相关jar包:地址 密码:i6s7

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

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/gede/p/11061859.html
Copyright © 2011-2022 走看看