SSM整合1(Spring + SpringMVC + Mybatis整合)(环境搭建、框架整合、配置文件集中、Mybatis逆向工程、整合c3p0、dbcp数据库连接池、使用注解配置事务)

SSM整合1

  • Spring + SpringMVC + Mybatis整合
  • 整合版本:
    • Spring 3.2
    • Mybaties 3.2.7
  • 注意事项:
    • Spring 3.2 使用 jdk1.7
    • 使用jdk8建议使用spring4以上
  • 项目结构:
    在这里插入图片描述

1. 创建一个javaweb项目

在这里插入图片描述
2. 在WEB-INF下创建一个lib文件夹用来存放jar包
在这里插入图片描述

2. 导入jar包(或使用maven配置)

  • Spring+ SpringMVC + MyBatis + Mybatis-spring整合包
  • AOP联盟+织入 + c3p0、dbcp 数据库连接池 + MySQL连接驱动 + jstl
  1. 导入mybatis核心包
    在这里插入图片描述
  • 导入mybatis lib下的所有jar(依赖包)
    在这里插入图片描述
  1. 导入mysql数据库驱动包
    在这里插入图片描述

  2. 导入c3p0和dbcp数据库连接池(用其一即可,也可以使用druid)
    在这里插入图片描述
    在这里插入图片描述

  3. 导入spring+mvc包
    在这里插入图片描述
    在这里插入图片描述

  4. 导入Mybatis-spring整合包
    在这里插入图片描述

  5. 导入AOP联盟+织入+ jstl包
    在这里插入图片描述

  6. 总的jar包
    在这里插入图片描述

3. 创建SpringMVC配置文件

  • 先在项目下创建一个config文件夹,将其标记为资源文件,再在里面创建SpringMVC的配置文件
    在这里插入图片描述
    在这里插入图片描述
<?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"
       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-3.2.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.2.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- 1.配置注解扫描位置 -->
    <context:component-scan base-package="com.it.web.controller" />

    <!-- 2.配置注解处理映射-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <!--3.配置适配器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    <!-- 4.配置SpringMVC视图解析器
        视图解析器解析的路径为:前缀 + 后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

4. 在web.xml中添加SpringMVC配置

  • 这次我们更改SpringMVC默认配置文件的路径
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 3.0的SpringMVC默认加载的是WEB-INF下的dispatcher-servlet.xml文件
            3.2的SpringMVC默认加载的是WEB-INF下的DispatcherServlet-servlet.xml文件 -->
        <init-param>
            <!-- 修改SpringMVC默认加载的配置文件路径 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:SpringMVC-Config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

5. 先配置一个Controller跑出一个页面

  • 测试配置是否正确
  1. 先写一个简单的jsp页面
    在这里插入图片描述
  2. 创建一个UserController
    在这里插入图片描述
  3. 成功运行

在这里插入图片描述

6. 通过MyBatis的逆向工程生成JavaBean/Mapper

7. 修改ItemsMapper.java和ItemsMapper.xml

  • 因为逆向工程里都是一些简单的增删改查方法,这里在ItemsMapper.java中写一个方法
    在这里插入图片描述
  • 在ItemsMapper.xml中配置该方法
    在这里插入图片描述
<select id="findAllItems" resultType="items">
    select * from items
  </select>

8. 定义Service层接口并实现

在这里插入图片描述

public interface ItemsService {
    
    

    //查找所有商品信息
    List<Items> findAll();

    //根据id查找商品
    Items findById(Integer id);

    //接收一个商品对象,判断没有id就save保存,有id就update更新
    void saveOrUpdate(Items items);

    //根据id删除商品
    void deleteById(Integer id);
}

在这里插入图片描述

@Service
public class ItemsServiceImpl implements ItemsService {
    
    

    //之前注入dao(现在是注入mapper)
    @Autowired
    private ItemsMapper itemsMapper;

    @Override
    public List<Items> findAll() {
    
    
        return itemsMapper.findAllItems();
    }

    @Override
    public Items findById(Integer id) {
    
    
        return itemsMapper.selectByPrimaryKey(id);
    }

    @Override
    public void saveOrUpdate(Items items) {
    
    
        if (items.getId() == null){
    
    
            itemsMapper.insert(items);
        }else {
    
    
            itemsMapper.updateByPrimaryKey(items);
        }
    }

    @Override
    public void deleteById(Integer id) {
    
    
        itemsMapper.deleteByPrimaryKey(id);
    }
}

9. 创建mybatis的配置文件MyBatis-Config.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>
    <!--别名配置-->
    <typeAliases>
        <!--定义单个别名--><!--这样配置用到全类名的地方就可以写成别名user-->
        <!--<typeAlias type="com.it.model.User" alias="user"></typeAlias>-->

        <!--批量配置别名-->
        <!--name:指定批量定义别名的类的包名,别名为类名(首字母大小写都可以)-->
        <!--这样配置就是该包下的类名的别名就为类名,大小写都可以
        如:com.it.model包下的User类的别名就可以写为 User 或 user -->
        <package name="com.it.model"/>
    </typeAliases>

    <!--加载映射文件-->
    <mappers>
        <!--<mapper resource="com/it/sqlmap/User.xml"></mapper>-->
        <!--第一种:写映射文件名-->
        <!--<mapper resource="com/it/mapper/UserMapper.xml"></mapper>-->
        <!--第二种:使用完全限定路径【一般不用】-->
        <!--<mapper url="file:///D:\MyBatis_day01\src\com\it\mapper\UserMapper.xml"></mapper>-->
        <!--第三种:写类名(使用mapper接口的全限定名)
        一定要有个同名映射文件与之对应,如果没有,在UserMapper接口中声明注解,否则报错-->
        <!--使用注解配置时,要删除或改名映射文件,否则报错-->
        <!--注意:不使用注解时,此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下-->
        <!--<mapper class="com.it.mapper.UserMapper"></mapper>-->
        <!--第四种:写包名【推荐使用】
        注册指定包下的所有映射文件-->
        <!--注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下-->
        <package name="com.it.mapper"/><!--注意这种方式(包配置)只适用于Mapper代理-->
    </mappers>
</configuration>

10. 创建spring的配置文件Spring-Config.xml

在这里插入图片描述

<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"
       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-3.2.xsd
		                    http://www.springframework.org/schema/mvc
		                    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		                    http://www.springframework.org/schema/context
		                    http://www.springframework.org/schema/context/spring-context-3.2.xsd
		                    http://www.springframework.org/schema/aop
		                    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		                    http://www.springframework.org/schema/tx
		                    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>	                    

11. 配置c3p0、dbcp数据源和mybatis的会话工厂

  • 由于数据库、驱动jar版本问题,jdk版本等问题,这里使用dbcp连接池,c3p0的连接数据源也会一并给出
<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"
       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-3.2.xsd
		                    http://www.springframework.org/schema/mvc
		                    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		                    http://www.springframework.org/schema/context
		                    http://www.springframework.org/schema/context/spring-context-3.2.xsd
		                    http://www.springframework.org/schema/aop
		                    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		                    http://www.springframework.org/schema/tx
		                    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">



    <!--1.加载db配置文件-->
    <!--<context:property-placeholder location="classpath:db.properties"/>-->

    <!-- 配置数据库,dbcp数据库连接池 -->
    <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql:///mybatis_day01?useUnicode=true&amp;characterEncoding=utf8"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <!--2.配置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}"/>
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="2"/>
    </bean>-->

    <!--3.配置会话工厂-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!--指定配置文件位置-->
        <property name="configLocation" value="classpath:MyBatis-Config.xml"></property>
    </bean>

    <!--配置dao的几种方式-->
    <!--第一种-->
    <!--传统配置dao【现在一般不用】-->
    <!--<bean class="com.it.dao.impl.UserDaoImpl" id="userDao">
        <property name="sqlSessionFactory" ref="sessionFactory"></property>
    </bean>-->

    <!--第二种-->
    <!--由spring创建一个userMapper对象,使用工厂来创建对象-->
    <!--<bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="itemsMapper">
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
        <property name="mapperInterface" value="com.it.mapper.ItemsMapper"></property>
    </bean>-->


    <!--第三种【推荐使用】-->
    <!--4.批量创建mapper的bean对象
    内部会扫描指定包下的mapper,为每一个接口创建代理对象,名字就是类名,首字母会自动改成小写
    使用的时候直接取即可
        注意:
			1.jdk1.8 用这种方式,bean不能创建成功 ,改成jdk1.7的即可
			2.或者spring换成spring4或以上就OK了
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.it.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
    </bean>

    <!--配置自动扫描注解-->
    <context:component-scan base-package="com.it"/>

</beans>

  • db.properties文件配置内容
    在这里插入图片描述
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_day01?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

12. 在web.xml中配置spring容器

  • 由于spring配置文件的位置改变,不在默认位置,需要重新配置一下
    在这里插入图片描述
    <!--配置Spring-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:Spring-Config.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

13. 在Spring中添加bean的注解装配

  • 上面已给出代码,确保注解配置的正常使用
    在这里插入图片描述

14. 写一个ItemsController初体验

在这里插入图片描述

@Controller
@RequestMapping("items")
public class ItemsController {
    
    

    @Autowired
    private ItemsService itemsService;

    @RequestMapping("list")
    public String list(){
    
    
        List<Items> allItems = itemsService.findAll();
        for (Items allItem : allItems) {
    
    
            System.out.println(allItem);
        }
        return "/user/userList";
    }
}

15. 运行看看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16. 事务配置

  • Spring中Propagation类的事务属性详解:
    • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
    • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
    • REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
    • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
    • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务
  • 两种方式:
  • 第一种:配置通知、传播行为与切面【不是很推荐使用,配置麻烦】
<!--5.配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--6.通知-->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
		 	<!--传播行为,已这些方法名开头的方法-->
		    <tx:method name="save*" propagation="REQUIRED"/>
		    <tx:method name="insert*" propagation="REQUIRED"/>
		    <tx:method name="delete*" propagation="REQUIRED"/>
		    <tx:method name="update*" propagation="REQUIRED"/>
		    <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
		    <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	
	<!--7.切面配置-->
	<aop:config><!--匹配com.it.service包下的任意方法都是一个切入点-->
		<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.it.service.*.*(..))"/>
	</aop:config>

  • 第二种:使用注解配置事务【推荐使用,简单】
<!--5.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--6.开启事务注解-->
<tx:annotation-driven></tx:annotation-driven>

在这里插入图片描述

17. 测试事务

  1. 写一个简单的save方法
    在这里插入图片描述
	@RequestMapping("save")
    public String save(){
    
    
        //添加一个商品
        Items items = new Items();
        items.setName("iphone 11");
        items.setPrice(5000.0f);
        items.setDetail("很好用!");
        items.setCreatetime(new Date());

        //保存
        itemsService.saveOrUpdate(items);
        return "/user/userList";
    }

在这里插入图片描述

  • 数据成功插入数据库
    在这里插入图片描述
  1. 使用注解配置事务,并设置一个错误,再次运行
    在这里插入图片描述
  • 会报错,数据回滚,数据库没有数据
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43414199/article/details/108985032