今天配置Hibernate配置了好久,各种改错。说实话,我并没有感觉到使用Hibernate的方便之处,至少比Django麻烦的多。
下面总结一下今天对Hibernate的使用。
1、下载Hibernate
到这里http://hibernate.org/orm/releases/下载,我使用的是java 8,所有下载了5.2。下载后解压,将required文件下的jar文件加入的工程中去。
2、配置文件之hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume test is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/pgv2 </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property> <!-- show_sql: 操作数据库时,会 向控制台打印sql语句 --> <property name="show_sql">true</property> <!-- format_sql: 打印sql语句前,会将sql语句先格式化 --> <property name="format_sql">true</property> <!-- 是否自动创建数据库表 他主要有一下几个值: validate:当sessionFactory创建时,自动验证或者schema定义导入数据库。 create:每次启动都drop掉原来的schema,创建新的。 create-drop:当sessionFactory明确关闭时,drop掉schema。 update(常用):如果没有schema就创建,有就更新。 --> <property name="hbm2ddl.auto">update</property> <!-- List of XML mapping files --> <property name="dialect"></property> <mapping resource="User.hbm.xml" /> <mapping resource="onlineUser.hbm.xml" /> </session-factory> </hibernate-configuration>
这里我加了一些注释,有些一眼就可以明白的东西就没有注释了(还是没有随手注释的习惯)。一般常用的配置这样就可以了。
我想说的是这个文件的存放位置,所有的hibernate的配置文件的存放位置,默认都在src下,我查了一些怎么修改也没有找到。真是让强迫症的我难受的很。。
这样就配置好了hibernate的数据库连接。
3、实体类
实体类要写入数据库的属性必须有setter和getter,必须有构造方法。如果是mysql数据库,必须有一个id作为主键,一般变量名也直接设置为id
看我的User类:
package com.PGV2.javaBean; public class User { private int id; private String userName; private String userPwd; private String role; private int login; public User( String userName, String userPwd, String role, int login) { this.userName = userName; this.userPwd = userPwd; this.role = role; this.login = login; } public User() { // TODO Auto-generated constructor stub } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public int isLogin() { return login; } public void setLogin(int login) { this.login = login; } }
要注意的是,id是自增的,不用写在构造方法里。
4、实体类配置文件 User.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.PGV2.javaBean.User" table="user"> <meta attribute="class-description"> This class contains the User detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="userName" column="username" type="string"/> <property name="userPwd" column="userpwd" type="string"/> <property name="role" column="role" type="string"/> <property name="login" column="login" type="int"/> </class> </hibernate-mapping>
5、DAO操作
我把DAO操作直接封装在一个类中,这样用的时候示例化这个类就行。没有接口类,时间有限。。
我的manageUser.java
package com.PGV2.DAO; import java.util.List; import javax.management.Query; import java.util.Date; import java.util.Iterator; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Restrictions; import com.PGV2.javaBean.User; import com.PGV2.test.Employee; public class manageUser { private static SessionFactory factory; public manageUser() { // TODO Auto-generated constructor stub try { factory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } } /* * 增加一个用户 */ public Integer addUser(User tmpUser) { Session session = factory.openSession(); Transaction tx = null; Integer userID = null; try { tx = session.beginTransaction(); User newUser = tmpUser; userID = (Integer) session.save(newUser); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return userID; } /* * 列出所有的用户 */ public List listUsers() { Session session = factory.openSession(); Transaction tx = null; List users = null; try { tx = session.beginTransaction(); users = session.createQuery("FROM User").list(); for (Iterator iterator = users.iterator(); iterator.hasNext();) { User tmpUser = (User) iterator.next(); System.out.println(tmpUser.getUserName()); } tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return users; } /* * 更新密码 */ public void updateUserPwd(Integer userID, String pwd) { Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); User tmpUsere = (User) session.get(User.class, userID); tmpUsere.setUserPwd(pwd); ; session.update(tmpUsere); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } /* * 更新用户在线状态 */ public void updateUser(User tmpUser){ Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); //User tmpUsere = (User) session.get(User.class, tmpUser.getId()); session.update(tmpUser); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } /* * 删除一个用户 */ public void deleteEmployee(Integer userID) { Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); User tmpUser = (User) session.get(User.class, userID); session.delete(tmpUser); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } public User getUserById(Integer userID) { Session session = factory.openSession(); Transaction tx = null; User tmpUser = null; try { tx = session.beginTransaction(); tmpUser = (User) session.get(User.class, userID); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return tmpUser; } public User getUserByValid(String userName, String userPwd) { Session session = factory.openSession(); Transaction tx = null; User tmpUser = null; try { tx = session.beginTransaction(); org.hibernate.query.Query query = session.createQuery("from User u where u.userName = :name and u.userPwd = :pwd") .setParameter("name", userName).setParameter("pwd", userPwd); List res = query.list(); if(res!=null||res.size()!=0){ Iterator it = res.iterator(); tmpUser = (User) it.next(); } tx.commit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { session.close(); } return tmpUser; } }
这里要特别说明有两个对应:
实体类配置文件的变量名要和实体类的变量名一致。
比如说我的User.java 里有变量:userName,我的User.hbm.xml里
<property name="userName" column="username" type="string"/>,这个对应的 name就应该是userName,至于大小写是否敏感,还没有验证。最后一致。然后column的值跟
数据库的列名一致。我一般不建立表格,让其自己生成,不容易出错。
第二个对应是这里:
org.hibernate.query.Query query = session.createQuery("from User u where u.userName = :name and u.userPwd = :pwd") .setParameter("name", userName).setParameter("pwd", userPwd);
这是我的manageUser中的一句话,使用hql查询数据库是否存在用户名和密码为我传入的两个值的记录。
这里的hql 语句中,from User,这个User对应的User.java这个类,当然u.userName和u.userPwd对应的就是User类的两个类成员变量。