原始的整合方式
整合步骤:
数据库和数据表的准备
在数据库
ssm
中创建一个account
数据表:sqlcreate database ssm; create table account { id int primary key auto_increment, name varchar(100), money double(7, 2) }
创建
Maven
工程,该工程的大致文件结构为:javasrc ├── main │ └── java │ ├── com.jlc │ │ ├── controller // Web层文件夹 │ │ │ ├── AccountController │ │ ├── domain // 实体定义文件夹 │ │ │ ├── Account │ │ ├── mapper // 方法映射文件夹 │ │ │ ├── AccountMapper │ │ ├── service // 业务层 │ │ │ ├── AccountService │ │ │ ├── impl │ │ │ │ ├── AccountServiceImpl │ └── resources │ ├── com.jlc.mapper // mybatis配置文件夹,存放具体的映射文件 │ │ │ ├── AccountMapper.xml // AccountMapper方法的映射配置文件 │ ├── applicationContext.xml // Spring配置文件 │ ├── spring-mvc.xml // SpringMVC配置文件 │ ├── jdbc.properties // 数据库信息配置文件 │ ├── log4j.properties // 日志信息相关配置文件 │ ├── sqlMapConfig.xml // MyBatis核心配置文件 │ └── webapp // 传统Web资源 │ ├── WEB-INF │ │ ├── web.xml │ │ ├── pages │ │ │ ├── accountList.jsp // 查询页面 │ ├── index.jsp │ ├── save.jsp // 添加页面 ├── test │ └── java │ └── resources jlc_ssm.imi pom.xml
在
pom.xml
文件中导入具体配置的坐标xml<dependencies> <!--spring相关--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <!--上下文--> <version>5.0.5RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <!--aop织入--> <version>1.8.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <!--jdbc模板--> <version>5.0.5RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <!--事务相关--> <version>5.0.5RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <!--测试相关--> <version>5.0.5RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <!--SpringMVC相关--> <version>5.0.5RELEASE</version> </dependency> <!--servlet和jsp相关--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> <!--mybatis相关--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!--真正整合时使用--> <version>5.1.6</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!--junit相关--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>jst1</groupId> <artifactId>jst1</artifactId> <version>1.2</version> </dependency> </dependencies>
在
src/main/java/com/jlc/domain
中编写具体的实体类javapackage com.jlc.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() { this.money = money; } }
在
src/main/java/com/jlc/mapper
中编写具体的实体类的接口(mapper
又可以理解为Dao
层)javapackage com.jlc.mapper; import com.jlc.domain.Account; import java.util.List; public interface AccountMapper { // 保存账户数据 public void save(Account account); // 查询账户数据 public List<Account> findAll(); }
编写
Service
接口(业务层接口)javapackage com.jlc.service; import com.jlc.domain.Account; import java.util.List; public interface AccountService { public void save(Account account); // 保存账户数据 public List<Account> findAll(); // 查询账户数据 }
编写
Service
接口的实现类javapackage com.jlc.service.impl; import com.jlc.domain.Account; import com.jlc.service.AccountService; import java.util.List; @Service("accountService") public class AccountServiceImpl implements AccountService { @Override public void save(Account account) { try { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class); accountMapper.save(account); sqlSession.commit(); sqlSession.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public List<Account> findAll() { try { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class); List<Account> accountList = mapper.findAll(); sqlSession.close(); return accountList; } catch (IOException e) { e.printStackTrace(); } } }
编写
Controller
(编写Web
层)javapackage com.jlc.controller; import com.jlc.domain.Account; 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; @Controller @RequestMapping("/account") public class AccountController { @Autowired private AccountService accountService; // 保存 @RequestMapping("/save") @ResponseBody // 表示字符串直接展示 public String save(Account account) { accountService.save(account); return "save success"; } // 查询 @RequestMapping("/findAll") public ModelAndView findAll() { List<Account> accountList = accountService.findAll(); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("accountList"); modelAndView.addObject("accountList", accountList); return modelAndView; } }
编写相应的页面
添加的表单页面
save.jsp
html<%@ 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>
列表展示页面
accountList.jsp
html<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>展示账户数据列表</h1> <table border="1"> <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>
编写相应的配置文件
Spring
配置文件:applicationContext.xml
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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 组件扫描 扫描service和mapper --> <context:component-scan base-package="com.jlc"> <!--排除对controller的扫描--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"> </context:component-scan> </beans>
SpringMVC
配置文件:spring-mvc.xml
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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Controller的组件扫描 --> <context:component-scan base-package="com.jlc.controller"/> <!--配置mvc的注解驱动--> <mvc:annotation-driven/> <!--配置内部资源视图解析器--> <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <!--配置前缀--> <property name="suffix" value=".jsp"></property> <!--配置后缀--> </bean> <!--开发静态资源的访问权限--> <mvc:default-servlet-handler></mvc:default-servlet-handler> </beans>
MyBatis
映射文件:AccountMapper.xml
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.jlc.mapper.AccountMapper"> <insert id="save" parameterType="account"> insert into account values(#{id},#{name},#{money}) </insert> <select id="findAll" resultType="account"> select * from account </select> </mapper>
MyBatis
核心文件:sqlMapConfig.xml
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> <!--加载jdbc.properties文件--> <properties resource="jdbc.properties"></properties> <!--定义别名--> <typeAliases> <!--方式一,一个一个的配置别名--> <typeAlias type="com.jlc.domain.Account" alias="account"></typeAlias> <!--方式二,通过扫包的方式进行别名的配置,包下所有的实体都使用实体类作为别名--> <package name="com.jlc.domain"></package> </typeAliases> <!--配置环境--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <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> <!--方式一:一个一个进行加载--> <mapper resource="com/jlc/mapper/AccountMapper.xml"></mapper> <!--方式二,通过扫包的方式进行别名的配置,可以进行统一的加载--> <package name="com.jlc.mapper"></package> </mappers> </configuration>
数据库连接信息文件:
jdbc.properties
propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=root
Web.xml
文件:web.xml
xml<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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_2_5.xsd" id="WebApp_ID"> <!--配置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.properties
properties#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/kuang.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
测试数据的添加操作和查询操作
添加操作
运行程序,在浏览器地址栏输入:
localhost:8080/save.jsp
在出现的表单中输入具体的信息,再提交表单数据
成功提交,页面显式:
save success
,同时数据库中新增了一条数据查询操作
运行程序,在浏览器地址栏输入:
localhost:8080/account/findAll
出现表格信息