Hibernate是由徐培成老师授课的,传智播客的老师正是我要寻找的那种老师。有丰富的工作经验和项目架构经验。而且他们的教学经验也很丰富!老徐讲课十分精细,他编写的熟练程度也很让人吃惊!
Hibernate,以前老方在讲解JAVAWEB的时候有给我们编写过hibernate的简易实现原理——一对多关系的ORM。当时感觉hibernate并不难,今天学习其实它本来就不难。Hibernate的最困难的地方就是它的那个配置文件。因为hibernate正靠那个配置文件来进行ORM的,也是靠这个配置文件来进行其他的操作,比如创建表格,限制对表或字段的操作…。
为什么要使用hibernate?老徐今天举了一个十分好的例子:如果你的表中有100个字段,使用JDBC去插入记录、更新记录…这是非常恐怖的。如果插入或更新记录出错了呢?一个一个字段的对?想都不感想,如果以后数据库字段要全部添加后缀名呢!~~哇哇哇,受不了了。Ok,hibernate可以很好的解决JDBC的“漏洞”。
这个配置文件我把它看成是hibernate的核心!
下面我来举个简单的例子,使用hibernate对一个DOMAIN对象进行自动存取。
1.定义一个Customer的domain,从学习数据库至今使用顾客与订单做的讲解比较多,因为这种逻辑关系可以很好的阐明多表的关系,我们目前只使用一个表:
public class Customer { private int id; private String name; private int gender; private Date birthday; private String email; private String phone; private String address; //下面是getter和setter方法 … } |
2.在Customer的类路径下添加hibernate的映射文件(元数据文件),映射文件名为Customer.hbm.xml,这样在调用“ConfigurationObj. .addClass(Customer.class);”hibernate框架可以自动加载它。
<?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> <!-- 1.name 指定类名 2.table 指定表名,如果忽略则默认为类名 --> <class name="cn.itcast.cc.hibernate.persistence.Customer" table="customers" lazy="false"> <!-- 1.name OID的标识名 2.column 对应表的主键 3.type hibernate中的类型,对应JAVA类型为java.lang.Integer/int,对应SQL类型为INTEGER --> <id name="id" column="id" type="integer"> <!-- 1.class 设置id字段为自增、主键 --> <generator class="increment"></generator> </id> <!-- 1.name 对应类的属性 2.column 对应表的字段,如果不指定access。此处的name只为hibernate获取读取字段的方法。 比如name="abcde",hibernate拼出getAbcde和setAbcde,而此时我们可以添加这两个方法,用于实现特殊功能。 3.type hibernate中的类型 4.access hibernate直接访问字段,而不通过getter和setter。 --> <property name="name" column="name" type="string" access="field"/> <property name="gender" column="gender" type="integer" /> <property name="birthday" column="birthday" type="date" /> <property name="phone" column="phone" type="string" /> <property name="email" column="email" type="string" /> <property name="address" column="address" type="string" /> </class> </hibernate-mapping> |
3.hibernate的属性文件,使用时请将里面的中文行全部删除:
hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url=jdbc:mysql://localhost:3306/test hibernate.connection.username=root hibernate.connection.password=root #hibernate使用的本地化特性,比如MySQL和Oracle的分页技术不同。 #hibernate会根据这项设置,自动完成分页技术。 hibernate.dialect=org.hibernate.dialect.MySQL5Dialect #回显SQL语句,hibernate根据元数据文件自动生成SQL语句并执行。 hibernate.show_sql=true #严重注意,如果指定为可以自动创建表,那么每次运行hibernate都会删除并重新创建表。 hibernate.hbm2ddl.auto=create |
4.我们需要向工程中导入hibernate目录下的jar文件。
1).hibernate3.jar.
2).lib/required/*.jar
3).3rd/*.jar
5.编写测试类:
import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import cn.itcast.cc.hibernate.persistence.Customer;
public class Main { private static SessionFactory sefac = null; // 当类被加载时,获取SessionFactory。 static { //创建Configuration时,默认加载hibernate.properties文件。 //也可以调用addResource方法,将配置文件加载进来。 Configuration config = new Configuration(); // 将ORM中的O在此添加到 config.addClass(Customer.class); sefac = config.buildSessionFactory(); }
public static void main(String[] args) { // 创建一个customer对象 Customer customer = new Customer(); customer.setName("changcheng"); customer.setGender(1); customer.setBirthday(new Date()); customer.setPhone("13998689955"); customer.setEmail("changcheng@google.com"); customer.setAddress("China"); // 调用保存 save(customer); // 调用查询 find(1); }
private static void save(Customer customer){ //获取session相当于获取了一个连接 Session session = sefac.openSession(); //此处必须使用事务,否则不能保存数据。 Transaction tr = session.beginTransaction(); //直接保存 session.save(customer); //提交事务 tr.commit(); //关闭会话 session.close(); }
private static void find(Integer id){ //获取session相当于获取了一个连接 Session session = sefac.openSession(); Transaction tra = session.beginTransaction(); //直接保存 Customer customer = (Customer) session.load(Customer.class, id); tra.commit(); //关闭会话 |