SSM(二) --- Spring,业务层框架,注解,spring 整合mybatis

一、层化分析
---------------------------
    1.Spring MVC 表现层    //最直观的数据表现形式(jsp),网页,web等,内部的controller与业务层进行交互

    3.Service 业务层       //使用Spring框架,整合业务层、数据访问层、持久层,将涉及到的类及其关系整合到一个容器中,实例化容器即可实现各个层之间的联系

    3.Dao 数据访问层       //增删改查等数据操作

    4.Mybatis 持久层       //使用Mybatis持久化技术,封装jdbc,对接数据库mysql

    5.DB层 数据库层         //存储数据


二、Spring 业务层框架
---------------------------
    1.管理java bean的,不再new对象,将对象的配置信息放到xml文件中。一般用于单例模式

    2.内部维护一个ApplicationContext[实质就是一个Map<String,Object>集合,存储bean id 到 java bean类的映射]

    3.这样就可以通过外部文件来实例化类的对象,而且只要更改配置文件就可以达到更改类对象的目的

    4.创建Spring项目,添加maven依赖,添加spring支持
        
<dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
        </dependencies>
    5.创建spring配置文件[Resources/beans.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"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                                        http://www.springframework.org/schema/beans/spring-beans.xsd">

            <bean id="ws" class="test.ssm.spring.WelcomeService">
                <!-- value 表示值, ref表示引用,解决依赖 -->
                <property name="message" value="hello world" />
                <property name="dao" ref="userDao"/>
            </bean>

            <bean id="userDao" class="dao.UserDao">
            </bean>

        </beans>
    6.创建类test.ssm.spring.WelcomeService和依赖类dao.UserDao
    ---------------------------------------------------------------
      
 package test.ssm.spring;

       import dao.UserDao;

       public class WelcomeService {

           private String message;

           private UserDao dao;

           public UserDao getDao() {
               return dao;
           }

           public void setDao(UserDao dao) {
               this.dao = dao;
           }

           public String getMessage() {
               return message;
           }

           public void setMessage(String message) {
               this.message = message;
           }

           public void sayMsg()
           {
               System.out.println(message);
               dao.insert();
           }

       }

       ------------------------------------------

       package dao;

       public class UserDao {

           public void insert()
           {
               System.out.println("insert over");
           }

       }
    7.创建App类
    -------------------------------
        
package test.ssm.spring;

        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;

        public class App {
            public static void main(String [] args)
            {
                //根据配置文件beans.xml 创建一个ApplicationContext,里面存放javabeans
                ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
                //通过 bean id, 在ApplicationContext中取出WelcomeService类
                WelcomeService ws = (WelcomeService)ac.getBean("ws");
                ws.sayMsg();
            }
        }
三、使用spring的注解方式 -- 替代写配置文件
---------------------------------------------------
    1.@Repository:仓库 -- 持久层

    2.@Service:服务 -- 业务层

    3.在类前面添加特定的注解,然后就不用编写配置文件了,只需要指定扫描的package即可

    4.添加maven依赖
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.3.RELEASE</version>
        </dependency>

    5.UserDao增加@Repository注解
       
 @Repository("dao")
        //默认名字是userDao
        public class UserDao {

            public void insert()
            {
                System.out.println("insert over");
            }
        }
    6.Service增加 @Service注解
       
 @Service("ws")
        //默认名字是welcomeService
        public class WelcomeService {
            ...
            //注入指定的dao对象
            //注意,只能在setDao这里添加
            @Resource(name = "dao")
            public void setDao(UserDao dao) {
                this.dao = dao;
            }
        }
    7.修改beans.xml文件,引入context空间,使用组件扫描。
    [resrouces/beans.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
                                    http://www.springframework.org/schema/context/spring-context-4.3.xsd">
           <context:component-scan base-package="dao,test.ssm.spring" />
        </beans>
    8.测试App
        
public class App {
            public static void main(String[] args) {
                //创建容器
                ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
                WelcomeService ws = (WelcomeService)ac.getBean("ws");
                ws.sayHello();
            }
        }
四、spring 整合mybatis
----------------------------------------------------------
    1.原理:将mybatis的类在spring容器中进行配置和储存

    2.创建模块SpringMybatisDemo,添加maven依赖
        <
?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>

            <groupId>com.it18zhang</groupId>
            <artifactId>springmybatisdemo</artifactId>
            <version>1.0-SNAPSHOT</version>

            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.11</version>
                </dependency>

                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>3.1.0</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.17</version>
                </dependency>
                <dependency>
                    <groupId>c3p0</groupId>
                    <artifactId>c3p0</artifactId>
                    <version>0.9.1.2</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context-support</artifactId>
                    <version>4.3.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-tx</artifactId>
                    <version>4.3.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aop</artifactId>
                    <version>4.3.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jdbc</artifactId>
                    <version>4.3.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis-spring</artifactId>
                    <version>1.3.0</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>1.8.10</version>
                </dependency>
            </dependencies>
        </project>
    3.创建包
        test.demo.dao
        test.demo.service
        test.demo.util
        test.demo.domain

    4.配置c3p0连接池的 beans.xml
        [resources/beans.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"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                                http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!-- 配置从c3p0数据源 -->
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="com.mysql.jdbc.Driver"/>
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="user" value="mysql"/>
                <property name="password" value="mysql"/>
                <property name="maxPoolSize" value="10"/>
                <property name="minPoolSize" value="2"/>
                <property name="initialPoolSize" value="3"/>
                <property name="acquireIncrement" value="2"/>
            </bean>
        </beans>
    5.编写单元测试 -- 测试c3p0连接池
       
 /**
         * 测试c3p0连接池
         */
        @Test
        public void testC3p0Conn() throws SQLException {
            ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
            DataSource ds = (DataSource) ac.getBean("dataSource");
            System.out.println(ds.getConnection());
        }
    6.配置Mybatis-sqlSession会话工厂的bean,修改beans.xml
        [resources/beans.xml]
        ...
        <!-- 配置会话工厂bean -->
        <!-- mybatis 整合 spring 的核心类 -->
        <bean id="sf" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 给数据源dataSource属性指定关联类,类id为dataSource -->
            <property name="dataSource" ref="dataSource"/>
            <!-- 给属性configLocation属性赋值,值为mybatis-congif.xml -->
            <property name="configLocation" value="mybatis-config.xml"/>
        </bean>
        ...

    7.在test.demo.domain包下,添加domain类[详见上篇 SSM -- Mybatis]
       Users
       Orders
       Items

    8.添加Mapper.xml映射文件[详见上篇 SSM -- Mybatis]
        //注意:修改类的别名
        resources/UserMapper.xml
        resources/OrderMapper.xml

    9.添加[Resources/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>
                <typeAlias type="test.demo.domain.Users" alias="_Users"/>
                <typeAlias type="test.demo.domain.Orders" alias="_Orders"/>
                <typeAlias type="test.demo.domain.Items" alias="_Items"/>
            </typeAliases>
            <mappers>
                <mapper resource="UserMapper.xml"/>
                <mapper resource="OrderMapper.xml"/>
            </mappers>

        </configuration>

    10.新建包dao和类 UserDao 和 OrderDao 以及 IBaseDao接口 底层数据库通信
        
----------------------------------
        package test.demo.dao;

        import java.util.List;

        /**
         * dao接口--面向接口设计
         * @param <T>
         */
        public interface IBaseDao<T> {

            public void insert(T t);

            public void update(T t);

            public void delete(Integer id);

            public T selectOne(Integer id);

            public List<T> selectAll();

        }

        -------------------------------------
        package test.demo.dao;

        import org.mybatis.spring.support.SqlSessionDaoSupport;
        import org.springframework.stereotype.Repository;
        import test.demo.domain.Users;

        import java.util.List;

        /**
         * 用户dao--增删改查
         */
        @Repository
        public class UserDao extends SqlSessionDaoSupport implements IBaseDao<UserDao>{

            public void insert(UserDao userDao) {
                this.getSqlSession().insert("users.insert", userDao);
            }

            public void update(UserDao userDao) {
                this.getSqlSession().update("users.update", userDao);
            }

            public void delete(Integer id) {
                this.getSqlSession().delete("users.delete", id);
            }

            /**
             * 按照id查询
             */
            public UserDao selectOne(Integer id) {
                return this.getSqlSession().selectOne("users.select_one",id);
            }

            /**
             * 全表扫描
             */
            public List<UserDao> selectAll() {
                return this.getSqlSession().selectList("users.select_all");
            }
        }

        ---------------------------------------
        package test.demo.dao;

        import org.junit.Test;
        import org.mybatis.spring.support.SqlSessionDaoSupport;
        import org.springframework.stereotype.Repository;
        import test.demo.domain.Orders;
        import test.demo.domain.Users;

        import javax.swing.text.DefaultEditorKit;
        import java.util.List;

        /**
         * 订单dao--增删改查
         */
        @Repository
        public class OrderDao extends SqlSessionDaoSupport implements IBaseDao<OrderDao>{


            public void insert(OrderDao orderDao) {
                this.getSqlSession().insert("orders.insert", orderDao);
            }

            public void update(OrderDao orderDao) {

            }

            public void delete(Integer id) {

            }

            public OrderDao selectOne(Integer id) {
                return this.getSqlSession().selectOne("orders.select_one", id);
            }

            public List<OrderDao> selectAll() {
                return null;
            }

            public List<OrderDao> selectAll(OrderDao orderDao) {
                return this.getSqlSession().selectOne("orders.select_all");
            }
        }

    11.新建service包:BaseService + impl, UserService + impl, OrderService + impl

        [IBaseService<T> 服务接口类]
        ----------------------------------------------
        
package test.demo.service;

        import java.util.List;

        /**
         * 主要用于用户要求的实现
         * 偏应用层
         * 跟随需求随时变更
         */
        public interface IBaseService<T> {

            public void insert(T t);

            public void update(T t);

            public void delete(Integer id);

            public T selectOne(Integer id);

            public List<T> selectAll();

        }

        [IOrderService]
        -----------------------------------------------
        
/**
         * 单独用于订单类需求的更改的接口
         */
        public interface IOrderService extends IBaseService <Orders>{
            /** 拓展内容 **/
        }

        [IUserService]
        -----------------------------------------------
        
/**
         * 单独针对于用户需求的更改的接口
         */
        public interface IUserService extends IBaseService <Users>{


        }

        [BaseServiceImpl<T>]
        ------------------------
       
 package test.demo.service.impl;

        import test.demo.dao.IBaseDao;
        import test.demo.service.IBaseService;

        import javax.annotation.Resource;
        import java.util.List;

        public abstract class BaseServiceImpl<T> implements IBaseService<T> {

            private IBaseDao<T> baseDao;

            public void setBaseDao(IBaseDao<T> baseDao) {
                this.baseDao = baseDao;
            }

            public void insert(T t) {
                baseDao.insert(t);
            }

            public void update(T t) {
                baseDao.update(t);
            }

            public void delete(Integer id) {
                baseDao.delete(id);
            }

            public T selectOne(Integer id) {
                return baseDao.selectOne(id);
            }

            public List<T> selectAll() {
                return baseDao.selectAll();
            }
        }

        [UserServiceImpl]
        ---------------------------
        
@Service("userService")
        public class UserServiceImpl extends BaseServiceImpl<Users> implements IUserService {

            /**
             * 重写set方法 注入,指定UserDao
             * @Resource 在Repository(仓库)中指定UserDao
             */
            @Resource(name="userDao")
            public void setBaseDao(IBaseDao<Users> baseDao) {
                super.setBaseDao(baseDao);
            }
        }

        [OrderServiceImpl]
        -----------------------------
       
 @Service("orderService")
        public class OrderServiceImpl extends BaseServiceImpl<Orders> implements IOrderService {

            @Resource(name="orderDao")
            public void setBaseDao(IBaseDao<Orders> baseDao) {
                super.setBaseDao(baseDao);
            }
        }


    12.完善spring的配置文件,增加扫描配置文件选项和事务管理器
        [beans.xml]
        
<?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:tx="http://www.springframework.org/schema/tx"
               xmlns:aop="http://www.springframework.org/schema/aop"
               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/context
                                           http://www.springframework.org/schema/context/spring-context-4.3.xsd
                                           http://www.springframework.org/schema/tx
                                           http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
                                           http://www.springframework.org/schema/aop
                                           http://www.springframework.org/schema/aop/spring-aop-4.3.xsd" default-autowire="byType">

            <!-- 配置扫描组件 -->
            <context:component-scan base-package="test.demo.dao,test.demo.service"/>

            <!-- 配置c3p0池化数据源bean -->
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="com.mysql.jdbc.Driver"/>
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis?user=mysql&amp;password=mysql"/>
                <property name="user" value="mysql"/>
                <property name="password" value="mysql"/>
                <property name="maxPoolSize" value="10"/>
                <property name="minPoolSize" value="2"/>
                <property name="initialPoolSize" value="3"/>
                <property name="acquireIncrement" value="2"/>
            </bean>

            <!-- 配置会话工厂bean -->
            <!-- mybatis 整合 spring 的核心类 -->
            <bean id="sf" class="org.mybatis.spring.SqlSessionFactoryBean">
                <!-- 给数据源dataSource属性指定关联类,类id为dataSource -->
                <property name="dataSource" ref="dataSource"/>
                <!-- 给属性configLocation属性赋值,值为mybatis-congif.xml -->
                <property name="configLocation" value="mybatis-config.xml"/>
            </bean>


            <!--  配置事务的属性:开启何种事务 -->
            <tx:advice id="txAdvice" transaction-manager="txManager">
                <tx:attributes>
                    <!-- * 表示对所有的方法使用默认的隔离级别 -->
                    <!-- 也可以 tx:method name="insert *" 对所有的插入函数使用默认的隔离级别 -->
                    <!-- propagation 传播行为-->
                    <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
                </tx:attributes>
            </tx:advice>

            <!-- 配置事务切面:在何处开启事务,pointcut切入点 -->
            <!-- execution(* *..*Service.*(..)) -->
            <!-- execution(返回值 包.*Service.*(..)) -->
            <!-- 任何返回值的 任何包下的以Service结尾的类中的任何方法(..表示参数不限) :其实就是表示一类方法-->
            <aop:config>
                <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Service.*(..))" />
            </aop:config>

            <!-- 配置数据源事务管理器 -->
            <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource" />
            </bean>


        </beans>


    13.测试UserService    
/**
         * 测试用户服务
         */
        @Test
        public void testUserService()
        {
            ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
            IUserService us = (IUserService) ac.getBean("userService");
            Users u = new Users();
            u.setName("laaaa");
            u.setAge(16);
            us.insert(u);
        }

猜你喜欢

转载自blog.csdn.net/xcvbxv01/article/details/82997498