一、HibernateUtil.java
public final class HibernateUtil {
/*
* 每个程序只做一次,因为很耗时。
* 一般写到一个工具类里,HibernateUtil一般不希望被继承(定义为final类),
* 也不希望被实例化(将构造方法定义为私有的)
* 而且我们希望初始化这段代码只做一次,放在static代码块中只执行一次。
*
* 如果不是hibernate.cfg.xml文件名或者此文件不是放在class path根目录下,则需在cfg.configure("XXX");中指定。
*
* Session:<span style="color:#ff0000;">引入org.hibernate包中的,不要导错包</span>。
*/
<span style="white-space:pre"> </span>private static SessionFactory sessionFactory;
<span style="white-space:pre"> </span>private HibernateUtil(){}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>static{
<span style="white-space:pre"> </span>Configuration cfg=new Configuration();
<span style="white-space:pre"> </span>cfg.configure();
<span style="white-space:pre"> </span>sessionFactory=cfg.buildSessionFactory();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static SessionFactory getSessionFactory() {
<span style="white-space:pre"> </span>return sessionFactory;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public static Session getSession(){
<span style="white-space:pre"> </span>return sessionFactory.openSession();
<span style="white-space:pre"> </span>}
}
二、hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/test_hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!--
把运行时的sql语句打印出来。基本不需要,调试性能或看sql语句时才需要这个。
-->
<property name="show_sql">true</property>
<!--
想不想建表,如果想让hibernate帮你建表,则需配置 hbm2ddl.auto;否则不需要。
hbm2ddl.auto可配置的参数:1)create-drop启动时把表删了再创建,最后在程序结束时(即虚拟机退出前)
再把所有的表都删掉。2)create启动时把表删了再创建,但是在程序结束时不删表。3)update它会根据映射
文件把数据库的表结构更新一遍;假设映射文件中多了一个字段,hibernate更新时会把这个字段加到数据库
表中,并且把数据保存进去;如果映射文件少了一个字段,则会把数据库表中的字段删掉。4)validate把映射
文件和数据库中的表校验一遍,如果不一致会报异常;程序就终止了。
-->
<property name="hbm2ddl.auto">create</property>
<mapping resource="cn/itcast/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
主要配置了property(连接数据库的属性)和mapping(指定对象模型和关系模型对应关系的文件的路径)。
三、Domain object三个限制条件:
1、实体类必须包含不带参数的构造方法。
2、实体类有无意义的标识符id(主键,最好有)
3、实体类是非final(final类不允许被继承)的,对懒加载有影响(最好非final)
四、User.hbm.xml
<hibernate-mapping package="cn.itcast.hibernate.domain">
<!--
table:用来指定跟类关联的表名,不写的话默认是与类名相同的表。
id:用来映射主键,代表数据库中的一个主键。主键通过什么产生的,通过generator产生。
property:name指的是实体类中的成员变量,column指的是跟成员变量相对应的数据库中的字段。不写的话默认为与成员变量名相同。
复合主键:用<composite-id></composite-id>或者在id后面继续增加,即<id name="id"
name="test">。
-->
<class name="User" table="user">
<id name="id">
<generator class="increment" />
</id>
<property name="birthday" />
<property name="name" column="name" unique="true"/>
</class>
</hibernate-mapping>
五、接口
public interface UserDao {
public void saveUser(User user);
public User findUserByName(int id);
public User findUserByName(String name);
public void updateUser(User user);
public void remove(User user);
}
六、接口实现类
public class UserDaoHibernateImpl implements UserDao {
@Override
public User findUserByName(int id) {
//因查询不涉及到更改数据库,所以不用开启事务。
Session s=null;
try{
s=HibernateUtil.getSession();
/*
* 用load()不行:因为load()只有在第一次使用时才会去加载数据,但此方法中完全没有使用数据,
* 所以它根本就不会访问数据库。当你把user返回给别人,别人再去访问数据库就会出错了,
* 因为这是session关掉了,根本没法连接数据库了。
*/
User user=(User) s.get(User.class, id);
return user;
}finally{
if(s!=null)
s.close();
}
}
@Override
public User findUserByName(String name) {
Session s=null;
try{
s=HibernateUtil.getSession();
Criteria c=s.createCriteria(User.class);
c.add(Restrictions.eq("name", name));
//如果不唯一,就报错。
User user=(User) c.uniqueResult();
return user;
}finally{
if(s!=null)
s.close();
}
}
public User findUserByName1(String name) {
Session s=null;
try{
s=HibernateUtil.getSession();
String hql="from User as user where user.name=:n";//from Object:即必须是对象而不是数据库表名
Query q=s.createQuery(hql);
q.setString("n", name);
User user=(User) q.uniqueResult();
return user;
}finally{
if(s!=null)
s.close();
}
}
@Override
public void remove(User user) {
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
s.delete(user);
tx.commit();
}finally{
if(s!=null)
s.close();
}
}
@Override
public void saveUser(User user) {
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
s.save(user);
tx.commit();
}finally{
if(s!=null)
s.close();
}
}
@Override
public void updateUser(User user) {
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
s.update(user);
tx.commit();
}finally{
if(s!=null)
s.close();
}
}
}
最后一步了,测试结果:
public static void main(String[] args) {
User user=new User();
user.setBirthday(new Date());
user.setName("name");
addUser(user);
System.out.println("id:"+user.getId());
User u=getUser(user.getId());
System.out.println("name:"+u.getName());
}