以下工程基于Hibernate3.6+mysql数据库
${hibernate}代表Hibernate压缩包的解压目录。
一、新建java工程
1、在工程目录下,新建lib文件夹,存放所需jar包。
包括${hibernate}\hibernate3.jar,${hibernate}\lib\required下的6个包,${hibernate}\jpa下的1个包,以及连接Mysql的驱动类mysql-connector
将包添加至工程依赖:选择所有添加的包,右键—>Build Path—>Add to Build Path
同时为了方便测试,可添加JUnit库
二、添加数据库链接配置
1、添加配置文件:右键工程—>Other—>Hibernate—>Hibernate Configuration File(cfg.xml),
保持默认创建位置于src目录下,保持默认名字hibernate.cfg.xml,点击next,可填写方言、连接url等
或直接复制${hibernate}\project\etc下的hibernate.cfg.xml
具体配置可参考${hibernate}\project\etc下的hibernate.properties(包含各种数据库的配置参数)
配置后如下图:
url中的hibernate表示数据库名
<!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 name="foo"> <property name="show_sql">true</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">scott</property> <property name="hibernate.connection.password">tiger</property> <mapping resource="entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
三、构建实体类及映射
1、构建实体类entity.User,包含编号id(int),姓名name(String),及其get/set方法等
2、添加数据库表user(不区分大小写),包含id(int,主键,自增),name(varchar,长度20)
3、添加类到表的映射:选择User.java,右键—>Other—>Hibernate—>Hibernate XML Mapping file(hbm.xml),
直接finish(位于实体类所在文件夹)
4、修改class节点的table属性值为新建的表名,所有的column值为对应的表列名,修改id 节点generator的class属性为native
完成后文件如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="entity.User" table="USER"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> </class> </hibernate-mapping>
四、构建管理类
public class DBManager { private static SessionFactory sessionFactory; private static Configuration configuration; static{ configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); sessionFactory = configuration.buildSessionFactory(); } public static SessionFactory getSessionFactory(){ if(null==sessionFactory||sessionFactory.isClosed()){ sessionFactory = configuration.buildSessionFactory(); } return sessionFactory; } }
5、User类接口
public interface UserDao { public int save(User user) throws Exception; public void delete(int userId) throws Exception; public void update(User user) throws Exception; public User findUserById(int userId) throws HibernateException; public List<User> findAllUser(); public QueryResult findAllByPage(int page); }
6、User实现类
public class UserDaoImpl implements UserDao { @Override public int save(User user) throws Exception { Session session = DBManager.getSessionFactory().openSession(); Transaction tx = null; int userId ; try { tx = session.beginTransaction(); userId = (Integer)session.save(user);//返回主键值 tx.commit(); } catch (HibernateException e) { tx.rollback(); throw new Exception(e); } finally{ session.close(); } return userId; } @Override public void delete(int userId) throws Exception{ Session session = DBManager.getSessionFactory().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); User delUser = (User) this.findUserById(userId); session.delete(delUser); tx.commit(); } catch (HibernateException e) { tx.rollback(); throw new Exception(e); } finally{ session.close(); } } @Override public void update(User user) throws Exception{ Session session = DBManager.getSessionFactory().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.update(user); tx.commit(); } catch (HibernateException e) { tx.rollback(); throw new Exception(e); } finally{ session.close(); } } @Override public User findUserById(int userId) throws HibernateException{ Session session = DBManager.getSessionFactory().openSession(); User user = (User)session.get(User.class, userId); return user; } @SuppressWarnings("unchecked") @Override public List<User> findAllUser() { Session session = DBManager.getSessionFactory().openSession(); return (List<User>)session.createQuery(" from User")//hql语句,User代表类名 .list(); } @SuppressWarnings("unchecked") @Override public QueryResult findAllByPage(int page) { Session session = DBManager.getSessionFactory().openSession(); QueryResult qr = null; int pageSize = 10; Long count = (Long)session.createQuery( "SELECT COUNT(*) FROM User")//hql语句,通过User类,映射表查询 .uniqueResult(); List<User> list = (List<User>)session.createQuery(" from User") .setFirstResult((page-1)*pageSize) .setMaxResults(pageSize) .list(); qr = new QueryResult(count.intValue(),list); return qr; } }
7、构建测试类
public class UserDaoImplTest { public static UserDao userDao; @BeforeClass public static void testBeforeClass(){ userDao = new UserDaoImpl(); }
@Test public void testSave() { User user = new User(0,"张三"); try { int userId = userDao.save(user); } catch (Exception e) { e.printStackTrace(); } } @Test public void testDelete() { try { userDao.delete(4); } catch (Exception e) { e.printStackTrace(); } } @Test public void testUpdate() { try { int userId = 5; User user = userDao.findUserById(userId); user.setName("李四"); userDao.update(user); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } } @Test public void testFindUserById() { int userId = 5; User user = userDao.findUserById(userId); System.out.println(user); } @Test public void testFindAllUser() { List<User> list = userDao.findAllUser(); for(User user:list){ System.out.println(user); } } @Test public void testFindAllByPage() { int page = 1; QueryResult qr = userDao.findAllByPage(page); for(User user:(List<User>)qr.getList()){ System.out.println(user); } } }
PS、关于id的生成策略详解
以下摘自http://ryxxlong.iteye.com/blog/612446
一:主键生成策略大体分类:
1:hibernate 负责对主键ID赋值
2:应用程序自己为主键ID赋值(不推荐使用)
3:底层数据库为主键ID赋值
二:具体用法
1:increment:(跨平台的)
以递增的方式为代理主键赋值,每次维护的当前实例中取出一个最大值,在最大值的基础之上再进行加法
(查看org.hibernate.id.IncrementGenerator 类),不适合集群服务器访问数据的情 况,否则会产生并发冲突问题(主键重复)。
并且id 的类型必须是long ,int ,short类型的。
2:assigned :由程序员给赋值,(不建议使用)
3:identity:是由底层的数据库来生成主键,他要求底层数据库支持自动增长,并且把主键定义成自动增长类型的 ,
id 必须是long ,int ,short 类型的。 Oracle 不支持,Mysql 支持。
4:sequence:由底层的数据根据序列来生成主键。oracle ,db2数据库支持,mysql不支持 。
5:native:(跨平台的,推荐)
由hibernate 自己跟据不同的数据库的主键生成方式,自己选择生成方式(可以跨平台)
6:hilo :(跨平台的),通过hi/lo算法实现主键的生成机制,但是需要额外的表来保存主键的生成历史,使用时要先插入一个值。
使用规则: 通用性和安全性:
7:seqhilo:取得sequence的值,来生成高位,产生id。
但是只能使用于有sequence的数据库(oracle , db2);
8:uuid.hex:
用系统时间和ip地址等具有天然唯一性的资源进行计算,生成id, 全球唯一。生成的是一个128位的二进制数。然后把这个二进制数,转化成一个16进制的数(32位),再转化为字符串付给我们的id。那么我们的实体类的oid以及数据库的主键都需要随之改为字符串类型的。
9:foreign
用于共享主键的时候。(一对一主键关联);