SSM框架整合笔记
源地址 :https://blog.csdn.net/qq_41112238/article/details/104180699
ps.不要出门 戴好口罩
搭建环境
创建数据库和表
创建test数据库,建立一张账户表并插入3条数据记录
CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), money DOUBLE ); INSERT INTO account(NAME,money) VALUES('kobe',1000),('james',2000),('davis',3000);
创建maven工程
新建一个maven工程
在最后一步点击+
号添加archetypeCatalog internal
属性键值对,可以提高项目创建速度。
创建完成后,修改pom.xml文件,首先将编译版本改为1.8
之后导入相关依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring框架相关的依赖 --> <!-- aop相关 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- mvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- 单元测试 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- 事务 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!-- mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!-- jsp --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- jstl --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 日志相关 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.6</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.0</version> </dependency> <!-- c3p0数据库连接池 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency>
之后在main文件夹下创建目录用来保存源代码和配置文件
创建和数据库account表对应的实体类Account
public class Account implements Serializable { 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; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } }
在resources目录下导入log4j配置文件
log4j.appender.std=org.apache.log4j.ConsoleAppender log4j.appender.std.Target=System.err log4j.appender.std.layout=org.apache.log4j.PatternLayout log4j.appender.std.Conversion=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.Conversion=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.rootLogger=debug,std,file
整合SpringMVC
1 创建web控制器
AccountController类:
@Controller @RequestMapping("/account") public class AccountController { @RequestMapping("/findAll") public String findAll(){ return "success"; } }
2 配置mvc
先在webapp目录下创建css/img/js文件夹存放静态资源,在WEB-INF下新建pages文件夹存放jsp页面
在resources目录下创建mvc配置文件spring-mvc.xml
spring-mvc.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: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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 开启包扫描 --> <context:component-scan base-package="com"/> <!-- 注册视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀配置 --> <property name="prefix" value="/WEB-INF/pages/"/> <!--后缀配置 --> <property name="suffix" value=".jsp"/> </bean> <!-- 忽略静态资源 --> <mvc:resources mapping="/img/**" location="/img/"/> <mvc:resources mapping="/js/**" location="/js/"/> <mvc:resources mapping="/css/**" location="/css/"/> <!-- 开启注解驱动 --> <mvc:annotation-driven/> </beans>
3 配置web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>ssm</display-name> <!-- 配置编码过滤器 --> <filter> <filter-name>encodingFilter</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>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置前端控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 读取springmvc.xml --> <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>dispatcherServlet</servlet-name> <!-- /* 匹配所有资源 / 匹配除jsp之外的所有资源 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 服务器启动主页 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4 测试
在pages文件夹下新建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>启动成功</h1> </body> </html>
修改index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2>整合ssm</h2> <a href="account/findAll">test</a> </body> </html>
配置tomcat服务器
启动测试
点击test
优化SpringMVC整合(注入业务层)
1 创建service接口和实现类
接口:
public interface AccountService { //查询所有账户 List<Account> findAll(); }
实现类:
@Service("accountService") public class AccountServiceImpl implements AccountService { @Override public List<Account> findAll() { System.out.println("accountService"); return null; } }
2 在控制器中注入service
使用@Autowired注解:
@Controller @RequestMapping("/account") public class AccountController { @Autowired private AccountService accountService; @RequestMapping("/findAll") public String findAll(){ accountService.findAll(); System.out.println("accountController"); return "success"; } }
3 测试
成功调用了service层
整合Mybatis
1 创建dao接口
不需要具体实现类(由mybatis实现)
@Repository("accountDao") public interface AccountDao { //查询全部账户 @Select("select * from account") List<Account> findAll(); }
2 配置mybatis
在resources目录下新建mybatis配置文件sqlMapConfig.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> <environments default="mysql"> <!-- 默认开发环境 --> <environment id="mysql"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///test?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <!-- 使用的是注解 --> <mappers> <!-- 开启包扫描 该包下所有的dao接口都可以使用 --> <package name="com.dao"/> </mappers> </configuration>
3 测试
新建test-java目录,并标记为测试目录
新建一个测试类
public class MybatisTest { @Test public void testFindAll(){ SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(MybatisTest.class.getClassLoader(). getResourceAsStream("sqlMapConfig.xml")); SqlSession sqlSession = factory.openSession(); AccountDao accountDao = sqlSession.getMapper(AccountDao.class); List<Account> accounts = accountDao.findAll(); System.out.println(accounts); } }
进行测试:
优化mybatis整合
1 存在的问题
- 连接池是mybatis自带的 =>通过spring管理连接池
- sqlSessionFactory还是自己创建的 =>通过spring管理factory
- dao包扫描还是由mybatis加载的 =>通过spring扫描包
- 事务还是由mybatis管理的 =>通过spring管理事务
2 创建spring配置文件
在resources目录下新建springconfig文件spring-service.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" 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"> <!-- 注册数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///test?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value=""/> </bean> <!-- 注册sqlSessionFactory --> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入上面配置的数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 建议配置 导入sqlMapConfig.xml --> <property name="configLocation" value="classpath:sqlMapConfig.xml"/> </bean> <!--扫描dao接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dao"/> </bean> <!-- 配置事务 --> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务规则 --> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" read-only="false"/> <tx:method name="find*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 配置aop --> <aop:config> <aop:pointcut id="pc1" expression="execution(* com.service.*.*(..))"/> <aop:advisor advice-ref="advice" pointcut-ref="pc1"/> </aop:config> </beans>
3 在web.xml中配置
将初始化加载的配置文件改为spring*,可以匹配spring-mvc.xml和spring-service.xml
整合结果
查询账户
修改accountServiceImpl
@Service("accountService") public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; @Override public List<Account> findAll() { List<Account> accounts = accountDao.findAll(); return accounts; } }
修改accountController
@Controller @RequestMapping("/account") public class AccountController { @Autowired private AccountService accountService; @RequestMapping("/findAll") public String findAll(){ List<Account> accounts = accountService.findAll(); request.setAttribute("accounts",accounts); return "success"; } }
启动服务器,进行测试
<stron>
</stron>
添加账户
修改dao接口,增加添加账户的接口
使用#{属性名}
获取对应的属性值
//添加账户 @Insert("insert into account(name,money) values (#{name},#{money})") void add(Account account);
修改service接口和实现类
//增加账户 void add(Account account);
@Override public void add(Account account) { accountDao.add(account); }
修改控制器
@RequestMapping("/add") public String add(Account account){ accountService.add(account); return "add"; }
添加add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>添加成功</h1> </body> </html>
修改index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2>整合ssm</h2> <a href="account/findAll">查询所有账户</a> <form action="account/add" method="post"> name:<input type="text" name="name"><br> money:<input type="text" name="money"><br> <input type="submit" value="add account"><br> </form> </body> </html>
启动服务器,填写表单,点击add account按钮。
添加成功后,返回上一步,再次查询
SSM整合小结
Controller
创建controller,定义方法,添加注解
创建spring-mvc.xml
- 开启包扫描 - 注册视图解析器 - 忽略静态资源 - 配置注解驱动
配置web.xml
- 配置前端控制器 - 配置编码过滤器
注入service
Service
创建service接口,实现类,注册(xml或注解)
创建spring-service.xml
- 注入数据源
- 配置事务管理器和事务
- 配置aop
注入dao
Dao
- 创建dao接口,定义方法,添加注解
- 注册数据源(4个基本项)
- 注册sqlSesisonFactory
- 开启dao包扫描(MapperScannerConfigurer)