zoukankan      html  css  js  c++  java
  • Spring IoC

    Spring

    一个开源的应用程序框架,一个一站式的框架。

        1.IoC容器
        2.AOP实现
        3.数据访问支持:简化hibernate编码,声明式事物
        4.Web集成

    一般代指Spring Framework。

    Spring Framework

        

    Spring提供了表现层(mvc)到业务层(Spring)再到数据层(data)的全套解决方案,基于Spring,你可以方便的与其他框架进行集成,如hibernateibatis,structs等,Spring官方的原则是绝不重复造轮子,有好的解决方案只需要通过Spring进行集成即可。Spring Framework 本身并未提供太多具体的功能,它主要专注于让你的项目代码组织更加优雅,使其具有极好的灵活性和扩展性,同时又能通过Spring集成业界优秀的解决方案

     

    Inversion of Control(控制反转/Dependency Inversion Principle):
        1.一个重要的面向对象编程的法则来削减计算机程序的耦合问题
        2.轻量级的Spring框架的核心


     IoC负责什么?   

    1. 创建对象
    2. 管理对象(通过依赖注入DI)
    3. 装配对象
    4. 配置对象
    5. 管理对象生命周期

    实现技术:
        1.Java反射技术实现
        2.配置文件组装对象

    将组件对象的控制权从代码本身转移到外部容器
        1.组件化思想:分离关注点,接口和实现分离
        2.依赖的注入:将组件的构建和使用分开

    Ioc最重要的2个类是什么?

    • BeanFactory
      • bean的定义
      • 读取bean配置文档
      • 管理bean加载、实例化
      • 控制bean的生命周期
      • 维护bean之间的依赖 
    • ApplicationContext,这是BeanFactory的子接口
      • 支持国际化
      • 统一的资源文件访问方式
      • 提供在监听器中注册bean事件
      • 同时加载多个配置文件
      • 载入多个上下文  

    范例:
    1.HelloSpring类

    package com.Elastic.SpringDemo1.ivy.demo;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class HelloSpring {
        private String meg;
    
        public String getMeg() {
            return meg;
        }
    
        public void setMeg(String meg) {
            this.meg = meg;
        }
        
        public void sayHello() {
            System.out.println("Hello," + meg);
        }
        
        public static void main(String[] args) {
            /*//1.创建对象
            HelloSpring hs = new HelloSpring();
            //2.給对象赋值
            hs.setMeg("Spring !!!");
            //3.调用对象的方法
            hs.sayHello();*/
            
            //使用Spring完成上面的操作
            //1.创建Spring IoC容器
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            //2.通过容器获得对象
            HelloSpring hs = (HelloSpring) context.getBean("helloSpring");
            //3.调用对象的方法
            hs.sayHello();
        }
    }
    


    2.applicationContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xsi:schemaLocation="http://www.springframework.org/schema/beans
     5            http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     <!-- 由Spring的IoC容器创建对象 -->
     8       <bean id="helloSpring" class="com.Elastic.SpringDemo1.ivy.demo.HelloSpring">
     9           <!-- 給属性赋值 -->
    10           <property name="meg" value="Spring IoC"></property>
    11       </bean>
    12 
    13 </beans>


    依赖注入--组件之间以配置文件的形式组织在一起,而不是以编码的方式耦合在一起
        1.设值注入 -- 属性的setter访问器
            可以使用p命名空间注入属性值
        2.构造注入 -- 带参构造方法
            1).技巧:编写带参构造方法,为保证使用的灵活性,建议添加无参构造方法    
            2).在Spring配置文件中通过<constructor-arg>元素为构造方法传参
                a.、一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。
                b.通过<constructor-arg>元素的index 属性可以指定该参数的位置索引,位置从0 开始。
                c.<constructor-arg>元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。

    p命名空间:使用属性而不是子元素的形式配置Bean的属性
        1.引入p命名空间 xmlns:p="http://www.springframework.org/schema/p"
        
        2.对于直接量(基本数据类型、字符串)属性:p:属性名="属性值"
          对于引用Bean的属性:p:属性名-ref="Bean的id"

    注入不同数据类型
        1.注入直接量            使用<value>标签;特殊字符的处理
        2.引用Bean                使用<ref>标签;注意bean属性和local属性的区别
        3.使用内部Bean            <property><bean>...</bean></property>
        4.注入集合类型的属性    <list><set><map><props>标签
        5.注入null和空字符串值    使用<null>注入null值;使用<value>注入空字符串值
                
    范例: 打印机
    1.定义墨盒和纸张的接口标准
    a.Ink接口

    1 package com.Elastic.SpringDemo1.ivy.printer;
    2 
    3 /**
    4  * 墨盒接口(墨盒规格)
    5  *
    6  */
    7 public interface Ink {
    8     String getColor();
    9 }


    b.Paper接口

    1 package com.Elastic.SpringDemo1.ivy.printer;
    2 
    3 /**
    4  * 纸张接口(纸张的规格)
    5  *
    6  */
    7 public interface Paper {
    8     void putChar(char c);
    9 }


    2.墨盒和纸张的接口的实现类
    a.BlackInk类

     1 package com.Elastic.SpringDemo1.ivy.printer;
     2 
     3 public class BlackInk implements Ink{
     4 
     5     @Override
     6     public String getColor() {
     7         return "黑色";
     8     }
     9     
    10 }


    b.A4Paper类

     1 package com.Elastic.SpringDemo1.ivy.printer;
     2 
     3 public class A4Paper implements Paper{
     4 
     5     @Override
     6     public void putChar(char c) {
     7 
     8         System.out.print(c);
     9     }
    10 
    11 }


    3.Printer类 -- 组装打印机

     1 package com.Elastic.SpringDemo1.ivy.printer;
     2 
     3 /**
     4  * 打印机
     5  *
     6  */
     7 public class Printer {
     8     Ink ink;
     9 
    10     Paper paper;
    11 
    12     //属性增加setter方法
    13     public void setInk(Ink ink) {
    14         this.ink = ink;
    15     }
    16 
    17     public void setPaper(Paper paper) {
    18         this.paper = paper;
    19     }
    20 
    21     public void print(String content) {
    22         System.out.println("打印机正在打印:");
    23         System.out.println("使用颜色:" + ink.getColor());
    24         for (int i = 0; i < content.length(); i++) {
    25             paper.putChar(content.charAt(i));
    26         }
    27 
    28         System.out.println("打印完毕......");
    29     }
    30 
    31 }


    4.printerContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xsi:schemaLocation="http://www.springframework.org/schema/beans
     5            http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     <!-- 由Spring的IoC容器创建对象 -->
     8       <bean id="blackPrinter" class="com.Elastic.SpringDemo1.ivy.printer.Printer">
     9           <!-- 給属性赋值(组装) -->
    10           <property name="ink" ref="blackInk"></property>
    11           <property name="paper" ref="A4"></property>
    12       </bean>
    13       
    14       <bean id="blackInk" class="com.Elastic.SpringDemo1.ivy.printer.BlackInk"></bean>
    15       
    16       <bean id="A4" class="com.Elastic.SpringDemo1.ivy.printer.A4Paper"></bean>
    17 
    18 </beans>


    5.Test类 -- 运行打印机

     1 package com.Elastic.SpringDemo1.ivy.test;
     2 
     3 import org.springframework.context.ApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 import com.Elastic.SpringDemo1.ivy.printer.Printer;
     7 
     8 public class Test {
     9 
    10     public static void main(String[] args) {
    11         //找到卖打印机的商店
    12         //由Spring创建printer对象,并根据配置文件注入依赖的组件,完成组装
    13         ApplicationContext context = new ClassPathXmlApplicationContext("printerContext.xml");
    14         //給老板说来一台打印机
    15         Printer printer = (Printer) context.getBean("blackPrinter");
    16         printer.print("测试内容");
    17     }
    18 
    19 }


    范例:
    1.实体类及其配置文件
    a.User类

     1 package com.Elastic.SpringDemo1.ivy.entity;
     2 
     3 import java.io.Serializable;
     4 
     5 public class User implements Serializable{
     6     private String loginName;
     7     private String loginPass;
     8     
     9     public String getLoginName() {
    10         return loginName;
    11     }
    12     public void setLoginName(String loginName) {
    13         this.loginName = loginName;
    14     }
    15     public String getLoginPass() {
    16         return loginPass;
    17     }
    18     public void setLoginPass(String loginPass) {
    19         this.loginPass = loginPass;
    20     }
    21 }


    b.User.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <hibernate-mapping>
     5     <class name="com.Elastic.SpringDemo1.ivy.entity.User" table="user">
     6         <id name="loginName" type="java.lang.String">
     7             <column name="userName"></column>
     8             <generator class="assigned"></generator>
     9         </id>
    10         <property name="loginPass" type="java.lang.String">
    11             <column name="passWord"></column>
    12         </property>
    13     </class>
    14 </hibernate-mapping>


    2.hibernate.cfg.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <!DOCTYPE hibernate-configuration PUBLIC
     4     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     5     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     6 
     7 <hibernate-configuration>
     8     <session-factory>
     9         <!-- 1.数据库连接信息 -->
    10         <property name="connection.url">jdbc:mysql://localhost/hibernatedb</property>
    11         <property name="connection.username">root</property>
    12         <property name="connection.password">root</property>
    13         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    14         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    15         <property name="show_sql">true</property>
    16         <property name="format_sql">true</property>
    17         
    18                 
    19         <!-- 2.使用c3p0连接池 -->
    20         <property name="hibernate.connection.datasource">com.mchange.v2.c3p0.ComboPooledDataSource</property>
    21         <property name="c3p0.max_size">100</property>
    22         <property name="c3p0.min_size">10</property>
    23         <property name="c3p0.acquire_increment">5</property>
    24         <property name="c3p0.idle_test_period">60</property>
    25         <property name="c3p0.timeout">10</property>
    26         
    27         <!-- 3.数据库对应的实体类的映射文件路径 -->
    28         <mapping resource="com/Elastic/SpringDemo1/ivy/entity/User.hbm.xml"></mapping>
    29     </session-factory>
    30 </hibernate-configuration>


    3.HibernateUtil类

     1 package com.Elastic.SpringDemo1.ivy.util;
     2 
     3 import org.hibernate.Session;
     4 import org.hibernate.SessionFactory;
     5 import org.hibernate.cfg.Configuration;
     6 public final class HibernateUtil {
     7     private static Configuration cfg = null;
     8     private static SessionFactory sessionFactory = null;
     9     
    10     //本地线程
    11     public static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    12     
    13     static{
    14         cfg = new Configuration().configure();
    15         sessionFactory = cfg.buildSessionFactory();
    16     }
    17     
    18     public static Session getSession(){
    19         Session session = threadLocal.get();
    20         if (null == session || !session.isOpen()) {
    21             session = sessionFactory.openSession();
    22             threadLocal.set(session);
    23         }
    24         return session;
    25     }
    26 }


    4.dao包
    a.IBaseDao接口

      1 package com.Elastic.SpringDemo1.ivy.dao;
      2 
      3 import java.io.Serializable;
      4 import java.util.List;
      5 import java.util.Map;
      6 
      7 import org.hibernate.Session;
      8 import org.hibernate.criterion.DetachedCriteria;
      9 public interface IBaseDao<T> {
     10     /**
     11      *
     12      * <p>
     13      * <h3>方法功能描述:获取Session对象</h3>
     14      * </p>
     15      * @return
     16      * @procedure 执行过程
     17      * @see IBaseDao
     18      */
     19     Session getSession();
     20     
     21     /**
     22      *
     23      * <p>
     24      * <h3>方法功能描述:保存数据</h3>
     25      * </p>
     26      * @param record    需要保存的对象
     27      * @procedure 执行过程
     28      * @see IBaseDao
     29      */
     30     void save(T record);
     31     
     32     /**
     33      *
     34      * <p>
     35      * <h3>方法功能描述:根据主键删除对应的数据</h3>
     36      * </p>
     37      * @param id
     38      * @procedure 执行过程
     39      * @see IBaseDao
     40      */
     41     //不明确id的类型,就用Serializable
     42     void delete(Serializable id);
     43     
     44     /**
     45      *
     46      * <p>
     47      * <h3>方法功能描述:根据数据对象删除数据库中对应的数据</h3>
     48      * </p>
     49      * @param record
     50      * @procedure 执行过程
     51      * @see IBaseDao
     52      */
     53     void delete(T record);
     54     
     55     /**
     56      *
     57      * <p>
     58      * <h3>方法功能描述:根据指定的对象修改对应的数据</h3>
     59      * </p>
     60      * @param record
     61      * @procedure 执行过程
     62      * @see IBaseDao
     63      */
     64     void update(T record);
     65     
     66     /**
     67      *
     68      * <p>
     69      * <h3>方法功能描述:根据主键查询对应的数据</h3>
     70      * </p>
     71      * @param id
     72      * @return 返回查找到的数据,如果没有返回null
     73      * @procedure 执行过程
     74      * @see IBaseDao
     75      */
     76     T findById(Serializable id);
     77     
     78     /**
     79      *
     80      * <p>
     81      * <h3>方法功能描述:根据指定的hql语句和参数查询语句</h3>
     82      * </p>
     83      * @param hql  需要执行的查询的HQL语句
     84      * @param params  执行的查询的HQL语句所需的参数,如果没有填写null
     85      * @return    返回查询数据的集合,如果出现异常返回null
     86      * @procedure 执行过程
     87      * @see IBaseDao
     88      */
     89     List<T> find(String hql,Map<String, Object> params);
     90     
     91     /**
     92      *
     93      * <p>
     94      * <h3>方法功能描述:根据指定的HQL语句和参数以及分页所需的数据执行查询</h3>
     95      * </p>
     96      * @param hql   需要执行的查询的HQL语句
     97      * @param pageIndex    需要查询的页数
     98      * @param pageSize    每页显示的数据条数
     99      * @param params    执行的查询的HQL语句所需的参数,如果没有填写null
    100      * @return    返回分页查询的结果,是一个Map对象,该对象包含<blockquote>
    101      *        <b>data</b>:查询结果的数据集合是一个List对象<br>
    102      *         <b>pageIndex</b>:当前查询的页数<br>
    103      *         <b>pageSize</b>:每页显示的数据条数<br>
    104      *         <b>total</b>:数据的总条数<br>
    105      *         <b>pageTotal</b>:数据的总页数<br>
    106      *         <b>hasPrev</b>:是否有上一条数据<br>
    107      *         <b>hasNext</b>:是否有下一条数据<br>
    108      *         </blockquote>
    109      * @procedure 执行过程
    110      * @see IBaseDao
    111      */
    112     Map<String, Object> find(String hql, int pageIndex, int pageSize, Map<String, Object> params);
    113     
    114     /**
    115      *
    116      * <p>
    117      * <h3>方法功能描述:分页查询数据</h3>
    118      * </p>
    119      * @param pageIndex    需要查询的页数
    120      * @param pageSize    每页显示的数据条数
    121      * @return    返回分页查询的结果,是一个Map对象,该对象包含<blockquote>
    122      *        <b>data</b>:查询结果的数据集合是一个List对象<br>
    123      *         <b>pageIndex</b>:当前查询的页数<br>
    124      *         <b>pageSize</b>:每页显示的数据条数<br>
    125      *         <b>total</b>:数据的总条数<br>
    126      *         <b>pageTotal</b>:数据的总页数<br>
    127      *         <b>hasPrev</b>:是否有上一条数据<br>
    128      *         <b>hasNext</b>:是否有下一条数据<br>
    129      *         </blockquote>
    130      * @procedure 执行过程
    131      * @see IBaseDao
    132      */
    133     Map<String, Object> find(int pageIndex, int pageSize);
    134     
    135     /**
    136      *
    137      * <p>
    138      * <h3>方法功能描述:根据DetachedCriteria 对象设置的条件查询数据,该功能不具备分页操作</h3>
    139      * </p>
    140      * @param detachedCriteria    需要设置的对象查询条件
    141      * @return    返回查询数据的集合,如果出现异常返回null
    142      * @procedure 执行过程
    143      * @see IBaseDao
    144      */
    145     List<T> find(DetachedCriteria detachedCriteria);
    146 
    147     
    148     /**
    149      *
    150      * <p>
    151      * <h3>方法功能描述:根据DetachedCriteria 对象设置的条件进行分页查询</h3>
    152      * </p>
    153      * @param detachedCriteria    需要设置的对象查询条件
    154      * @param pageIndex    需要查询的页数
    155      * @param pageSize    每页显示的数据条数
    156      * @return    返回分页查询的结果,是一个Map对象,该对象包含<blockquote>
    157      *        <b>data</b>:查询结果的数据集合是一个List对象<br>
    158      *         <b>pageIndex</b>:当前查询的页数<br>
    159      *         <b>pageSize</b>:每页显示的数据条数<br>
    160      *         <b>total</b>:数据的总条数<br>
    161      *         <b>pageTotal</b>:数据的总页数<br>
    162      *         <b>hasPrev</b>:是否有上一条数据<br>
    163      *         <b>hasNext</b>:是否有下一条数据<br>
    164      *         </blockquote>
    165      * @procedure 拼接HQL语句
    166      * @see IBaseDao
    167      */
    168     Map<String, Object> find(DetachedCriteria detachedCriteria, int pageIndex, int pageSize)   
    169     
    170 }


    b.IBaseDao接口实现类--BaseDao

      1 package com.Elastic.SpringDemo1.ivy.dao;
      2 
      3 import java.io.Serializable;
      4 import java.lang.reflect.ParameterizedType;
      5 import java.util.HashMap;
      6 import java.util.List;
      7 import java.util.Map;
      8 
      9 import org.hibernate.Criteria;
     10 import org.hibernate.Query;
     11 import org.hibernate.Session;
     12 import org.hibernate.criterion.DetachedCriteria;
     13 import org.hibernate.criterion.Projections;
     14 
     15 import com.Elastic.SpringDemo1.ivy.util.HibernateUtil;
     16 //忽略警告
     17 @SuppressWarnings({ "rawtypes", "unchecked" })
     18 public class BaseDao<T> implements IBaseDao<T>{
     19     
     20     private Class entityClass;
     21     
     22     public BaseDao(){
     23         entityClass = this.getEntityClass();
     24     }
     25     
     26     /**
     27      *
     28      * <p>
     29      * <h3>方法功能描述:根据反射得到当前泛型参数(实体类)的数据类型</h3>
     30      * </p>
     31      * @return
     32      * @procedure 执行过程
     33      * @see BaseDao
     34      */
     35     private Class getEntityClass(){
     36         try {
     37             ParameterizedType paramsType = (ParameterizedType)this.getClass().getGenericSuperclass();//只能通过父类得到
     38             return (Class)paramsType.getActualTypeArguments()[0];
     39         } catch (Exception e) {
     40             e.printStackTrace();
     41         }
     42         return null;
     43     }
     44     
     45     @Override
     46     public Session getSession() {
     47         return HibernateUtil.getSession();
     48     }
     49 
     50     private Map<String, Object> createPageData(List<T> data, int pageIndex, int pageSize, int total) {
     51         Map<String, Object>  map = new HashMap<String, Object>();
     52         
     53         //获得总页数
     54         int pageTotal = (int)Math.ceil((double)total / pageSize);
     55         map.put("data", data);
     56         map.put("pageIndex", pageIndex);
     57         map.put("pageSize", pageSize);
     58         map.put("total", total);
     59         map.put("pageTotal", pageTotal);
     60         
     61         //boolean,若没赋值,默认true
     62         map.put("hasPrev", pageIndex > 1);
     63         map.put("hasNext", pageIndex < pageTotal);
     64         return map;
     65     }
     66 
     67     /* (non-Javadoc)
     68      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#save(java.lang.Object)
     69      */
     70     @Override
     71     public void save(T record) {
     72         this.getSession().save(record);
     73         
     74     }
     75 
     76     /* (non-Javadoc)
     77      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#delete(java.io.Serializable)
     78      */
     79     @Override
     80     public void delete(Serializable id) {
     81         this.getSession().delete(this.findById(id));
     82         
     83     }
     84 
     85     /* (non-Javadoc)
     86      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#delete(java.lang.Object)
     87      */
     88     @Override
     89     public void delete(T record) {
     90         this.getSession().delete(record);
     91         
     92     }
     93 
     94     /* (non-Javadoc)
     95      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#update(java.lang.Object)
     96      */
     97     @Override
     98     public void update(T record) {
     99         this.getSession().update(record);
    100         
    101     }
    102 
    103     /* (non-Javadoc)
    104      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#findById(java.io.Serializable)
    105      */
    106     @Override
    107     public T findById(Serializable id) {
    108         return (T) this.getSession().get(entityClass, id);
    109     }
    110 
    111     /* (non-Javadoc)
    112      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(java.lang.String, java.util.Map)
    113      */
    114     @Override
    115     public List<T> find(String hql, Map<String, Object> params) {
    116         Query query = this.getSession().createQuery(hql);
    117         query.setProperties(params);
    118         return query.list();
    119     }
    120 
    121     /* (non-Javadoc)
    122      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(java.lang.String, int, int, java.util.Map)
    123      */
    124     @Override
    125     public Map<String, Object> find(String hql, int pageIndex, int pageSize, Map<String, Object> params) {
    126         String hqlCount;
    127         //通过给定的HQL语句查询全部条数
    128         int i = hql.indexOf("from");
    129         if (i == 0) {
    130             hqlCount = "select count(*) " + hql;
    131         } else {
    132             hqlCount = "select count(*) " + hql.substring(i);
    133         }
    134         
    135         Query query = this.getSession().createQuery(hql);
    136         query.setProperties(params);
    137         
    138         //index从0开始
    139         query.setFirstResult((pageIndex - 1) * pageSize);
    140         query.setMaxResults(pageSize);
    141         
    142         int total = Integer.parseInt(this.getSession().createQuery(hqlCount).uniqueResult().toString());
    143         return this.createPageData(query.list(), pageIndex, pageSize, total);
    144     }
    145 
    146     /* (non-Javadoc)
    147      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(int, int)
    148      */
    149     @Override
    150     public Map<String, Object> find(int pageIndex, int pageSize) {
    151         Criteria criteria = this.getSession().createCriteria(entityClass);
    152         
    153         //查询总数
    154         criteria.setProjection(Projections.rowCount());
    155         int total = Integer.parseInt(criteria.uniqueResult().toString());
    156         criteria.setProjection(null);
    157         
    158         criteria.setFirstResult((pageIndex - 1) * pageSize);
    159         criteria.setMaxResults(pageSize);
    160         return this.createPageData(criteria.list(), pageIndex, pageSize, total);
    161     }
    162 
    163     /* (non-Javadoc)
    164      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(org.hibernate.criterion.DetachedCriteria)
    165      */
    166     public List<T> find(DetachedCriteria detachedCriteria) {
    167         return  detachedCriteria.getExecutableCriteria(getSession()).list();
    168     }
    169 
    170     /* (non-Javadoc)
    171      * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(org.hibernate.criterion.DetachedCriteria, int, int)
    172      */
    173     @Override
    174     public Map<String, Object> find(DetachedCriteria detachedCriteria, int pageIndex, int pageSize) {
    175         //查询总数
    176         int total = Integer.parseInt(detachedCriteria.getExecutableCriteria(getSession())
    177                 .setProjection(Projections.rowCount())
    178                 .uniqueResult().toString());
    179         
    180         //分页查询
    181         Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
    182         criteria.setFirstResult((pageIndex - 1) * pageSize);
    183         criteria.setMaxResults(pageSize);
    184         return this.createPageData(criteria.list(), pageIndex, pageSize, total);
    185     }
    186 }


    c.具体业务UserDao接口

    1 package com.Elastic.SpringDemo1.ivy.dao;
    2 
    3 import java.io.Serializable;
    4 
    5 import com.Elastic.SpringDemo1.ivy.entity.User;
    6 public interface UserDao extends IBaseDao<User>{
    7 }


    5.dao.impl包
    a.UserDaoImpl

     1 package com.Elastic.SpringDemo1.ivy.dao.impl;
     2 
     3 import java.io.Serializable;
     4 import java.util.List;
     5 import java.util.Map;
     6 
     7 import org.hibernate.Session;
     8 import org.hibernate.criterion.DetachedCriteria;
     9 
    10 import com.Elastic.SpringDemo1.ivy.dao.BaseDao;
    11 import com.Elastic.SpringDemo1.ivy.dao.UserDao;
    12 import com.Elastic.SpringDemo1.ivy.entity.User;
    13 
    14 public class UserDaoImpl extends BaseDao<User> implements UserDao {
    15 
    16     @Override
    17     public User findById(Serializable id) {
    18         if ("admin".equals(id.toString().trim())) {
    19             User user = new User();
    20             user.setLoginName("admin");
    21             user.setLoginPass("123456");
    22             return user;
    23         }
    24         return null;
    25     }
    26 }

    a2.list -- UserDaoImpl

     1 package com.Elastic.SpringDemo1.ivy.dao.impl;
     2 
     3 import java.io.Serializable;
     4 import java.util.List;
     5 import java.util.Map;
     6 
     7 import org.hibernate.Session;
     8 import org.hibernate.criterion.DetachedCriteria;
     9 
    10 import com.Elastic.SpringDemo1.ivy.dao.BaseDao;
    11 import com.Elastic.SpringDemo1.ivy.dao.UserDao;
    12 import com.Elastic.SpringDemo1.ivy.entity.User;
    13 
    14 public class UserDaoImpl extends BaseDao<User> implements UserDao {
    15     private List<User> list;
    16     
    17     
    18     public List<User> getList() {
    19         return list;
    20     }
    21 
    22     public void setList(List<User> list) {
    23         this.list = list;
    24     }
    25 
    26     @Override
    27     public User findById(Serializable id) {
    28         for (User user : list) {
    29             if (user.getLoginName().trim().equals(id.toString().trim())) {
    30                 return user;
    31             }
    32         }
    33         return null;
    34     }
    35 }


    6.service包
    a.UserService接口

    1 package com.Elastic.SpringDemo1.ivy.service;
    2 
    3 import com.Elastic.SpringDemo1.ivy.entity.User;
    4 
    5 public interface UserService {
    6     User login(String name,String pass);
    7 }


    7.service.impl包
    a.带参构造方法 --UserServiceImpl

     1 package com.Elastic.SpringDemo1.ivy.service.impl;
     2 
     3 import com.Elastic.SpringDemo1.ivy.dao.UserDao;
     4 import com.Elastic.SpringDemo1.ivy.entity.User;
     5 import com.Elastic.SpringDemo1.ivy.service.UserService;
     6 
     7 public class UserServiceImpl implements UserService {
     8     private UserDao userDao;    
     9     
    10     public UserDao getUserDao() {
    11         return userDao;
    12     }
    13 
    14     public void setUserDao(UserDao userDao) {
    15         this.userDao = userDao;
    16     }
    17 
    18     public UserServiceImpl(UserDao userDao) {
    19         this.userDao = userDao;
    20     }
    21 
    22     @Override
    23     public User login(String name, String pass) {
    24         User user = userDao.findById(name);
    25         /*if ("admin".equals(name.trim()) && "123456".equals(pass.trim())) {
    26             User user = new User();
    27             user.setLoginName("admin");
    28             user.setLoginPass("123456");;
    29             return user;
    30         }*/
    31         if (null != user && pass.equals(user.getLoginPass())) {
    32             return user;
    33         }
    34         return null;
    35     }
    36 }


    a2.无参构造方法 --UserServiceImpl

     1 package com.Elastic.SpringDemo1.ivy.service.impl;
     2 
     3 import com.Elastic.SpringDemo1.ivy.dao.UserDao;
     4 import com.Elastic.SpringDemo1.ivy.entity.User;
     5 import com.Elastic.SpringDemo1.ivy.service.UserService;
     6 
     7 public class UserServiceImpl implements UserService {
     8     private UserDao userDao;    
     9     
    10     public UserDao getUserDao() {
    11         return userDao;
    12     }
    13 
    14     public void setUserDao(UserDao userDao) {
    15         this.userDao = userDao;
    16     }
    17 
    18     @Override
    19     public User login(String name, String pass) {
    20         User user = userDao.findById(name);
    21         if (null != user && pass.equals(user.getLoginPass())) {
    22             return user;
    23         }
    24         return null;
    25     }
    26 }


    b.UserDaoImplT

    1 package com.Elastic.SpringDemo1.ivy.dao.impl;
    2 
    3 import com.Elastic.SpringDemo1.ivy.dao.BaseDao;
    4 import com.Elastic.SpringDemo1.ivy.dao.UserDao;
    5 import com.Elastic.SpringDemo1.ivy.entity.User;
    6 
    7 public class UserDaoImplT extends BaseDao<User> implements UserDao {
    8 
    9 }


    8.Spring配置文件
    a.带参构造方法 -- userContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xsi:schemaLocation="http://www.springframework.org/schema/beans
     5            http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7 
     8     <!-- 由Spring的IoC容器创建对象 -->
     9     <!-- 方法1 -->
    10       <bean id="userService" class="com.Elastic.SpringDemo1.ivy.service.impl.UserServiceImpl">
    11           <constructor-arg>
    12               <bean class="com.Elastic.SpringDemo1.ivy.dao.impl.UserDaoImpl"></bean>
    13           </constructor-arg>
    14       </bean>
    15     
    16     <!-- 方法2 -->
    17     <bean id="userDao" class="com.Elastic.SpringDemo1.ivy.dao.impl.UserDaoImpl"></bean>
    18     
    19     <bean id="userService" class="com.Elastic.SpringDemo1.ivy.service.impl.UserServiceImpl" p:userDao-ref="userDao">
    20           <constructor-arg>
    21               <ref bean="userDao"></ref>
    22           </constructor-arg>
    23       </bean>
    24 </beans>


    a2.带参构造方法 + list --userContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:p="http://www.springframework.org/schema/p"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6            http://www.springframework.org/schema/beans/spring-beans.xsd">
     7 
     8     <bean id="userDao" class="com.Elastic.SpringDemo1.ivy.dao.impl.UserDaoImpl">
     9         <!-- 设置一个测试数据 -->
    10         <property name="list">
    11             <list>
    12                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    13                     <property name="loginName" value="admin"></property>
    14                     <property name="loginPass" value="123456"></property>
    15                 </bean>
    16                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    17                     <property name="loginName" value="test"></property>
    18                     <property name="loginPass" value="123456"></property>
    19                 </bean>
    20                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    21                     <property name="loginName" value="admin"></property>
    22                     <property name="loginPass" value="123456"></property>
    23                 </bean>
    24                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    25                     <property name="loginName" value="admintest"></property>
    26                     <property name="loginPass" value="123456"></property>
    27                 </bean>
    28                 
    29                 <!-- 使用P命名空间完成复制 -->
    30                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User" p:loginName="admin123" p:loginPass="abcd123" >
    31                 </bean>
    32                 
    33             </list>
    34         </property>
    35     </bean>
    36 
    37     <!-- 由Spring的IoC容器创建对象 -->
    38       <bean id="userService" class="com.Elastic.SpringDemo1.ivy.service.impl.UserServiceImpl" p:userDao-ref="userDao">
    39           <constructor-arg>
    40               <ref bean="userDao"></ref>
    41           </constructor-arg>
    42       </bean>
    43 </beans>


    a3.带参构造 + 连接数据库 -- userContext.xml

     1 a4.P命名空间(对象) + 无参构造方法 -- userContext.xml
     2 <?xml version="1.0" encoding="UTF-8"?>
     3 <beans xmlns="http://www.springframework.org/schema/beans"
     4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5        xmlns:p="http://www.springframework.org/schema/p"
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans
     7            http://www.springframework.org/schema/beans/spring-beans.xsd">
     8 
     9     <!-- 外部bean,都可引用 -->
    10     <bean id="userDao" class="com.Elastic.SpringDemo1.ivy.dao.impl.UserDaoImpl">
    11         <!-- 设置一个测试数据 -->
    12         <property name="list">
    13             <list>
    14                 <!-- 内部bean,不能引用 -->
    15                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    16                     <property name="loginName" value="admin"></property>
    17                     <property name="loginPass" value="123456"></property>
    18                 </bean>
    19                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    20                     <property name="loginName" value="test"></property>
    21                     <property name="loginPass" value="123456"></property>
    22                 </bean>
    23                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    24                     <property name="loginName" value="admin"></property>
    25                     <property name="loginPass" value="123456"></property>
    26                 </bean>
    27                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User">
    28                     <property name="loginName" value="admintest"></property>
    29                     <property name="loginPass" value="123456"></property>
    30                 </bean>
    31                 
    32                 <!-- 使用P命名空间完成复制 -->
    33                 <bean class="com.Elastic.SpringDemo1.ivy.entity.User" >
    34                     <property name="loginPass">
    35                         <null></null>
    36                     </property>
    37                 </bean>
    38                 
    39             </list>
    40         </property>
    41     </bean>
    42     
    43     <!-- 连接数据库测试 -->
    44     <bean id="userDaoImpl" class="com.Elastic.SpringDemo1.ivy.dao.impl.UserDaoImplT"></bean>
    45 
    46     <!-- 由Spring的IoC容器创建对象 -->
    47       <bean id="userService" class="com.Elastic.SpringDemo1.ivy.service.impl.UserServiceImpl" p:userDao-ref="userDao">
    48       </bean>
    49 </beans>


    9.test包

     1 package com.Elastic.SpringDemo1.ivy.test;
     2 
     3 import java.util.Scanner;
     4 
     5 import org.springframework.context.ApplicationContext;
     6 import org.springframework.context.support.ClassPathXmlApplicationContext;
     7 
     8 import com.Elastic.SpringDemo1.ivy.entity.User;
     9 import com.Elastic.SpringDemo1.ivy.service.UserService;
    10 
    11 public class TestUser {
    12 
    13     public static void main(String[] args) {
    14         ApplicationContext context = new ClassPathXmlApplicationContext("userContext.xml");
    15         UserService userService = (UserService)context.getBean("userService");
    16         Scanner input = new Scanner(System.in);
    17         String name = input.next();
    18         String pass = input.next();
    19         User user = userService.login(name, pass);
    20         if (null == user) {
    21             System.out.println("登录失败");
    22         } else {
    23             System.out.println("登录成功");
    24         }
    25     }
    26 
    27 }



  • 相关阅读:
    HTML导航
    html5学习笔记
    crm使用soap启用和停用记录
    crmjs区分窗口是否是高速编辑(2)
    关于strace的一点东西
    Android studio第一次使用配置(三)gradle项目构建
    IntelliJ IDEA 问题总结之二(待补充) —— 快捷键、主题样式、导出jar、sqlite
    spark之map与flatMap差别
    leetcode:String to Integer (atoi)
    oracle索引的操作
  • 原文地址:https://www.cnblogs.com/ivy-xu/p/5644988.html
Copyright © 2011-2022 走看看