zoukankan      html  css  js  c++  java
  • 04、JavaEE--SSH整合

    SSH整合

    Spring和Struct2整合就是将Action对象交给Spring容器负责创建。Spring和Hibernate整合就是将SessionFactory交给Spring来负责维护。
    同时Spring还可以负责session维护以及AOP事务管理。
    首先创建Maven项目,作如下勾选:

    创建完成后只是一个空项目,接下来创建相应的目录结构即可。

    然后创建相应的数据库:

    use ssh_db;
    CREATE TABLE `user`
    (
        `user_id`       bigint(20) unsigned                 NOT NULL auto_increment COMMENT 'ID',
        `user_name` varchar(40) character set utf8      NOT NULL COMMENT '用户名',
        `user_password` varchar(40) collate utf8_unicode_ci NOT NULL COMMENT '密码',
        `nick_name` varchar(40) character set utf8      COMMENT '昵称',
        PRIMARY KEY (`user_id`)
    ) ENGINE = InnoDB
      AUTO_INCREMENT = 1
      DEFAULT CHARSET = utf8
      COLLATE = utf8_unicode_ci COMMENT ='用户信息表';
    

    框架配置

    依赖文件

    在pom.xml中添加如下依赖:

    <dependencies>
        <!-- spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!--spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- spring-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <!-- aop面向切面依赖的jar包 -->
        <!-- aspectjrt -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.1</version>
        </dependency>
        <!-- aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.1</version>
        </dependency>
    
        <!-- hibernate依赖 -->
        <!-- hibernate核心依赖 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.17.Final</version>
        </dependency>
        <!-- mysql数据库驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!-- c3p0连接池 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
    
        <!-- struts2依赖 -->
        <!-- struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.35</version>
        </dependency>
        <!-- struts2-spring-plugin整合spring和struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.35</version>
        </dependency>
        <!-- servlet api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</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>
    
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- jstl -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.8</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    

    Spring配置

    1、创建一个Action,这里取名为UserAction

    public class UserAction extends ActionSupport{
    	private UserService userService;
    
    	public void setUserService(UserService userService) {
    		this.userService = userService;
    	}
    
    	public String login() throws Exception {
    		System.out.println(userService);
    		return super.execute();
    	}
    }
    

    2、创建一个Service层的类,其中包括接口UserService和UserServiceImp类

    // UserService
    public interface UserService {
    	User getUserByCodePassword(User user);
    }
    
    // UserServiceImp
    public class UserServiceImp implements UserService{
    	@Override
    	public User getUserByCodePassword(User user) {
    		System.out.println("111111111111");
    		return null;
    	}
    }
    

    3、在项目的resources下创建applicationContext.xml配置文件,然后将Action和Service托管给Spring容器。

    <?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">
    
        <!--Action配置,Action对象作用范围一定是多例的,这样才符合Struct2架构-->
        <bean name="userAction" class="com.legend.ssh.action.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
        <!--Service配置-->
        <bean name="userService" class="com.legend.ssh.service.imp.UserServiceImp"></bean>
    </beans>
    

    3、在web.xml中配置Spring随项目启动而启动

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <!--让Spring随项目启动而启动的监听器-->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!--配置Spring配置文件参数-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    </web-app>
    

    其中使用到的User.java类在domain包下:

    public class User {
        private Long user_id;
        private String user_name;
        private String user_password;
        private String nick_name;
        ...Get & Set ..
    }    
    

    Struct2配置

    1、在resource下创建Struct2的配置文件,名为struts.xml的的配置文件,并配置Struct2的主配置文件,和Action建立关联。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <struts>
        <package name="ssh" namespace="/" extends="struts-default">
            <action name="UserAction_*" class="com.legend.ssh.action.UserAction" method="{1}">
                <result name="success">/success.jsp</result>
            </action>
        </package>
    </struts>
    

    2、在web.xml中配置Struct2的核心过滤器

    <!--Struct2核心监听器注册-->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    Hibernate配置

    1、添加实体配置文件User.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.legend.ssh.domain" >
        <class name="User" table="user">
            <id name="user_id"  >
                <generator class="native"></generator>
            </id>
            <property name="user_name"></property>
            <property name="user_password"></property>
            <property name="nick_name"></property>
        </class>
    </hibernate-mapping>
    

    2、在resource下创建主配置文件hibernate.cfg.xml,并加入如下代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!-- 数据库驱动 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <!-- 数据库url -->
            <property name="hibernate.connection.url">jdbc:mysql:///ssh_db</property>
            <!-- 数据库连接用户名 -->
            <property name="hibernate.connection.username">root</property>
            <!-- 数据库连接密码 -->
            <property name="hibernate.connection.password">123456</property>
            <!-- 数据库方言 注意: MYSQL在选择方言时,请选择最短的方言.-->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <!-- 将hibernate生成的sql语句打印到控制台 -->
            <property name="hibernate.show_sql">true</property>
            <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
            <property name="hibernate.format_sql">true</property>
            <!-- 自动导出表结构. 自动建表-->
            <property name="hibernate.hbm2ddl.auto">update</property>
    
            <!-- 引入实体配置文件 -->
            <mapping resource="mapper/User.hbm.xml" />
        </session-factory>
    </hibernate-configuration>
    

    框架整合

    Spring整合Struct2

    在structs标签下添加常量配置,将action的创建交给Spring容器管理,并且让Spring负责装配依赖属性,这里有两种方案:

    方案一:class属性仍然配置action完整类名,Struct2仍然创建Action,其中Spring只负责组装Action中的依赖属性(不推荐)

    <struts>
        <!--将action的创建交给Spring容器-->
        <constant name="struts.objectFactory" value="spring"></constant>
        <!--依赖Spring负责装配Action依赖属性-->
        <constant name="struts.objectFactory.spring.autoWire" value="name"></constant>
        
        <package name="ssh" namespace="/" extends="struts-default">
            <!--整合方案一
                class属性上仍然配置action完整类名,Struct2仍然创建Action,但是由Spring负责组装Action中的依赖属性。
                这种方式不推荐,最好让Spring来管理Action的生命周期-->
            <action name="UserAction_*" class="com.legend.ssh.action.UserAction" method="{1}">
                <result name="success">/success.jsp</result>
            </action>
        </package>
    </struts>
    

    方案二:class属性上填写Spring中action对象的BeanName,完全由Spring管理生命周期,包括Action的创建,需要手动组装依赖属性

    <struts>
        <!--将action的创建交给Spring容器-->
        <constant name="struts.objectFactory" value="spring"></constant>
        <!--依赖Spring负责装配Action依赖属性-->
        <constant name="struts.objectFactory.spring.autoWire" value="name"></constant>
        
        <package name="ssh" namespace="/" extends="struts-default">
            <!--整合方案二
                class属性上填写Spring中action对象的BeanName,完全由Spring管理生命周期,包括Action的创建
                注意:需要手动组装依赖属性-->
            <action name="UserAction_*" class="userAction" method="{1}">
                <result name="success">/success.jsp</result>
            </action>
        </package>
    </struts>
    

    所以在Struct2中配置后,还需要在Spring中去配置该Action

    <?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">
    
        <!--Action配置,Action对象作用范围一定是多例的,这样才符合Struct2架构-->
        <bean name="userAction" class="com.legend.ssh.action.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
    
        <!--Service配置-->
        <bean name="userService" class="com.legend.ssh.service.imp.UserServiceImp"></bean>
    </beans>
    

    Spring整合Hibernate

    Spring整合Hibernate的原理就是将SessionFactory对象交给Spring容器进行管理,有三种方案:

    方案一:仍然使用外部的hibernate.cfg.xml配置连接信息,然后在Spring配置applicatonContext.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">
    
        <!--将SessionFactory配置到Spring容器中-->
        <!--加载配置方案一:仍然使用外部的hibernate.cfg.xml配置连接信息-->
        <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="configLocation" value="classpath:hibernate.cfg.xml.bat"></property>
        </bean>
    
        <!--Action配置,Action对象作用范围一定是多例的,这样才符合Struct2架构-->
        <bean name="userAction" class="com.legend.ssh.action.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
        <!--Service配置-->
        <bean name="userService" class="com.legend.ssh.service.imp.UserServiceImp"></bean>
    </beans>
    

    方案二:在Spring配置文件applicatonContext.xml中放置Hibernate配置连接信息

    <?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">
    
        <!--将SessionFactory配置到Spring容器中-->
        <!--加载配置方案二:在Spring配置中配置Hibernate配置连接信息-->
        <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <!--配置hibernate基本属性信息-->
            <property name="hibernateProperties">
                <props>
                    <!--必选配置-->
                    <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                    <prop key="hibernate.connection.url">jdbc:mysql:///ssh_db</prop>
                    <prop key="hibernate.connection.username">root</prop>
                    <prop key="hibernate.connection.password">123456</prop>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                    <!--可选配置-->
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                </props>
            </property>
            <!--引入ORM元数据,指定ORM元数据所在包路径,Spring会自动读取包中的所有配置-->
            <property name="mappingDirectoryLocations" value="classpath:com/legend/ssh/domain"></property>
        </bean>
    
        <!--Action配置,Action对象作用范围一定是多例的,这样才符合Struct2架构-->
        <bean name="userAction" class="com.legend.ssh.action.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
        <!--Service配置-->
        <bean name="userService" class="com.legend.ssh.service.imp.UserServiceImp"></bean>
    </beans>
    

    然后编写测试类进行测试,这里的SessionFactory是通过Spring管理获取的。

    public class HibernateTest {
        @Test
        public void func() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .configure().build();
            SessionFactory factory = new MetadataSources( serviceRegistry ).buildMetadata().buildSessionFactory();
            Session session = factory.openSession();
            Transaction transaction = session.beginTransaction();
            // 操作数据库
            User user = new User();
            user.setUser_name("神话");
            user.setUser_password("123456");
            user.setNick_name("神话");
            session.save(user);
            transaction.commit();
            session.close();
        }
    }
    
    • C3P0连接池

    如果需要配置c3p0连接池的话,则可以通过连接的配置来配置连接信息,在resource下创建db.properties配置文件:

    jdbc.jdbcUrl=jdbc:mysql:///ssh_db
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.username=root
    jdbc.password=123456
    

    然后在Spring的配置文件applicatonContext.xml中配置c3p0连接池信息,完整代码如下:

    <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.xsd">
    
        <!-- 指定spring读取db.properties配置 -->
        <context:property-placeholder location="classpath:db.properties" />
    
        <!--将连接池放入Spring容器中管理-->
        <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
            <property name="driverClass" value="${jdbc.driverClass}"></property>
            <property name="user" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
    
        <!--将SessionFactory配置到Spring容器中-->
        <!--加载配置方案二:在Spring配置中配置Hibernate配置连接信息-->
        <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <!--配置hibernate基本属性信息-->
            <property name="hibernateProperties">
                <props>
                    <!--必选配置-->
                    <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                    <prop key="hibernate.connection.url">jdbc:mysql:///ssh_db</prop>
                    <prop key="hibernate.connection.username">root</prop>
                    <prop key="hibernate.connection.password">123456</prop>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                    <!--可选配置-->
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                </props>
            </property>
            <!--引入ORM元数据,指定ORM元数据所在包路径,Spring会自动读取包中的所有配置-->
            <property name="mappingDirectoryLocations" value="classpath:com/legend/ssh/domain"></property>
        </bean>
    
        <!--Action配置,Action对象作用范围一定是多例的,这样才符合Struct2架构-->
        <bean name="userAction" class="com.legend.ssh.action.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
        <!--Service配置-->
        <bean name="userService" class="com.legend.ssh.service.imp.UserServiceImp"></bean>
    </beans>
    
    • Dao持久层

    1、编写Dao层接口和实现类,然后操作数据库

    public interface UserDao {
    	// 根据用户登录名称查询user对象
    	User getByUserName(String userName);
    }
    

    2、UserDaoImp.java实现类:通过Spring整合的Hibernate模板中的HQL或Criteria的方式操作数据库

    /**
     * 模板操作数据库,将dao注入SessionFactory
     */
    public class UserDaoImp extends HibernateDaoSupport implements UserDao {
    	@Override
    	public User getByUserName(final String userName) {
    		// HQL方式
    /*		User user = getHibernateTemplate().execute(new HibernateCallback<User>() {
    			@Override
    			public User doInHibernate(Session session) throws HibernateException {
    				String hql = "from User where user_name = ?";
    				Query query = session.createQuery(hql);
    				query.setParameter(0, userName);
    				User user = (User) query.uniqueResult();
    				return user;
    			}
    		});
    		return user;*/
    
    		// Criteria
    		DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
    		criteria.add(Restrictions.eq("user_name", userName));
    		List<User> userList = (List<User>) getHibernateTemplate().findByCriteria(criteria);
    		if (userList != null && userList.size() > 0) {
    			return userList.get(0);
    		}else {
    			return null;
    		}
    	}
    }
    

    3、由于Spring要整合Hibernate环境来操作数据库,则需要在Spring配置中将Dao注入到SessionFactory对象中:

    <!--Dao配置-->
    <bean name="userDao" class="com.legend.ssh.dao.UserDaoImp">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    

    4、编写测试类进行测试,其中Dao也是通过Spring进行管理获取的

    @Test
    public void func2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) context.getBean("userDao");
        User user = userDao.getByUserName("legend");
        System.out.println(user);
    }
    

    AOP整合

    1、通过SpringAOP来管理事务的话,首先在Spring配置文件中配置核心事务管理器:

    <!--核心事务管理器-->
    <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    

    核心事务管理器配置完成后,可以开始在Spring配置文件中来配置事务,有两种方式配置事务:XML配置事务 和 注解配置事务。

    XML配置事务

    在Spring配置文件中配置事务相关的内容:

    <!--核心事务管理器-->
    <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
    <!--配置通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
            <tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
            <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
            <tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
            <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
            <tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
            <tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
            <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
            <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        </tx:attributes>
    </tx:advice>
    
    <!-- 配置将通知织入目标对象 -->
    <aop:config  >
        <!--配置切点-->
        <aop:pointcut  id="txPc" expression="execution(* com.legend.ssh.service.imp.UserServiceImp.*(..))"/>
        <!--配置切面-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
    </aop:config>
    

    注解配置事务

    1、注解事务需要在Spring的配置文件中加入如下配置即可:

    <!--开启注解事务-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    

    2、在Service层的方法中添加注解,如果所有方法都需要注解可以直接添加到Service的实现类上。

    @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, readOnly = true)
    public class UserServiceImp implements UserService{
    	private UserDao userDao;
    	@Override
    	public User getUserByCodePassword(User user) {
    		System.out.println("111111111111");
    		return null;
    	}
    
    	@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, readOnly = false)
    	@Override
    	public void saveUser(User user) {
    		userDao.save(user);
    	}
    
    	public void setUserDao(UserDao userDao) {
    		this.userDao = userDao;
    	}
    }
    

    3、Dao层的实现类UserDaoImp中添加保存用户的方法:

    // 注册的方法
    @Override
    public void save(User user) {
    	getHibernateTemplate().save(user);
    }
    

    4、测试事务前,我们需要将UserDao在Spring中注入到Service对象中:

    <!--Service配置-->
    <bean name="userService" class="com.legend.ssh.service.imp.UserServiceImp">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <!--Dao配置-->
    <bean name="userDao" class="com.legend.ssh.dao.UserDaoImp">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    

    5、以后我们获取Dao对象只需要将userDao当成属性,并生成SetXXX方法即可获取UserDao对象,下面我们编写测试类

    @Test
    public void func3() {
    	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    	UserService service = (UserService) context.getBean("userService");
    	User user = new User();
    	user.setUser_name("legend");
    	user.setUser_password("123456");
        user.setNck_Name("legend");
    	service.saveUser(user);
    }
    
  • 相关阅读:
    Something about the "BSTR" and "SysStringLen"
    关于 i = i ++ 的问题
    duilib写个三国杀?
    关于WM_GETTEXT的应用
    hoops暂时用过的一些方法
    Hoops随便记的
    C++ win32线程数上限
    windows系统时间(SYSTEMTIME)
    Form表单提交的那些事
    多行文字溢出...
  • 原文地址:https://www.cnblogs.com/pengjingya/p/14993037.html
Copyright © 2011-2022 走看看