hibernate基本架构(2)

下面需要根据数据库表,完成Vo对象。

注意,在一些框架中,VO课程被称为其他的称呼。

TO(EJB1,2),POJO(Hibernate),EntityBean(EJB3)


MyEclipse中提供了根据表自动生成pojo和映射文件的功能。

wKioL1MUW-HBOGZOAAYZB8qyCyk134.jpg\"



wKioL1MUXB2geF5yAAL23Bh9KrI204.jpg\"


wKiom1MUXFfBrYqiAAJoYZEmEQI374.jpg\"

这里需要选择主键生成方式,主要有以下几种:

1) assigned:通过程序添加。

2) sequence:通过Oracle的序列生成主键值

3) native:通过数据库表中自带的关键字生成主键值,例如:MySQL,SQLServer,DB2,HSQL等

4) increment:自增长,通过程序实现自增长功能。

5) UUID:生成一个32的位随机值作为主键。

wKiom1MUXHPTs5cjAAJ4-cOwDjw653.jpg\"

wKioL1MUXGmR7paYAAD0Tq4mw3E266.jpg\"

选No

生成的pojo对象

public class News implements java.io.Serializable {
    private Integer id;
    private String title;
    private String content;
    private Date pubDate;


映射文件要求能看懂,会改。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!--
        News类和SUNXUN用户下的NEWS表映射.
    -->
    <class name="org.liky.pojo.News" table="NEWS" schema="SUNXUN">
        <!--
            类中的Integer类型的id对应表中的主键
        -->
        <id name="id" type="java.lang.Integer">
            <!--
                表中主键字段为ID
            -->
            <column name="ID" precision="8" scale="0" />
            <!--
                主键生成方式
            -->
            <generator class="assigned" />
        </id>
        <!--
            类中的String类型的title属性与表中的TITLE字段对应,长度是50,不允许为空
        -->
        <property name="title" type="java.lang.String">
            <column name="TITLE" length="50" not-null="true" />
        </property>
        <property name="content" type="java.lang.String">
            <column name="CONTENT" length="500" not-null="true" />
        </property>
        <property name="pubDate" type="java.util.Date">
            <column name="PUB_DATE" length="7" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


这里完成一个公共的DAO接口方法,为了方便使用。

/**
 * 公共接口
 *
 * @param <K>
 *            主键类型
 * @param <V>
 *            Vo对象的类型
 */
public interface IDAO<K, V> {
    public void doCreate(V vo) throws Exception;
    public void doUpdate(V vo) throws Exception;
    public void doRemove(K id) throws Exception;
    public List<V> findAll() throws Exception;
    public V findById(K id) throws Exception;
    /**
     * 分页查询方法
     * @param pageNo 当前页号
     * @param pageSize 每页记录数
     * @param keyword 关键字
     * @param column 查询的字段名
     * @return
     * @throws Exception
     */
    public List<V> findAll(int pageNo, int pageSize, String keyword,
            String column) throws Exception;
    /**
     * 查询全部记录数,用来计算总页数
     * @param keyword
     * @param column
     * @return
     * @throws Exception
     */
    public int getAllCount(String keyword, String column) throws Exception;
}

通过这种文档注释,可以生成API文档。


wKioL1MUYUfTOEMeAAcsu1v76RA862.jpg通过这种文档注释,可以生成API文档。

wKiom1MUYW7jPaNfAALRXlk3oqs556.jpg




建立新闻的接口,继承公共接口,完成操作。


public interface INewsDAO extends IDAO<Integer, News> {
}

建立实现类对象

public class NewsDAOImpl implements INewsDAO {
    public void doCreate(News vo) throws Exception {
        HibernateSessionFactory.getSession().save(vo);
    }
    public void doRemove(Integer id) throws Exception {
        // 注意,使用Hibernate删除时,必须先查询对象,再删除.
        HibernateSessionFactory.getSession().delete(findById(id));
    }
    public void doUpdate(News vo) throws Exception {
        HibernateSessionFactory.getSession().update(vo);
    }
    public List<News> findAll() throws Exception {
        // 使用HQL语句完成查询功能
        // 1.HQL查询的是类,而不是表
        // 2.可以不写SELECT关键字
        String hql = "FROM News";
        Query query = HibernateSessionFactory.getSession().createQuery(hql);
        return query.list();
    }
    public List<News> findAll(int pageNo, int pageSize, String keyword,
            String column) throws Exception {
        String hql = "FROM News AS n WHERE n." + column + " LIKE ?";
        Query query = HibernateSessionFactory.getSession().createQuery(hql);
        query.setString(0, "%" + keyword + "%");
        // 分页处理
        query.setFirstResult((pageNo - 1) * pageSize);
        query.setMaxResults(pageSize);
        return query.list();
    }
    public News findById(Integer id) throws Exception {
        // 根据主键完成查询功能,需要传入类型,以及主键值
        return (News) HibernateSessionFactory.getSession().get(News.class, id);
    }
    public int getAllCount(String keyword, String column) throws Exception {
        // 这里由于查询的不再是对象,因此必须写SELECT统计数量
        String hql = "SELECT COUNT(n) FROM News AS n WHERE n." + column
                + " LIKE ?";
        Query query = HibernateSessionFactory.getSession().createQuery(hql);
        query.setString(0, "%" + keyword + "%");
                            
        return (Integer) query.uniqueResult();
    }
}

工厂

public class DAOFactory {
    public static INewsDAO getINewsDAOInstance() {
        return new NewsDAOImpl();
    }
}


编写Service层,这里随意定义几个方法


public interface INewsService {
    public void insert(News news) throws Exception;
    public void delete(int id) throws Exception;
    public News findById(int id) throws Exception;
    // 如果要一次性返回多种类型的数据,可以使用Map集合,这样方便区分.
    public Map<String, Object> list(int pageNo, int pageSize, String keyword,
            String column) throws Exception;
}

建立实现类


public class NewsServiceImpl implements INewsService {
    public void delete(int id) throws Exception {
        // 加入事务处理功能
        Transaction tx = HibernateSessionFactory.getSession()
                .beginTransaction();
        try {
            DAOFactory.getINewsDAOInstance().doRemove(id);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
    }
    public News findById(int id) throws Exception {
        News news = null;
        try {
            news = DAOFactory.getINewsDAOInstance().findById(id);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
        return news;
    }
    public void insert(News news) throws Exception {
        // 加入事务处理功能
        Transaction tx = HibernateSessionFactory.getSession()
                .beginTransaction();
        try {
            DAOFactory.getINewsDAOInstance().doCreate(news);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
    }
    public Map<String, Object> list(int pageNo, int pageSize, String keyword,
            String column) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            map.put("allNews", DAOFactory.getINewsDAOInstance().findAll(pageNo,
                    pageSize, keyword, column));
            map.put("allCount", DAOFactory.getINewsDAOInstance().getAllCount(
                    keyword, column));
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
        return map;
    }
}



工厂类

public class ServiceFactory {
    public static INewsService getINewsServiceInstance() {
        return new NewsServiceImpl();
    }
}


JUnit测试

针对Service的所有方法,开发中一般要求使用JUnit编写测试用例进行测试。


先在项目根目录下建立一个源文件夹。



在要测试的类上点右键,选择建立一个测试用例。



wKioL1MUYWOSEkVrAAE0ltBsUUw701.jpg

wKiom1MUYYmBtdYHAAia_qgmArA955.jpg

wKioL1MUYWPh_V0lAAEuKn-pTJk585.jpg

wKiom1MUYYrSwXPfAAJMLLyV2iI060.jpg

配置好各个属性

wKiom1MUXTLDM0PVAAGtOfMTVBk986.jpg\"



你可能感兴趣的:(sequence,content,assigned)