三、springmvc和mybatis整合


1、准备

需求:使用springmvc和mybatis完成查询。

整合思路

第一步:整合dao层

  • mybatis和spring整合,通过spring管理mapper接口。
  • 使用mapper的扫描器自动扫描mapper接口在spring中进行注册。

第二步:整合service层

  • 通过spring管理 service接口。
  • 使用配置方式将service接口配置在spring配置文件中。
  • 实现事务控制。

第三步:整合springmvc

  • 由于springmvc是spring的模块,不需要整合。

所需要的jar包:

  • 数据库驱动包
  • mybatis的jar包
  • mybatis和spring整合包
  • log4j包
  • dbcp数据库连接池包
  • spring3.2所有jar包
  • jstl包

工程结构:

表:

-- Create table
create table GLAPILOGMAIN
(
  logid      VARCHAR2(50) not null,
  msgid      VARCHAR2(50) not null,
  sessionid  VARCHAR2(50),
  client     VARCHAR2(30) not null,
  status     VARCHAR2(10) not null,
  api        VARCHAR2(50) not null,
  instanceip VARCHAR2(50) not null,
  starttime  VARCHAR2(50) not null,
  usedtime   VARCHAR2(50) not null,
  request    CLOB not null,
  response   CLOB not null,
  inputdate  DATE,
  orderno    VARCHAR2(50)
);
-- Add comments to the columns 
comment on column GLAPILOGMAIN.logid
  is '日志ID';
comment on column GLAPILOGMAIN.msgid
  is '消息ID';
comment on column GLAPILOGMAIN.sessionid
  is 'session ID';
comment on column GLAPILOGMAIN.client
  is '商户号';
comment on column GLAPILOGMAIN.status
  is '是否成功';
comment on column GLAPILOGMAIN.api
  is 'API名字';
comment on column GLAPILOGMAIN.instanceip
  is '机器ID';
comment on column GLAPILOGMAIN.starttime
  is '开始时间';
comment on column GLAPILOGMAIN.usedtime
  is '使用时长';
comment on column GLAPILOGMAIN.request
  is '请求报文';
comment on column GLAPILOGMAIN.response
  is '响应报文';
comment on column GLAPILOGMAIN.inputdate
  is '插入时间';
comment on column GLAPILOGMAIN.orderno
  is '订单号';

2、整合dao(mybatis和spring进行整合)

  • mybatis和spring整合,通过spring管理mapper接口。
  • 使用mapper的扫描器自动扫描mapper接口在spring中进行注册。

2.1 db.properties(配置数据库参数)

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@10.0.99.11:3526:tpicarh5db
jdbc.user=TPCLOUD_10
jdbc.password=Tpcloud#2020
#最大连接数据库连接数,设 0为没有限制 .一般把maxActive设置成可能的并发量就行了
maxActive=30
#最大等待连接中的数量,设 0为没有限制
maxWait=5

2.2 log4j.properties

#设置日志等级,开发环境debug ,生产info或error
log4j.rootLogger=debug,stdout,info,debug,warn,error

#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n

#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout 
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/hp/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout 
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/hp/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout 
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log 
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

2.3 sqlMapConfig.xml(mybatis自己的配置文件)

<?xml version="1.0" encoding="UTF-8" ?>
DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
    <settings>
        
        <setting name="mapUnderscoreToCamelCase" value="true" />
        
         
    settings>
    
    <typeAliases>
        
        <package name="com.taiping.dto,com.lysh.entrity"/>
    typeAliases>
configuration>

Mybatis配置文件中的驼峰匹配

   

若不配置默认为false,在**Mapper.xm文件的select语句中若不是返回ResultMap而是ResultType则返回字段不会进行驼峰命名,javabean中的属性必须与其对应。

如果在数据库中,有一个字段为a_id,那么在javaBean中的属性也必须这样写,写成a_id,这种代码编写方式肯定不符合代码规范。

若开启(设置未true)则: 数据库返回的"order_address"命名字段映射为class的"orderAddress"字段。

2.4 applicationContext-dao.xml

配置:数据源、SqlSessionFactory、mapper扫描器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd    
                        http://www.springframework.org/schema/mvc    
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    
    <context:property-placeholder location="classpath:db/db.properties"/> 
    
     
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.user}" />
        <property name="password" value="${jdbc.password}" />
        
        <property name="maxActive" value="${maxActive}" />
        
        <property name="maxWait" value="${maxWait}" />
    bean>                 

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        
        <property name="dataSource" ref="dataSource">property>
        
        <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml">property>
        
        <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml">property>
        
        <property name="typeAliasesPackage" value="com.taiping.dto,com.lysh.entrity">property>
    bean>

    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        
        <property name="basePackage" value="com.lysh.dao">property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    bean>
beans>

2.5 ApiLogMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lysh.dao.ApiLogMapper">
    
    <!-- sql片段 -->
    <!-- 查询条件 -->
    <sql id="query_ApiLog_where">
        <if test="orderNo!=null and orderNo!=''">
            and orderNo = #{orderNo}
        if>
    sql>
        
    <!-- 查询商品信息 -->
    <select id="queryApiLogByOrderNo" parameterType="string" resultType="com.lysh.entrity.ApiLog">
        select * from GLAPILOGMAIN g 
        <where>
            <include refid="query_ApiLog_where"/>
        where>
    select>
mapper>

2.6 ApiLogMapper

package com.lysh.dao;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.lysh.entrity.ApiLog;

public interface ApiLogMapper {
    List queryApiLogByOrderNo(@Param("orderNo") String orderNo);
}

2.6 service

  • Service由spring管理(可单独创建applicationContext-service.xml,这里跟事务写在了一起)
  • applicationContext-transaction.xml,spring对Service进行事务控制。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
    
    <context:component-scan base-package="com.lysh.service">context:component-scan>
    
    
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource">property>
    bean>
    
    <tx:advice transaction-manager="transactionManager" id="txAdvice">
        <tx:attributes>
            
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="create*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="edit*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
        tx:attributes>
    tx:advice>
    
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lysh.service.impl.*.*(..))"/>
    aop:config>
beans>

3、springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
        
        
        <context:component-scan base-package="com.lysh.controller">context:component-scan>
        
        <mvc:annotation-driven/>    
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        bean>
beans>

 4、controller

package com.lysh.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.lysh.entrity.ApiLog;
import com.lysh.service.ApiLogService;

@RestController
@RequestMapping("/apiLog")
public class ApiLogController {
    
    @Autowired
    private ApiLogService apiLogService;
    
    @RequestMapping(value="/query/{orderNo}",method=RequestMethod.GET)
    public String queryApiLog(@PathVariable String orderNo){
        
        ApiLog apiLog = apiLogService.queryApiLogByOrderNo(orderNo);
        return "api:"+(null != apiLog ? apiLog.getApi():null);
    }
}

5、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SSMDemodisplay-name>
  <welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
    <welcome-file>default.htmlwelcome-file>
    <welcome-file>default.htmwelcome-file>
    <welcome-file>default.jspwelcome-file>
  welcome-file-list>
  <display-name>SSMDemodisplay-name>

    
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring/applicationContext*.xmlparam-value>
    context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    
    <filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>utf-8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    
    <servlet>
        <servlet-name>springmvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:spring/springmvc.xmlparam-value>
        init-param>
        
        
        
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>springmvcservlet-name>
        <url-pattern>/*url-pattern>
    servlet-mapping>
    
web-app>

6、测试

http://localhost:8080/SSMDemo/apiLog/query/HTY2021031519302010