• 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-

  • 相关阅读:
    0926-----homework(3)
    0926-----homework(2)
    0926-----homework(1)
    修改withdraw 方法
    创建一个简单的银行程序包
    建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),表示存入银行1
    看下图实现如下接口和类,并完成Adventure中的主方法。
    接口(计算器)
    中国特色社会主义
    按要求编写Java程序(阶乘)
  • 原文地址:https://www.cnblogs.com/gede/p/11061859.html
Copyright © 2020-2023  润新知