Spring和SpringMVC的整合是无缝整合。而MyBatis是第三方。
原始方式整合
1、创建数据表
这里创建了一个account表,里面有id、name、money字段。
2、创建maven工程
3、导入坐标
spring-context、aspectj、spring-tx【事务相关】、spring-test【测试相关】、spring-webmvc、servlet-api、jsp-api;
mybatis、mybatis-spring【mybatis整合spring时使用】、mysql-connetcor-java、c3p0;
junit、jstl
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.8.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.5</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies>
4、编写实体类
Account.java
package com.learn.domain;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;}}
5、编写Mapper接口
AccountMapper.java
package com.learn.mapper;import com.learn.domain.Account;import java.util.List;public interface AccountMapper {public void save(Account account);public List<Account> findAll();}
6、编写Service接口
AccountService.java
package com.learn.service;import com.learn.domain.Account;import java.util.List;public interface AccountService {public void save(Account account);public List<Account> findAll();}
7、编写Service接口实现
AccountServiceImpl.java
package com.learn.service.impl;import com.learn.domain.Account;import com.learn.mapper.AccountMapper;import com.learn.service.AccountService;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.springframework.stereotype.Service;import java.io.IOException;import java.io.InputStream;import java.util.List;@Service("accountService")public class AccountServiceImpl implements AccountService {public void save(Account account) {try {InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);mapper.save(account);sqlSession.commit();sqlSession.close();}catch (IOException e){e.printStackTrace();}}public List<Account> findAll() {//没问题返回List,有问题返回nulltry {InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);List<Account> accountList = mapper.findAll();sqlSession.close();return accountList;}catch (IOException e){e.printStackTrace();}return null;}}
8、编写Controller
AccountController.java
package com.learn.controller;import com.learn.domain.Account;import com.learn.service.AccountService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;import java.util.List;@Controller@RequestMapping("/account")public class AccountController {//注入service对象@Autowiredprivate AccountService accountService;//设置响应数据的编码格式.即保存成功可以正常显示,而不是???@RequestMapping(value = "/save",produces = "text/html;charset=UTF-8")@ResponseBody//保存,这里实际上应该跳转到某个页面,这里先不那么设置public String save(Account account){accountService.save(account);return "保存成功";}//查询@RequestMapping("/findAll")public ModelAndView findAll(){List<Account> accountList = accountService.findAll();ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("accountList",accountList);modelAndView.setViewName("accountList");return modelAndView;}}
9、编写表单添加页面
save.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><h1>添加账户信息表单</h1><form name="accountForm" action="${pageContext.request.contextPath}/account/save" method="post">账户名称:<input type="text" name="name"><br>账户金额:<input type="text" name="money"><br><input type="submit" value="保存"><br></form></body></html>
10、编写列表展示页面
accountList.jsp,这里需要使用到el表达式
<%@ 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><h1>展示账户数据列表</h1><table><tr><th>账户id</th><th>账户名称</th><th>账户金额</th></tr><c:forEach items="${accountList}" var="account"><tr><td>${account.id}</td><td>${account.name}</td><td>${account.money}</td></tr></c:forEach></table></body></html>
11、配置文件
Spring配置文件
applicationContext.xml
这个配置文件只管理service和mapper,不管理controller,需要exclude一下
<?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:context="http://www.springframework.org/schema/context"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/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--组件扫描 扫描service和mapper--><context:component-scan base-package="com.learn"><!--需要排除controller扫描,这个需要交给springmvc--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan></beans>
SpringMVC配置文件
spring-mvc.xml
配置组件扫描【主要扫描controller】、配置mvc注解驱动、配置内部资源视图解析器、开放静态资源【因为如果pattern是*,但是有些静态资源无法解析,需要放行】
<?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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"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/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--组件扫描 主要扫描controller--><context:component-scan base-package="com.learn.controller"></context:component-scan><!--配置mvc注解驱动--><mvc:annotation-driven></mvc:annotation-driven><!--配置内部资源视图解析器--><bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages"/><property name="suffix" value=".jsp"/></bean><!--开放静态资源访问权限--><mvc:default-servlet-handler/></beans>
Mybatis映射文件
AccountMapper.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.learn.mapper.AccountMapper"><insert id="save" parameterType="account">insert into account values (#{name},#{money});</insert><select id="findAll" resultType="account">select * from account;</select></mapper>
MyBatis核心文件
SqlMapperConfig.xml
<?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><properties resource="jdbc.properties"></properties><!--定义别名--><typeAliases><!--<typeAlias type="com.learn.domain.Account" alias="account"></typeAlias>--><!--也可以使用扫包的方式,别名默认是实体名称或者实体名称的首字母小写--><package name="com.learn.domain"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><package name="com.learn.mapper"/></mappers></configuration>
数据库连接信息文件
jdbc.properties
Web.xml文件
web.xml
idea默认是2.3的,可以升个级
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"></web-app>
在web.xml文件中,需要配置spring监听器、springmvc前端控制器和乱码过滤器。
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><!--配置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><!--springmvc前端控制器--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</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></web-app>
日志文件
log4j.xml或者log4j.properties
### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=c:\mylog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=debug, stdout
12、测试
实际上这里有个问题,就是在保存中文的时候,显示的都是???,不知道是什么原因,是不是web.xml没有配置正确导致的。
