HelloWorld-Hibernate3.6

以下工程基于Hibernate3.6+mysql数据库

${hibernate}代表Hibernate压缩包的解压目录。

一、新建java工程

     1、在工程目录下,新建lib文件夹,存放所需jar包。

           包括${hibernate}\hibernate3.jar,${hibernate}\lib\required下的6个包,${hibernate}\jpa下的1个包,以及连接Mysql的驱动类mysql-connector

            HelloWorld-Hibernate3.6_第1张图片

            将包添加至工程依赖:选择所有添加的包,右键—>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 
         用于共享主键的时候。(一对一主键关联);

你可能感兴趣的:(HelloWorld-Hibernate3.6)