Spring+SpringMVC+MyBatis整合

目錄

  • 1.SSM介紹
    • 1.1 什么是SSM?
    • 1.2 SSM框架
      • 1.2.1 Spring
      • 1.2.2 SpringMVC
      • 1.2.3 MyBatis
  • 2.SSM框架整合
    • 2.1 建庫建表
    • 2.2 創建工程
    • 2.3 pom.xml
    • 2.4 log4j.properties
    • 2.5 db.properties
    • 2.6 applicationContext-dao.xml
    • 2.7.applicationContext-tx.xml
    • 2.8 applicationContext-service.xml
    • 2.9 springmvc.xml
    • 2.10 web.xml
    • 2.11 pojo
    • 2.12 mapper
    • 2.13 service
    • 2.14 controller
    • 2.15 jsp
    • 2.16 測試
    • 2.17 項目目錄結構
  • 3.待改造的問題
    • 3.1 jdbc配置
    • 3.2 mybatis配置
    • 3.3 transactional配置
    • 3.4 service配置
    • 3.5 springmvc配置
    • 3.6 servlet配置
  • 4.相關注解說明
    • 4.1 相關注解和xml對應關系
    • 4.2 @Configuration
    • 4.3 @ComponentScan
    • 4.4 @Bean
    • 4.5 @PropertySource
    • 4.6 @Import
  • 5.Spring的純注解配置
    • 5.1 JdbcConfig
    • 5.2 MybatisConfig
    • 5.3 TxConfig
    • 5.4 SpringConfig
    • 5.5 SpringMvcConfig
    • 5.6 WebConfig
    • 5.7 刪除xml配置文件
    • 5.8 修改web.xml
    • 5.9 測試

1.SSM介紹

1.1 什么是SSM?

SSM全稱Spring+SpringMVC+MyBatis,是spring、spring MVC 、和mybatis框架的整合,為標準的MVC模式,是目前比較主流的Java EE企業級框架,適用于搭建各種大型的企業級應用系統。

  • 使用Spring實現業務對象的管理;

  • 使用SpringMVC負責請求的轉發和視圖的管理;

  • 使用MyBatis作為數據對象的持久化引擎。

標準的SSM框架有四層,分別是dao(mapper)層,service層,controller層和View層。使用spring實現業務對象管理,使用spring MVC負責請求的轉發和視圖管理,mybatis作為數據對象的持久化引擎。

1.2 SSM框架

1.2.1 Spring

Spring是一個開源的控制反轉(IoC)和面向切面(AOP)的容器框架,用來簡化企業開發。

  • IOC(控制反轉)

是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度,最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

  • AOP(面向切面編程)

AOP使業務邏輯各部分間的耦合度降低,提高程序可重用性,提高開發效率。

詳細參考:Spring IoC詳解,Spring AOP詳解

1.2.2 SpringMVC

Spring MVC 分離了 控制器、模型 對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定制。

SpringMVC的優點:

  1. springMVC是使用了MVC設計思想的輕量級web框架,對web層進行解耦,是的我們開發更簡潔。

  2. 與Spring無縫銜接。

  3. 靈活的數據驗證,格式化,數據綁定機制。

詳細參考:Spring MVC詳解,Spring MVC攔截器、文件上傳和全局異常處理

1.2.3 MyBatis

MyBatis是一種開源的持久化框架,它通過XML或注解配置SQL映射,將Java對象映射到關系型數據庫中的表。MyBatis可以將數據查詢結果映射成Java對象,也可以將Java對象插入、更新、刪除到數據庫中。

MyBatis的核心組件包括:

  1. SqlSessionFactory:創建SqlSession的工廠類,用于生成SqlSession對象。

  2. SqlSession:MyBatis與數據庫交互的會話,可以使用SqlSession執行數據庫操作,例如查詢、更新、刪除、插入等。

  3. Mapper:Mapper是Java接口,用于定義數據庫操作方法。Mapper接口中的方法名和參數類型與Mapper.xml文件中的SQL語句綁定。

  4. Mapper.xml:Mapper.xml文件用于定義SQL語句,包括查詢、更新、刪除、插入等操作,也可以進行參數的動態組裝。

詳細參考:MyBatis詳解

2.SSM框架整合

2.1 建庫建表

CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`money` double DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2 創建工程

創建工程

2.3 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.by</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.2.8.RELEASE</spring.version><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><mysql.version>5.1.47</mysql.version><mybatis.version>3.4.5</mybatis.version><druid.version>1.1.0</druid.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.0</version></dependency><!--jsp--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- log start --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency>        </dependencies><build><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><!--端口號--><port>8080</port><!--項目名--><path>/</path><!--按UTF-8進行編碼--><uriEncoding>UTF-8</uriEncoding></configuration></plugin></plugins><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></build>
</project>

2.4 log4j.properties

log4j.rootLogger=DEBUG,A1log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - %c%l%m%n

2.5 db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8
jdbc.username=root
jdbc.password=1111

2.6 applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 加載配置文件 --><context:property-placeholder location="classpath:db.properties" /><!-- 數據庫連接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="maxActive" value="10" /><property name="minIdle" value="5" /></bean><!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 數據庫連接池 --><property name="dataSource" ref="dataSource" /><!-- 別名--><property name="typeAliasesPackage" value="com.by.pojo"></property></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.by.mapper"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean>
</beans>

2.7.applicationContext-tx.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 事務管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 數據源 --><property name="dataSource" ref="dataSource"/></bean><!-- 通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 傳播行為 --><tx:method name="insert*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="select*" propagation="SUPPORTS" read-only="true"/><tx:method name="get*" propagation="SUPPORTS" read-only="true"/></tx:attributes></tx:advice><!-- 切面 --><aop:config><aop:advisor advice-ref="txAdvice"pointcut="execution(* com.by.service.*.*(..))" /></aop:config>
</beans>

2.8 applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 掃描service的包 --><context:component-scan base-package="com.by.service"></context:component-scan>
</beans>

2.9 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.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置創建 spring 容器要掃描的包 --><context:component-scan base-package="com.by.controller"></context:component-scan><!-- 配置視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean>
</beans>

2.10 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置Spring的監聽器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 解決post亂碼 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- springmvc的前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><!-- 攔截/,例如:/user/add  --><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

2.11 pojo

public class Account {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +'}';}
}

2.12 mapper

public interface AccountMapper {List<Account> selectAccount();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.mapper.AccountMapper"><select id="selectAccount" resultType="Account">select * from account</select>
</mapper>

2.13 service

@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic List<Account> selectAccount() {return accountMapper.selectAccount();}
}

2.14 controller

@Controller
@RequestMapping("/account")
public class AccountController {@Autowiredprivate AccountService accountService;@RequestMapping("/selectAccount")public String selectAccount(Model model){List<Account> list = accountService.selectAccount();model.addAttribute("list",list);return "select_account";}
}

2.15 jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body>
<h2>查詢所有賬戶</h2>
<table width="30%" border="1" cellspacing="0" cellpadding="0"><tr><th>id</th><th>name</th><th>money</th></tr><c:forEach var="list" items="${list}"><tr><td>${list.id}</td><td>${list.name}</td><td>${list.money}</td></tr></c:forEach>
</table>
</body>
</html>

2.16 測試

測試

2.17 項目目錄結構

目錄結構

3.待改造的問題

我們發現,之所以我們現在離不開xml配置文件,是因為我們有一處很關鍵的配置,如果他要也能用注解配置,那么我們就可以脫離xml文件了:

3.1 jdbc配置

<context:property-placeholder location="classpath:db.properties">
</context:property-placeholder>
<!--數據源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="maxActive" value="10" /><property name="minIdle" value="5" />
</bean>

3.2 mybatis配置

    <!--sqlSession工廠--><bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="typeAliasesPackage" value="com.by.pojo"></property></bean><!--配置MapperScan掃描mapper接口,并把生成的代理類交給spring去管理--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.by.mapper"></property><property name="sqlSessionFactoryBeanName" value="sessionFactoryBean"></property></bean>

3.3 transactional配置

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 開啟spring對注解事務的支持 --><tx:annotation-driven transaction-manager="transactionManager"/>

3.4 service配置

    <!--掃描service--><context:component-scan base-package="com.by.service"></context:component-scan>

3.5 springmvc配置

<!--配置springmvc要掃描的包--><context:component-scan base-package="com.by.controller,com.by.exception"></context:component-scan><!--開啟注解驅動:配置handlerMapping和handlerAdapter--><mvc:annotation-driven conversion-service="cs"></mvc:annotation-driven><!--配置日期轉換器--><bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.by.converter.MyDateConverter"></bean></set></property></bean><!--配置視圖解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!--配置文件上傳解析器--><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="5242880" /><property name="defaultEncoding" value="UTF-8" /></bean><!--資源映射器:直接放行無須dispatcherServlet去處理--><mvc:resources location="/head/" mapping="/head/**"/><!--配置攔截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/account/**"/><mvc:exclude-mapping path="/account/login"></mvc:exclude-mapping><bean class="com.by.interceptor.LoginInterceptor"></bean></mvc:interceptor></mvc:interceptors>

3.6 servlet配置

<!--配置監聽器:監聽tomcat啟動,加載spring配置文件-->
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!--前端控制器-->
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
<!--過濾器-->
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

4.相關注解說明

4.1 相關注解和xml對應關系

注解位置對應的XML標簽作用
@Configuration 聲明當前類為配置類,相當于xml形式的Spring配置
@ComponentScan <context:component-scan>用于對Component進行掃描
@Bean 方法<bean>聲明當前方法的返回值為一個bean
@PropertySource<context:property-placeholder>用于加載*.properties文件中的配置
@Import<import>用來導入配置類或者一些需要前置加載的類

4.2 @Configuration

  • 作用:用于指定當前類是一個spring配置類,可替換web.xml配置文件

  • 示例:

    /*** spring的配置類*/
    @Configuration
    public class SpringConfiguration{
    }
    

4.3 @ComponentScan

  • 作用:

    用于指定spring在初始化容器時要掃描的包。作用和在spring的xml配置文件中的:<context:component-scan base-package="com.by"/>是一樣的。

  • 屬性:

    • basePackages:用于指定要掃描的包。和該注解中的value屬性作用一樣。
  • 示例代碼

    /*** spring的配置類*/
    @Configuration
    @ComponentScan(basePackages = "com.by")//等價于<context:component-scan>
    public class SpringConfiguration{
    }
    

4.4 @Bean

  • 作用:

    該注解只能寫在方法上,表明使用此方法創建一個對象,并且放入spring容器。作用和在spring的xml配置文件中的:<bean/>是一樣的。

  • 屬性:

    • name:給當前@Bean注解方法創建的對象指定一個名稱(即bean的id)。
  • 示例代碼

    public class Dog {private String nam;private Integer age;//set get......
    }    
    
    @Bean
    public Dog dog(){Dog dog = new Dog();dog.setNam("二狗");dog.setAge(18);return dog;
    }
    

4.5 @PropertySource

  • 作用:

    用于加載*.properties文件中的配置。作用和在spring的xml配置文件中的:<context:property-placeholder location="">是一樣的。

  • 屬性:

    • value[]:用于指定properties文件位置。如果是在類路徑下,需要寫上classpath:
  • 示例代碼

    #config.properties
    nam=二狗
    age=18
    
    @PropertySource("classpath:config.properties")
    public class SpringConfiguration {@Value("${nam}")private String nam;@Value("${age}")private Integer age;@Beanpublic Dog dog(){Dog dog = new Dog();dog.setNam(nam);dog.setAge(age);return dog;}
    }
    

4.6 @Import

  • 作用:

    @Import注解是用來導入配置類或者一些需要前置加載的類。作用和在spring的xml配置文件中的:<import resource=""></import>是一樣.

  • 屬性:

    • value[]:用于指定其他配置類的字節碼。
  • 示例代碼

    @Configuration
    @ComponentScan(basePackages = "com.by")
    @Import({Configuration_Other.class})
    public class SpringConfiguration {}@PropertySource("classpath:config.properties")
    public class Configuration_Other {}
    

5.Spring的純注解配置

5.1 JdbcConfig

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;@PropertySource("classpath:db.properties")
public class JdbcConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;@Bean("dataSource")public DataSource getDatasource() {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}

5.2 MybatisConfig


import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {@Beanpublic SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean ssfb=new SqlSessionFactoryBean();ssfb.setDataSource(dataSource);ssfb.setTypeAliasesPackage("com.by.pojo");return ssfb;}@Beanpublic MapperScannerConfigurer getMapperScannerConfigurer(){MapperScannerConfigurer msc=new MapperScannerConfigurer();msc.setBasePackage("com.by.mapper");return msc;}
}

5.3 TxConfig

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;public class TxConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager ds = new DataSourceTransactionManager();ds.setDataSource(dataSource);return ds;}
}

5.4 SpringConfig

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.annotation.EnableTransactionManagement;@Configuration
@Import({MyBatisConfig.class, JdbcConfig.class, TxConfig.class})
//等同<context:component-scan base-package="com.by"/>`
@ComponentScan(value = "com.by.service")
//等同于<tx:annotation-driven />,bean的名稱默認取transactionManager
@EnableTransactionManagement
public class SpringConfig {}

5.5 SpringMvcConfig

import com.by.converter.MyDateConverter;
import com.by.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
//等同于<context:component-scan base-package="com.by.controller>
@ComponentScan("com.by.controller")
//等同于<mvc:annotation-driven></mvc:annotation-driven>
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/pages/"); // 設置視圖文件所在目錄viewResolver.setSuffix(".jsp"); // 設置視圖文件后綴名return viewResolver;}@Beanpublic CommonsMultipartResolver multipartResolver(){CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();commonsMultipartResolver.setMaxInMemorySize(5242880);commonsMultipartResolver.setDefaultEncoding("utf-8");return commonsMultipartResolver;}@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(new MyDateConverter());}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/**");}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/head/**").addResourceLocations("/head/");}
}

5.6 WebConfig


import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;/*** 當類擴展了AbstractAnnotationConfigDispatcherServletlnitializer并將其部署到 Servlet容器時,* 容器會自動發現它,并用它來配置Servlet環境*/
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加載Spring配置類protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//加載SpringMVC配置類protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//設置SpringMVC請求地址攔截規則protected String[] getServletMappings() {return new String[]{"/"};}//設置post請求中文亂碼過濾器@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("utf-8");return new Filter[]{filter};}
}

5.7 刪除xml配置文件

xml配置

5.8 修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
</web-app>

5.9 測試

測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36636.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis-在springboot環境下執行lua腳本

文章目錄 1、什么lua2、創建SpringBoot工程3、引入相關依賴4、創建LUA腳本5、創建配置類6、創建啟動類7、創建測試類 1、什么lua “Lua”的英文全稱是“Lightweight Userdata Abstraction Layer”&#xff0c;意思是“輕量級用戶數據抽象層”。 2、創建SpringBoot工程 3、引入相…

新能源汽車CAN總線故障定位與干擾排除的幾個方法

CAN總線是目前最受歡迎的現場總線之一,在新能源車中有廣泛應用。新能源車的CAN總線故障和隱患將影響駕駛體驗甚至行車安全,如何進行CAN總線故障定位及干擾排除呢? 目前,國內機動車保有量已經突破三億大關。由于大量的燃油車帶來嚴峻的環境問題,因此全面禁售燃油車的日程在…

汽車租賃系統

摘 要 隨著汽車租賃市場的快速發展&#xff0c;為了提高汽車租賃服務的效率和用戶體驗&#xff0c;本論文設計與實現了一款基于Java的汽車租賃系統。 該系統采用B/S架構&#xff0c;利用JavaWeb技術和MySQL數據庫實現了車輛信息管理、在線車輛租賃、門店出車模塊、租賃訂單信息…

1. Tensorrt-llm 基礎

1.Tensorrt-llm安裝 os: ubuntu 22.04 1.1搭建docker 環境 切換到 root 用戶 sodu passwd root 更新apt sudo apt-get update --fix-missing 更新docker sudo apt-get upgrade docker-ce 安裝nvidia 容器運行時&#xff0c;避免如下錯誤 Error response from daemon…

Android Kotlin 中的閉包函數

閉包函數是現代編程語言中一個重要的概念&#xff0c;Kotlin 作為一種現代的 JVM 語言&#xff0c;自然也支持閉包函數。本文將詳細介紹閉包函數的概念、在Kotlin 中的使用方法&#xff0c;以及一些常見的應用場景。 什么是閉包函數&#xff1f; 閉包函數&#xff0c;也稱為閉…

每天一個項目管理概念之WBS

項目管理中的工作分解結構&#xff08;Work Breakdown Structure&#xff0c;簡稱WBS&#xff09;是規劃和管理項目的核心工具之一&#xff0c;它通過將復雜的項目任務細分為更小、更易管理的部分來提高項目執行的效率與效果。WBS不僅有助于明確項目范圍&#xff0c;還為時間管…

[RPI] istoreos安裝esphome

esphome可以提供了一個集成的編譯環境,同時他又可以通過無線方式更新firmware,這無疑方便了我們的開發工作。 istoreos商店沒有提供esphome,所以我們需要自己用‘類似’命令行的方式來安裝, 1. 拉取esphome鏡像 依次點擊左側邊欄Docker -> 鏡像,輸入esphome/esphome…

【LeetCode面試經典150題】117. 填充每個節點的下一個右側節點指針 II

一、題目 117. 填充每個節點的下一個右側節點指針 II - 力扣&#xff08;LeetCode&#xff09; 給定一個二叉樹&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每個 next 指針&#xff0c;讓這個指針指向其下一個右側節點。如果找不到下一個…

React@16.x(42)路由v5.x(7)常見應用場景(4)- 路由切換動畫

目錄 1&#xff0c;實現路由切換基礎樣式 2&#xff0c;使用 CSSTransition 添加動畫1&#xff0c;自定義動畫組件 *TransitionRoute.jsx*2&#xff0c;*App.jsx*3&#xff0c;樣式改動 3&#xff0c;注意點 通過一個例子來說明如何實現。 1&#xff0c;實現路由切換 基礎樣式…

[DDD] 領域驅動設計簡介

領域驅動設計 Domain Driven Design 1 DDD簡介 領域驅動設計&#xff08;Domain-Driven Design&#xff0c;簡稱DDD&#xff09;是一種軟件開發方法論&#xff0c;它強調軟件設計應緊密圍繞業務領域模型進行。DDD的核心思想是將實現與業務邏輯分離&#xff0c;通過深入理解和…

億發進銷存管理系統+:多終端無縫協同,實現經營銷售場景全覆蓋

億發軟件憑借產品、市場、業務的深入理解&#xff0c;在進銷存基礎上進行了延伸&#xff0c;推出多終端、一體化的“進銷存管理系統”多元產品矩陣。對企業經營中進貨、出貨、銷售、付款等進行全程跟蹤管理。有效輔助企業解決業務管理、銷售管理、庫存管理、財務管理等一系列問…

Java路徑操縱漏洞示例與解決賞析之一

示例代碼 public static List<File> findClassesInPackage(String codePath,String packageName, boolean recursive) {List<File> classFiles = new ArrayList<>();String packagePath = packageName.replace(., /);File directory = new File(codePath + &…

【大數據】—量化交易實戰案例雙均線策略(移動平均線)

聲明&#xff1a;股市有風險&#xff0c;投資需謹慎&#xff01;本人沒有系統學過金融知識&#xff0c;對股票有敬畏之心沒有踏入其大門&#xff0c;今天用另外一種方法模擬炒股&#xff0c;后面的模擬的實戰全部用同樣的數據&#xff0c;最后比較哪種方法賺的錢多。 量化交易…

【項目實訓】各種反爬策略及爬蟲困難點總結

在這里&#xff0c;我總結了本次項目的數據收集過程中遇到的反爬蟲策略以及一些爬蟲過程中容易出現問題的地方。 user-agent 簡單的設置user-agent頭部為瀏覽器即可&#xff1a; 爬取標簽中帶href屬性的網頁 對于顯示崗位列表的頁面&#xff0c;通常檢查其源代碼就會發現&…

深入理解鏈表:基礎概念、操作及應用

前言 鏈表&#xff08;Linked List&#xff09;是一種重要的數據結構&#xff0c;廣泛應用于各種算法和系統設計中。本文將詳細介紹鏈表的基本概念、類型、基本操作及其在實際編程中的應用&#xff0c;并使用C語言代碼示例進行說明。 鏈表的基本概念 鏈表是一種線性數據結構…

【數據結構】(C語言):動態數組

動態數組&#xff1a; 內存區域連續&#xff0c;即每個元素的內存地址連續。可用索引查看元素&#xff0c;數組[索引號]。指定位置刪除元素&#xff0c;該位置之后的元素全部往前移動一位。指定位置添加元素&#xff0c;從最后到該位置的元素全部往后移動一位。物理大小&#…

【保姆級講解ECMAScript和JavaScript之間的區別】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

mysql 升級到8.0

MySQL :: MySQL 8.0 Reference Manual :: 3.7 Upgrading MySQL Binary or Package-based Installations on Unix/Linux 2種升級方式&#xff1a; In-Place Upgrade &#xff1a; data目錄替換 Logical Upgrade&#xff1a; 通過 mysqldump 導出為sql文本后&#xff0c;導入…

全面國產化信創適配改造方案說明

一、概敘 系統的全面國產化適配改造需要從多個方面進行考慮&#xff0c;改造前需要進行充分的論證&#xff0c;在滿足具體業務場景的前提下&#xff0c;以確保系統的穩定性和安全性&#xff0c;同時還要考慮技術的發展&#xff0c;不斷優化和更新。因此全面國產化適配改造也面臨…

Redis集群安裝(三主三從一哨兵)

Redis集群安裝&#xff08;三主三從一哨兵&#xff09; 一&#xff0c;搭建環境 ? 在三臺服務器上分別搭建redis并測試是否能啟動&#xff08;搭建方法&#xff09; 二&#xff0c;Redis cluster三主三從 配置環境變量 vim /etc/profile #添加如下內容 export REDIS_HOME…