系列文章目录
1.spring 系列文章
2.springmvc 系列文章
3.mtbatis 系列文章
前言
常见的javaee三层结构,表现层、业务层、数据层,这三层都可以分别用springmvc、spring、mybatis来协助搭建和开发,借助springmvc主要帮助在于可以协助我们统一的、简易化的对请求进行处理和响应。借助spring主要使用IoC和Aop,帮助我们创建和管理对象,对事物的管理和快速的对方法的增强,这些其实我们自己也可以做,但个人在使用到spring后,确实能明显的感受到代码的简化和编码效率的提高,完全可以专注在逻辑上的编码,其他的就可以都丢给spring帮我们管理。mybatis就是完全替代jdbc了,只需配置好映射关系和sql语句,就可以投入使用了。
我个人在整合SSM框架时,主要遇到的两个难点:
①spring整合mybatis,需要把mybatis的相关对象的创建都交给springIoC来管理。
②spring配置文件的加载。
一、环境搭建
1.springmvc环境单独搭建
tomcat、servlet、jsp项目
pom文件
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</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-web</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-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<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>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
先用到springmvc先搭建好表现层
springmvc的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<!--告诉springmvc需要扫描哪些位置的注解-->
<context:component-scan base-package="com.mediacomm">
<!--告诉springmvc只需要关注哪些注解-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--过滤静态资源-->
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<!--开启SpringMVC注解的支持-->
<mvc:annotation-driven/>
</beans>
注意这里我已经用到spring的注解来实现创建对象和依赖注入了
@Controller
@RequestMapping("/request")
public class First {
@Autowired
UserServiceImpl userService;
@RequestMapping(path = "/findAll")
public String findAllUser(){
System.out.println("执行findall.......");
List<User> users = userService.findAllUser();
for (User user: users
) {
System.out.println(user);
}
return "success";
}
@RequestMapping(path = "/addUser")
public String addUser(User user){
System.out.println(user);
userService.saveUser(user);
return "success";
}
}
主页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2><br>
<a href="request/findAll">查找所有用户</a><br>
<form action="request/addUser" method="post">
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
地址:<input type="text" name="address"><br>
存款:<input type="text" name="money"><br>
<input type="submit" name="提交"><br>
</form>
</body>
</html>
2.mybatis环境单独搭建
注意这里我已经用到spring的注解来实现创建对象和依赖注入了
dao层
@Repository
public interface UserDao {
@Select("select * from user")
List<User> findAll();
@Insert("insert into user(username,password,address,money) values(#{username},#{password},#{address},#{money})")
void insertUser(User user);
}
service层
@Service("userService")
public class UserServiceImpl {
@Autowired
private UserDao userDao;
public List<User> findAllUser(){
return userDao.findAll();
}
public void saveUser(User user){
userDao.insertUser(user);
}
}
二、spring整合mybatis
一个配置文件搞定
<?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">
<context:component-scan base-package="com.mediacomm">
<!--这里是配置了个忽略属性,忽略指定的注解,这样不会被创建两次,因为在springmvc中用到了@Controller已经为我们创建了-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--Spring整合MyBatis框架-->
<!--配置连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///day17"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--这里都用到了mybatis为我们提供的org.mybatis.spring的包,就是专用来整合到spring中的-->
<!--配置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.mediacomm.dao"/>
</bean>
<!--这是spring提供的控制事务的配置-->
<!--事务-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="advice" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.mediacomm.service.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
二、加载spring配置文件
首先需要知道servletContext,其次需要了解有个ServletContextListener的监听器
servletContext是一个作用于全局的(整个应用的)域对象,它在tomcat服务器启动时创建,在tomcat服务器关闭时销毁,而对应其监听器ServletContextListener,也就是监听其生命周期的一个接口。
在spring中有个实现了ServletContextListener的类ContextLoaderListener,所以也不需要创建了,直接用这个监听器即可。
在项目的web.xml文件中配置
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationspringconfig.xml</param-value>
</context-param>
三、测试
[2021-08-04 11:20:59,748] Artifact ssm:war: Artifact is deployed successfully
[2021-08-04 11:20:59,749] Artifact ssm:war: Deploy took 10,760 milliseconds
执行findall.......
User{username='admin', password='admin', address='新西兰', money=667.0, id=1}
User{username='ffff', password='123456', address='水星', money=1333.0, id=2}
User{username='改改', password='321', address='成交价..', money=1111.0, id=4}
User{username='aaa', password='112', address='火星', money=1111.0, id=10}
User{username='ww', password='xx', address='11', money=1111.0, id=11}
User{username='gsrg', password='zz', address='gggg', money=1111.0, id=12}
User{username='12', password='wef', address='hhhh', money=1111.0, id=13}
User{username='ag', password='123kj1231lkr', address='xxx', money=1111.0, id=14}
User{username='wer', password='afef', address='火星', money=1111.0, id=15}
User{username='gge', password='zfb', address='dd', money=1111.0, id=16}
User{username='admin', password='123321', address='我拒绝人家', money=123.0, id=18}
四、补充
突发奇想,不想通过mybatis提供的mybatis-spring的包来整合
总所周知,mybatis的应用就常见的就四步,那么我也把这四个对象都交给spring来管理不就行了,不过缺点就是多个mybatis的配置文件,而每多个dao的接口类就要在spring中创建一个,暂时就研究到这。
// 加载配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 创建SqlSession对象
SqlSession session = factory.openSession();
// 获取到代理对象
AccountDao dao = session.getMapper(AccountDao.class);
尝试后记录一下配置的步骤,测试后是同样可行的
spring配置文件中如此配置:
<!--尝试自己配置mybatis交由springIoC管理-->
<bean id="inputStream" class="org.apache.ibatis.io.Resources" factory-method="getResourceAsStream">
<constructor-arg value="Mybatis.xml"></constructor-arg>
</bean>
<bean id="builder" class="org.apache.ibatis.session.SqlSessionFactoryBuilder"></bean>
<bean id="sqlSessionFactory" factory-bean="builder" factory-method="build">
<constructor-arg ref="inputStream"></constructor-arg>
</bean>
<bean id="session" factory-bean="sqlSessionFactory" factory-method="openSession"></bean>
<bean id="userDao" factory-bean="session" factory-method="getMapper">
<constructor-arg type="java.lang.Class" value="com.mediacomm.dao.UserDao"></constructor-arg>
</bean>