Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
学习步骤:1.首先到官网下载hibernate框架 2.把所需要的包导入到web项目 3.建立POJO类 4.建立**.hbm.xml映射文件 5.建立hibernate.cfg.xml配置文件 6.建立Test类
1.进入www.hibernate.org下载所需要的hibernate框架,我所使用的是较新的Hibernate 3.5.3-Final release 版本。
2解压下载下来的文件,把以下包引入(hibernate3.jar核心包 required文件夹下的antlr-2.7.6.jar,commons-collections-3.1.jar,dom4j-1.6.1.jar,javassist-3.9.0.GA.jar,jta-1.1.jar以及slf4j-api-1.5.8.jar但是最后一个包,hibernate提供的不完整,我们还需要到http://www.slf4j.org/网站上下个完整的版本,我下的是slf4j-1.6.1.zip 然后解压,把slf4j-api-1.6.1.jar与slf4j-nop-1.6.1.jar两个包导入,前面的slf4j-api-1.5.8.jar可以不要了。
3.建立POJO类,事实上就和FORM类,JAVABEAN一样,首先在数据库里建立一个表,然后用JAVA建立字段对应的属性。首先建立一个表(MYSQL),来进行操作:
- CREATE TABLE `student` (
- `id` int(7) NOT NULL,
- `stu_name` varchar(50) NOT NULL,
- `stu_age` int(3) default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后写POJO类,如下:
- package myclass.entity;
- //POJO类 最好加上一个构造函数
- public class Student {
- private int id;
- private String stu_name;
- private int stu_age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getStu_name() {
- return stu_name;
- }
- public void setStu_name(String stu_name) {
- this.stu_name = stu_name;
- }
- public int getStu_age() {
- return stu_age;
- }
- public void setStu_age(int stu_age) {
- this.stu_age = stu_age;
- }
- public Student() {
- }
- }
4,建立Student.hbm.xml映射文件,如下:
- <?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="myclass.entity.Student" table="student">
- <!-- 配置对角标识符和表的主键 -->
- <!-- column表示与数据库对应的字段 -->
- <id name="id" column="id">
- <!-- 配置主键的生成策略 -->
- <generator class="increment"></generator>
- </id>
- <!--配置其他的属性与字段 -->
- <property name="stu_name" column="stu_name"></property>
- <property name="stu_age" column="stu_age"></property>
- </class>
- </hibernate-mapping>
可以建立多个Class节点,但一个Class节点对应一个表,本Class节点中对应的是student表。id产生的策略是increment。
5.建立hibernate.cfg.xml配置文件,如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.connection.username">root</property>
- <property name="hibernate.connection.password">liping</property>
- <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
- <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
- <!-- 数据库方言 -->
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <property name="show_sql">true</property>
- <mapping resource="myclass/entity/Student.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
基本上就是用来连接数据库的,hibernate是使用sessionfactory来操作数据库的。
6.建立Test类
- package myclass.test;
- import java.util.List;
- import myclass.entity.Student;
- import org.hibernate.Query;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.classic.Session;
- public class Test {
- public Session session=null;
- public Test(){
- Configuration config=new Configuration();
- config.configure();
- SessionFactory sf=config.buildSessionFactory();
- session=sf.openSession();
- }
- /**
- * @测试HIBERNATE对数据库的操作
- */
- public static void main(String[] args) {
- Test test=new Test();
- test.insert();
- //test.update();
- //test.delete();
- //test.queryById();
- //test.queryByHql();
- //test.queryAll();
- //test.updateByHql();
- //test.deleteByHql();
- //test.queryLike();
- }
- public void insert(){
- Student stu=new Student();
- stu.setStu_age(22);
- stu.setStu_name("熊阳锋1");
- session.save(stu);
- Transaction tran=session.beginTransaction();
- tran.commit();
- session.close();
- }
- public void update(){
- Student stu=new Student();
- stu.setId(1);
- stu.setStu_name("fdsfd");
- stu.setStu_age(23);
- session.update(stu);
- session.beginTransaction().commit();
- session.close();
- }
- public void delete(){
- Student stu=new Student();
- stu.setId(7);
- session.delete(stu);
- session.beginTransaction().commit();
- session.close();
- }
- public void queryById(){
- Student stu=(Student)session.get(Student.class, 6);
- if(stu!=null){
- System.out.println(stu.getId());
- System.out.println(stu.getStu_name());
- System.out.println(stu.getStu_age());
- }else{
- System.out.println("查无此人!");
- }
- }
- //按ID查询
- public void queryByHql(){
- Query query=session.createQuery("from Student stu where stu.id=?");
- query.setInteger(0, 1);
- //方法一
- // List<Student> list=query.list();
- // for(Student stu:list){
- // System.out.println(stu.getId());
- // System.out.println(stu.getStu_name());
- // System.out.println(stu.getStu_age());
- // }
- //方法二
- Student stu=(Student)query.uniqueResult();
- System.out.println(stu.getId());
- System.out.println(stu.getStu_name());
- System.out.println(stu.getStu_age());
- session.close();
- }
- //查询全部
- public void queryAll(){
- Query query=session.createQuery("from Student");
- List<Student> list=query.list();
- for(Student stu:list){
- System.out.println(stu.getId());
- System.out.println(stu.getStu_name());
- System.out.println(stu.getStu_age());
- }
- session.close();
- }
- //修改数据
- public void updateByHql(){
- Query query=session.createQuery("update Student stu set stu.stu_age=?,stu.stu_name=? where id=?");
- query.setInteger(0,34);
- query.setString(1,"邓玲");
- query.setInteger(2,2);
- query.executeUpdate();
- session.beginTransaction().commit();
- session.close();
- }
- //删除数据
- public void deleteByHql(){
- Query query=session.createQuery("delete from Student where id=?");
- query.setInteger(0,3);
- query.executeUpdate();
- session.beginTransaction().commit();
- session.close();
- }
- //模糊查询
- public void queryLike(){
- Query query=session.createQuery("from Student stu where stu.stu_name like ?");
- query.setString(0, "%玲%");
- List<Student> list=query.list();
- for(Student stu:list){
- System.out.println(stu.getId());
- System.out.println(stu.getStu_name());
- System.out.println(stu.getStu_age());
- }
- session.close();
- }
- public void insertbyHql(){
- }
- }
整个过程就搭建完了,本例是对mysql数据进行操作的,如果想要移植到oracle数据库里面去的话,也很容易,只要在配置文件朝里把数据库连接改为对oracle的即可,还有把主键生成的策略改为sequence即可,很简便,这是一hibernat的大优势之一。
如果用oracle数据库的话,把配置文件改为如下:
Student.hbm.xml
- <?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="myclass.entity.Student" table="student2">
- <!-- 配置对角标识符和表的主键 -->
- <!-- column表示与数据库对应的字段 -->
- <id name="id" column="id">
- <!-- 配置主键的生成策略 -->
- <generator class="sequence">
- <param name="sequence">SEQ_STU</param>
- </generator>
- </id>
- <!--配置其他的属性与字段 -->
- <property name="stu_name" column="stu_name"></property>
- <property name="stu_age" column="stu_age"></property>
- </class>
- </hibernate-mapping>
hibernate.cfg.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.connection.username">scott</property>
- <property name="hibernate.connection.password">liping</property>
- <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
- <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcle</property>
- <!-- 数据库方言 -->
- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
- <property name="show_sql">true</property>
- <mapping resource="myclass/entity/Student.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
这样就可以了。