1、整合前准备
1.1、创建数据库和表
数据库为:ssm,表为:students
代码语言:javascript复制create database ssm;
CREATE TABLE `students` (
`sid` int(11) DEFAULT NULL,
`sname` varchar(20) DEFAULT NULL,
`sex` varchar(2) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `students` VALUES ('1', '张三', '男', '19'), ('2', '李四', '男', '20'), ('3', '张红', '女', '19'), ('4', '张八', '男', '18'), ('5', '三李', '男', '19'), ('6', '王六', '女', '20'), ('7', '刘红', '女', '18');
1.2、创建新项目
1.2.1、回顾maven工程创建
pom工程: 用在创建父工程或聚合工程,用作jar包的版本控制。我们必须指明这个聚合工程的打包方式为pom。
war工程: 发布在服务器上的工程,将会打包成war。我们需要指明这个项目为一个web工程。
jar工程: 用作jar包使用,将会把项目打包成jar。如果我们不去指明项目,默认的就是打包成jar工程,我们也可以添加指明打包方式为jar。
1.2.2、新项目
maven创建一个ssm001项目
1.2.3、导入jar包
代码语言:javascript复制<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<mysql.version>8.0.11</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
<spring.version>5.2.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</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-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<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>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.3</version>
</dependency>
</dependencies>
1.2.4、创建包结构
1.2.5、创建javabean
代码语言:javascript复制import java.io.Serializable;
public class Students implements Serializable {
private int sid;
private String sname;
private String sex;
private int age;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Students{"
"sid=" sid
", sname='" sname '''
", sex='" sex '''
", age=" age
'}';
}
}
1.2.6、创建持久层
代码语言:javascript复制//接口IStudentsDAO.java
public interface IStudentsDAO {
List<Students> findAll();
Students findById(int sid);
int addStudents(Students students);
int updateStudents(Students students);
int deleteStudents(int sid);
int addCount();
List<Students> findByName(String sname);
}
1.2.7、创建业务层
代码语言:javascript复制//接口IStudentsService.java
public interface IStudentsService {
List<Students> findAll();
Students findById(int sid);
int addStudents(Students students);
int updateStudents(Students students);
int deleteStudents(int sid);
int addCount();
List<Students> findByName(String sname);
}
//实现类StudentsServiceImpl.java
@Service("studentsServiceImpl")
public class StudentsServiceImpl implements IStudentsService {
@Override
public List<Students> findAll() {
System.out.println("查询学生的所有信息!");
return null;
}
@Override
public Students findById(int sid) {
System.out.println("通过SID查询学生的信息!");
return null;
}
@Override
public int addStudents(Students students) {
System.out.println("增加学生的信息!");
return 0;
}
@Override
public int updateStudents(Students students) {
System.out.println("修改学生的信息!");
return 0;
}
@Override
public int deleteStudents(int sid) {
System.out.println("删除学生的信息!");
return 0;
}
@Override
public int addCount() {
System.out.println("通过SID查询学生的信息!");
return 0;
}
@Override
public List<Students> findByName(String sname) {
System.out.println("通过NAME查询学生的信息!");
return null;
}
}
1.2.8、创建控制层
代码语言:javascript复制@Controller("studentsController")
public class StudentsController {
@RequestMapping("/findAll")
public String findAll(){
System.out.println("调用到了控制层-Controller");
return "list";
}
}
2、整合Spring
2.1、配置applicationContext.xml
代码语言:javascript复制<?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: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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启注解的扫描,希望处理service和dao,controller不需要Spring框架去处理-->
<context:component-scan base-package="com.tyschool.ssm001" >
<!--配置哪些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
</beans>
2.2、测试spring框架
2.2.1、创建包
2.2.2、创建测试文件
STest.java
代码语言:javascript复制public class STest {
@Test
public void test1(){
// 加载配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// 获取对象
IStudentsService iStudentsService=(IStudentsService) ac.getBean("studentsServiceImpl");
// 调用方法
iStudentsService.findAll();
}
}
3、整合SpringMVC
3.1、前置控制器
web.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!--配置SpringMVC核心,前置控制器DispatcherServlet -->
<servlet>
<servlet-name>SpringMVCDispathcherServlet</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>
<!--配置servlet的对象的创建时间点:应用加载时创建。取值只能是非0正整数,表示启动顺序-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--前置控制器,映射所有地址-->
<servlet-mapping>
<servlet-name>SpringMVCDispathcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置 springMVC 编码过滤器 -->
<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>
<!-- 启动过滤器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3.2、配置springmvc.xml
/resource/springmvc.xml
代码语言:javascript复制<?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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--配置扫描器,扫描注解,只扫描Controller注解-->
<context:component-scan base-package="com.tyschool.ssm001">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--配置视图解析器,配置前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--过滤静态资源 -->
<mvc:resources mapping="/css/" location="/css/**"/>
<mvc:resources mapping="/images/" location="/images/**"/>
<mvc:resources mapping="/js/" location="/js/**"/>
<!--开启springmvc注解支持-->
<mvc:annotation-driven/>
</beans>
3.3、配置view层
3.3.1、index.jsp
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试</title>
</head>
<body>
<a href="findAll">查看学生的所有信息</a>
</body>
</html>
3.3.2、list.jsp
/pages/list.jsp
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
到了这里
</body>
</html>
4、Spring整合SpringMVC
4.1、问题
applicationContext.xml在前面启动服务的时候并没有被读取,如何才能读取applicationContext.xml这个文件呢?
在测试案例(STest.java)中,我们要去读取applicationContext.xml文件,而在实际使用过程中(启动tomcat服务器时),我们并没有调用到applicationContext.xml文件。所有我们要通过监听器方式,让我们的程序去读取applicationContext.xml文件
4.2、配置web.xml
代码语言:javascript复制<!--配置spring监听器,默认只加载/WEB-INF目录下的applicationContext.xml配置文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--设置配置文件的路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
4.3、修改控制层
StudentsController.java
代码语言:javascript复制@Controller("studentsController")
public class StudentsController {
@Autowired
@Qualifier(value="studentsServiceImpl")
private IStudentsService iStudentsService;
@RequestMapping("/findAll")
public String findAll(){
System.out.println("调用到了控制层-Controller");
iStudentsService.findAll();
return "list";
}
}
5、MyBatis整合
5.1、通过注解完成数据库操作
IStudentsDAO.java
代码语言:javascript复制public interface IStudentsDAO {
@Select("select * from students")
@Results(id="studentsMap",value={
@Result(id=true,column = "sid",property = "sid"),
@Result(column = "sname",property = "sname"),
@Result(column = "sex",property = "sex"),
@Result(column = "age",property = "age")
})
List<Students> findAll();
@Select("select * from students where sid=#{sid}")
@ResultMap("studentsMap")
Students findById(int sid);
@Insert("insert into students(sname,sex,age)values(#{sname},#{sex},#{age})")
@SelectKey(keyColumn = "sid",keyProperty="sid",resultType = Integer.class,before = false,statement = {"select last_insert_id()"})
int addStudents(Students students);
@Update("update students set sname=#{sname},sex=#{sex},age=#{age} where sid=#{sid}")
int updateStudents(Students students);
@Delete("delete from students where sid=#{sid}")
int deleteStudents(int sid);
@Select("select count(*) from students")
int addCount();
@Select("select * from students where sname like #{sname}")
List<Students> findByName(String name);
}
5.2、编写配置文件
SqlMapConfig.xml
代码语言:javascript复制<?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="db.properties"></properties>
<environments default="mysql">
<environment id="mysql">
<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>
<!-- <mapper class="com.tyschool.ssm001.dao.IStudentsDAO"></mapper>-->
<package name="com.tyschool.ssm001.dao"/>
</mappers>
</configuration>
db.properties
代码语言:javascript复制jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.123:3306/mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=Root12345
5.3、编写测试类
STest1.java
代码语言:javascript复制public class STest1 {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IStudentsDAO iStudentsDAO;
@Test
public void findAll(){
List<Students> students = iStudentsDAO.findAll();
for(Students s : students) {
System.out.println(s);
}
}
@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
session.close();
in.close();
}
@Before//在测试方法执行之前执行
public void init()throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建 SqlSession 工厂对象
factory = builder.build(in);
//获取代理对象
session=factory.openSession();
//4、初始化userDao
iStudentsDAO=session.getMapper(IStudentsDAO.class);
}
}
6、Spring整合Mybatis
6.1、修改配置
applicationContext.xml
代码语言:javascript复制<!--加入配置文件db.properties-->
<context:property-placeholder location="classpath:db.properties"/>
<!--spring整合mybatis配置-->
<!--配置连接池,数据源,C3P0-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 数据库基本信息配置 -->
<property name = "driverClass" value = "${jdbc.driver}" />
<property name = "jdbcUrl" value = "${jdbc.url}" />
<property name = "user" value = "${jdbc.username}" />
<property name = "password" value = "${jdbc.password}" />
</bean>
<!--配置sqlSessionFactory工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置DAO所在的包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.tyschool.ssm001.dao"/>
</bean>
6.2、修改dao
IStudentsDAO.java
加上持久层注解
代码语言:javascript复制@Repository("iStudentsDAO")
6.3、修改service
代码语言:javascript复制@Autowired
@Qualifier("iStudentsDAO")
private IStudentsDAO iStudentsDAO;
@Override
public List<Students> findAll() {
System.out.println("查询学生的所有信息!");
return iStudentsDAO.findAll();
}
6.4、修改controller
代码语言:javascript复制@RequestMapping("/findAll")
public String findAll(Model model){
List<Students> list=iStudentsService.findAll();
model.addAttribute("list",list);
return "list";
}
6.5、修改list.jsp
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>查看所有用户信息</title>
</head>
<body>
${list}
</body>
</html>
7、配置事务
7.1、配置事务
applicationContext.xml
引入前缀,在配置
代码语言:javascript复制<!--配置Spring框架声明式事务管理-->
<!--配置事务管理器-->
<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="find*" read-only="true"/>
<tx:method name="*" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!--配置AOP增强-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.tyschool.ssm001.service.impl.*.*(..))"/>
</aop:config>
7.2、启动测试
http://localhost:8080/ssm001/index.jsp