下面需要根据数据库表,完成Vo对象。
注意,在一些框架中,VO课程被称为其他的称呼。
TO(EJB1,2),POJO(Hibernate),EntityBean(EJB3)
MyEclipse中提供了根据表自动生成pojo和映射文件的功能。
这里需要选择主键生成方式,主要有以下几种:
1) assigned:通过程序添加。
2) sequence:通过Oracle的序列生成主键值
3) native:通过数据库表中自带的关键字生成主键值,例如:MySQL,SQLServer,DB2,HSQL等
4) increment:自增长,通过程序实现自增长功能。
5) UUID:生成一个32的位随机值作为主键。
选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文档。
通过这种文档注释,可以生成API文档。
建立新闻的接口,继承公共接口,完成操作。
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编写测试用例进行测试。
先在项目根目录下建立一个源文件夹。
在要测试的类上点右键,选择建立一个测试用例。
配置好各个属性