参考教程:B站狂神说Java
1 MAVEN依赖及静态资源过滤
<dependencies>
<!-- 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/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</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/javax.servlet.jsp.jstl/jstl -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
<!--静态资源过滤-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2 Spring整合Mybatis
2.1 mybatis-config.xml
- 存放Mybatis特有的设置,如别名等(这些设置也可以在spring配置文件中配置)
<?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>
<!--别名-->
<typeAliases>
<package name="com.ccong.pojo"/>
</typeAliases>
<mappers>
<package name="com.ccong.mapper"/>
</mappers>
</configuration>
2.2 mapper接口
public interface UserMapper {
//查询所有用户
public List<User> queryAllUser();
//根据id查询一个用户
public User queryUserById(int id);
//添加一个用户
public int insertUser(User user);
//修改一个用户
public int updateUserById(User user);
//删除一个用户
public int deleteUserById(int id);
}
2.3 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccong.mapper.UserMapper">
<select id="queryAllUser" resultType="user">
select * from user;
</select>
<select id="queryUserById" resultType="user" parameterType="int">
select * from user u where u.id = ${id};
</select>
<insert id="insertUser" parameterType="user">
insert into user (name, pwd, creat_time) values (${name}, ${pwd}, NOW());
</insert>
<update id="updateUserById" parameterType="user">
update user set name = ${name}, pwd = ${pwd} where id = ${id};
</update>
<delete id="deleteUserById" parameterType="int">
delete from user where id = ${id};
</delete>
</mapper>
2.4 spring-mapper.xml(Spring整合Mybatis的配置文件)
- dataSource中的属性为上面database.properties中对应的属性
<!--读取配置文件-->
<context:property-placeholder location="classpath:database.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--SqlSessionFactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<!--绑定mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
2.5 实现mapper接口的三种方法
2.5.1 使用SqlSessionTemplate
- spring-mapper.xml:
<!--方式一:使用SqlSessionTemplate-->
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
- UserMapperImpl1:
- 使用自动装配时需将@Autowired放在set方法上,否则无法获取userMapper
@Repository
public class UserMapperImpl1 implements UserMapper {
private SqlSessionTemplate sqlSessionTemplate;
private UserMapper userMapper;
@Autowired
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
userMapper = sqlSessionTemplate.getMapper(UserMapper.class);
}
@Override
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
@Override
public User queryUserById(int id) {
return userMapper.queryUserById(id);
}
@Override
public int insertUser(User user) {
return userMapper.insertUser(user);
}
@Override
public int updateUserById(User user) {
return userMapper.updateUserById(user);
}
@Override
public int deleteUserById(int id) {
return userMapper.deleteUserById(id);
}
}
2.5.2 继承SqlSessionDaoSupport
- UserMapperImpl2:
- SqlSessionDaoSupport本质与第一种方法一样,只是SqlSessionDaoSupport帮我们完成了SqlSessionTemplate的装配,并提供了一系列方法
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> queryAllUser() {
return getSqlSession().getMapper(UserMapper.class).queryAllUser();
}
@Override
public User queryUserById(int id) {
return getSqlSession().getMapper(UserMapper.class).queryUserById(id);
}
@Override
public int insertUser(User user) {
return getSqlSession().getMapper(UserMapper.class).insertUser(user);
}
@Override
public int updateUserById(User user) {
return getSqlSession().getMapper(UserMapper.class).updateUserById(user);
}
@Override
public int deleteUserById(int id) {
return getSqlSession().getMapper(UserMapper.class).deleteUserById(id);
}
}
- spring-mapper.xml:
- 由于本质与第一种方法一样,因此也需要注入SqlSessionFactory
<!--方式二:实现类继承SqlSessionDaoSupport并注入sqlSessionFactory-->
<bean id="userMapperImpl2" class="com.ccong.mapper.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
2.5.3 通过扫描接口动态实现和注入
- spring-mapper.xml:
- 通过该配置可自动完成实现和注入,该配置会产生一个与接口同名的bean,并可用与自动装配
<!--方式三:配置mapper接口扫描包,动态实现接口并注入-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--扫描包-->
<property name="basePackage" value="com.ccong.mapper"/>
</bean>
2.6 Spring AOP完成声明式事务织入
- service接口
public interface UserService {
//查询所有用户
public List<User> queryAllUser();
//根据id查询一个用户
public User queryUserById(int id);
//添加一个用户
public int insertUser(User user);
//修改一个用户
public int updateUserById(User user);
//删除一个用户
public int deleteUserById(int id);
}
- UserServiceImpl
- 实现类中的UserMapper自动装配的时上面第三种方法生成的userMapper对象
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
@Override
public User queryUserById(int id) {
return userMapper.queryUserById(id);
}
@Override
public int insertUser(User user) {
return userMapper.insertUser(user);
}
@Override
public int updateUserById(User user) {
return userMapper.updateUserById(user);
}
@Override
public int deleteUserById(int id) {
return userMapper.deleteUserById(id);
}
}
- spring-service.xml
<!--配置声明式事务-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--定义事务为通知-->
<tx:advice transaction-manager="transactionManager" id="advice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--aop完成事务织入-->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.ccong.service.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config>
3 Spring整合SpringMVC
3.1 web.xml
<!--spring mvc核心配置-->
<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:applicationContext.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>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>
<!--session过期时间-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
3.2 spring-mvc.xml
<mvc:annotation-driven/>
<context:component-scan base-package="com.ccong.controller"/>
<!--静态资源过滤-->
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
3.3 Controller
@RestController
public class UserController {
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@GetMapping("/user/query")
public String queryAll(){
return userService.queryAllUser().toString();
}
}
4 整合3个spring配置文件
- applicationContext.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"
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">
<context:component-scan base-package="com.ccong"/>
<import resource="spring-mapper.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>