1.如何新建一个hibernate项目?
①先在官网下载hibernate包,解压。我的是hibernate-3.2.0.ga.rar
⑤新建一个po类(plain object),即实体类。User,并写全get/set方法
⑥增加映射文件User.hbm.xml,这可以参考eg/User.hbm.xml。映射文件和实体类需写到同一个包中。映射文件hbm.xml说明了po实体类和数据库表的对应关系,以及po中属性和数据库表字段的对应关系。可以如下:
⑧新建测试类Test,如下:
execute是struts2中默认会执行的方法,exexute的作用相当于servlet中的doGet和doPost方法
一个hibernate.cfg.xml中只能写一个<session-factory>,一个<session-factory>只对应一个数据库(而不是一张数据库表)。 若想关联多个数据库,就必须写多个SessionFactory
①transient临时态,指new出来的对象,跟session没有任何关系,也跟数据库没有任何关系,数据库中没有对应记录存在
②persist持久态,指以map形式保存在session缓存中的对象。数据库中有对应的记录(即只要和session挂钩后就会在数据库发生联系)。保存方式为key-value(键值对)形式。如key的格式为
其中<generator class="native"></generator>表示设置id为主键。
①先在官网下载hibernate包,解压。我的是hibernate-3.2.0.ga.rar
②新建一个java project,而不是以往的web project.并在项目根目录建一个lib包,导入需要的jar和mysql或oracle驱动包。这些jar可在hibernate中找。如下
③全选jar包,右键,build path,将jar引入项目中。这一步不能忘。
④将hibernate中etc目录下的hibernate.cfg.xml拷贝到项目的src下,并修改。可结合etc/hibernate.prpperties.修改后可为:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/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><!--注意该行的value为com.mysql.jdbc.Driver,不是其它的-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testhibernate</property><!--testhibernate为数据库名-->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<mapping resource="com/bjsxt/po/User.hbm.xml"/><!--有一个表就写一个映射-->
</session-factory>
</hibernate-configuration>
注意,复制后要把<session-factory name="foo">的name属性去掉,否则会报错。因为多了name属性hibernate会尝试将sessionfactory注册到jndi上。
⑤新建一个po类(plain object),即实体类。User,并写全get/set方法
⑥增加映射文件User.hbm.xml,这可以参考eg/User.hbm.xml。映射文件和实体类需写到同一个包中。映射文件hbm.xml说明了po实体类和数据库表的对应关系,以及po中属性和数据库表字段的对应关系。可以如下:
<?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>
<class name="com.bjsxt.po.User" table="t_user"><!--数据库中一定要存在这个表t_user-->
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<property name="tel" column="tel"></property>
</class>
</hibernate-mapping>
⑦然后修改hibernate.cfg.xml,让hibernate知道对应关系 。<mapping resource="com/bjsxt/po/User.hbm.xml"/>,上边已写好。
⑧新建测试类Test,如下:
public class Test {
public static void main(String[] args) {
Configuration conf = new Configuration();//Configuration管理数据库的配置信息
conf.configure();
SessionFactory factory = conf.buildSessionFactory();
Session session = factory.openSession();//产生一个seession对象
//在hiberbate中,autoCommit=false
User user = new User();
user.setName("Hah");
user.setTel("232323");
session.beginTransaction();//开始一个事务
session.save(user);
session.getTransaction().commit();//提交事务
session.close();//关闭session,也就关闭了事务
}
}
结果就是往数据库表t_user添加一行数据name="Hah",tel="232323"。可以看出就不用写sql语句,就能往数据库添加数据。
2.在搭建hibernate环境时,hibernate.cfg.xml中的
<property name="hibernate.hbm2ddl.auto"> </property>
有四个属性。如下:(1)create-drop(2)create(3)update(4)validate
<property name="hibernate.hbm2ddl.auto">creat-drop</property>
//表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用
<property name="hibernate.hbm2ddl.auto">creat</property>
//表示hibernate在初始化时新建表格,程序结束后不删除。再一次运行时若有旧表格,就删除重建。
<property name="hibernate.hbm2ddl.auto">update</property>
//表示hibernate初始化时,根据映射表和数据库中作对比,若不一致就更新表的结构
<property name="hibernate.hbm2ddl.auto">validate</property>
//表示在hibernate初始化时只做表的校验,若不一致就报错。
3.在hibernate中,根据id操作的都需要用到这一步。
session.get(User.class,id);
如
User user = session.get(User.class,2);//就是取出id为2的user对象
public User findById(int id){
User user = (User) session.get(User.class,id);//User.class可以获取User类中所有方法和属性
}
public void delById(int id){
session.delete(session.get(User.class,id));
}
4.struts2的action中是name,class;而struts则是path,type;
execute是struts2中默认会执行的方法,exexute的作用相当于servlet中的doGet和doPost方法
5..hibernate中一个实体类就对应一张数据表,这在实体类的映射表中可以体现。如上边第一条中的
<class name="com.bjsxt.po.User" table="t_user">
就成对应关系。
一个hibernate.cfg.xml中只能写一个<session-factory>,一个<session-factory>只对应一个数据库(而不是一张数据库表)。 若想关联多个数据库,就必须写多个SessionFactory
6.在hibernate的增删改查操作中,因为findById,findAll只为读操作,没有涉及到事务,所以在这两个方法中,可以不用写事务。其他的增、改、删需要加事务。
7.在findAll()方法中,相应的sql语句比较特殊。为
hql="from User";//没有select
这表示返回的是对象,若加了select name等,则返回的是属性,与本意不符。代码如下:
public List<User> findAll(){ //返回所有结果,是一个集合,所以用List
Session session = HiberUtil.getSession();
//sql为结构化查询语言,hql为面向对象的查询语句
String hql = "from User";
Query query = session.createQuery(hql);//查询对象
List<User> list = query.list();
session.close();//这一步不能丢
return list;
}
这和findById()比较相似,不过前者返回集合,后者返回一个对象则为
public User findById(int id){ //根据id查找,返回一个结果,因此为User型
Session session = HiberUtil.getSession();
User user = (User) session.get(User.class,id);//User.class能获取User对象的所有属性和方法
return user;
}
8.hibernate对象的状态和生命周期,有3个
①transient临时态,指new出来的对象,跟session没有任何关系,也跟数据库没有任何关系,数据库中没有对应记录存在
②persist持久态,指以map形式保存在session缓存中的对象。数据库中有对应的记录(即只要和session挂钩后就会在数据库发生联系)。保存方式为key-value(键值对)形式。如key的格式为
com.bjsxt.po.User#2
就是完整的类名 + # + id
③detached游离态,指除上述两种状态以外的。与session无关,但在数据库有相应记录。
举一个比较形象的例子就是临时态为单身,持久态为结婚,游离态为离婚。结婚的对象就是session,而生活经历就是数据库记录。
9.Mysql数据库中的int型比较特别,默认长度为11,而当你把长度设为1,这时输入22222,也能正常存入数据库。
10.在映射文件User.hbm.xml中,有类似于以下的
<id name="id">
<generator class="native"></generator>
</id>
其中<generator class="native"></generator>表示设置id为主键。