Hibernate入门学习

发布于:2024-05-04 ⋅ 阅读:(30) ⋅ 点赞:(0)

目录

1、ORM思想概述

2、自定义ORM框架

3、第一个Hibernate程序开发步骤(重要)

1)下载完整包

2)创建项目,导入所需jar包

3)建立student表

4)创建和student表对应的Student实体类

5)创建student表与Student实体类之间的关系映射文件

6)创建hibernate与MYSQL数据库的连接配置文件

7)编写测试代码


1、ORM思想概述

        对象数据到关系数据映射的规则/框架/工具。

            ORM的优点:

                 1. 完全面向对象的编程思想,无SQL出现.

                 2. 减少代码编写,提高工作效率.

                 3. 提高访问数据库的性能,降低访问数据库的频率.

                 4. 具有独立性,发生变化时,不会影响上层的实现.

        Hibernate是什么?

             面向java环境的对象/关系数据库映射框架/工具。

                 1. 开源免费的持久层框架.

                 2. ORM(Object/Relational Mapping)实现之一,建立面向对象的域和关系之间的映射.

                 3. 对JDBC进行封装,负责java对象的持久化(CURD).

                 4. 在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑

        结论:Hibernate是一个对jdbc进行封装的ORM思想的持久层框架。

2、自定义ORM框架

        目标:在DAO层,设计一个通用的Session类,包含一个通用save()保存方法,任意传入一个带有数据的对象就可以保存到指定的表中。

         步骤:

                 1)在数据库设计一张student表,如下:

                

                 2)建立实体对象及对象的映射xml文件

Student实体对象:

public class Student {

   private int id;

   private String name;

   private String gender;

   private int age;

   public int getId() {

      return id;

   }

   public void setId(int id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public String getGender() {

      return gender;

   }

   public void setGender(String gender) {

      this.gender = gender;

   }

   public int getAge() {

      return age;

   }

   public void setAge(int age) {

      this.age = age;

   }

}

Student.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>

<hibernate-mapping>

   <!--

      class: 表示需要保存的实体类

      table: 表示需要保存到表

    -->

   <class name="gz.itcast.entity.Student" table="student">

      <!--

          name: 表示实体类的属性

          column:表示表的字段名称

       -->

      <property name="id" column="id"></property>

      <property name="name" column="name"></property>

      <property name="gender" column="gender"></property>

      <property name="age" column="age"></property>

   </class>

</hibernate-mapping>

                 3)Student的DAO类

public class StudentDao {

  

   public void saveStudent(Student student){

      Session session = new Session();

      session.save(student);

   }

}

                 4)通用的Session类的设计(目的为了保存对象及保存表的数据)

public class Session {

   QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

   //执行sql语句

   String sql = null;

   //参数值

   Object[] values = null;

   //保存方法

   public void save(Object obj){

      //获取sql和参数值

      buildSqlAndParam(obj);

      try {

          qr.update(sql,values);

      } catch (SQLException e) {

          e.printStackTrace();

          throw new RuntimeException(e);

      }

   }

   //insert into student(id,name,gender,age) values(?,?,?,?)

   //构建sql语句

   private void buildSqlAndParam(Object obj){

      try {

          List<Object> params = new ArrayList<Object>();

          InputStream is = Session.class.getResourceAsStream("/gz/itcast/entity/Student.hbm.xml");

          SAXReader reader = new SAXReader();

          Document doc = reader.read(is);

          String sql1 = "insert into ";

          String sql2 = " values(";

         

          Class clazz = obj.getClass();

          String className= clazz.getName();

         

          List<Element> list = doc.getRootElement().elements("class");

          for(Element elem:list){

             if(elem.attributeValue("name").equals(className)){

                //表名

                String tableName = elem.attributeValue("table");

                sql1 += "student(";

                //System.out.println(tableName);

                List<Element> propElems = elem.elements("property");

               

                for(Element propElem:propElems){

                   String columnName = propElem.attributeValue("column");

                   sql1 += columnName+",";

                   sql2 += "?,";

                  

                   //取对象的值

                   String name = propElem.attributeValue("name");

                   Field field = clazz.getDeclaredField(name);

                   field.setAccessible(true);

                   params.add(field.get(obj));

                }

                sql1 = sql1.substring(0,sql1.length()-1);

                sql2 = sql2.substring(0,sql2.length()-1);

                sql1 += ")";

                sql2 += ")";

             }

          }

          System.out.println(sql1+sql2);

          System.out.println(params);

          //赋值

          sql = sql1+sql2;

          values = params.toArray();

      } catch (Exception e) {

          e.printStackTrace();

          throw new RuntimeException(e);

      }

   }

}

        5)测试类

public class TestDao {

   public static void main(String[] args) {

      StudentDao stuDao = new StudentDao();

      Student student = new Student();

      student.setId(1);

      student.setName("张三");

      student.setGender("");

      student.setAge(20);

      stuDao.saveStudent(student);

   }

}

3、第一个Hibernate程序开发步骤(重要)

开发步骤:

1)下载完整包

        到hibernate官网下载完整zip包 。hibernate-release-4.3.8.Final.zip

2)创建项目,导入所需jar包

        建立java项目,导入所需jar包,拷贝%hibernate%/lib/required目录下的所有jar包

3)建立student表

                

4)创建和student表对应的Student实体类

public class Student {

   private int id;

   private String name;

   private String gender;

   private int age;

   public int getId() {

      return id;

   }

   public void setId(int id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public String getGender() {

      return gender;

   }

   public void setGender(String gender) {

      this.gender = gender;

   }

   public int getAge() {

      return age;

   }

   public void setAge(int age) {

      this.age = age;

   }

   @Override

   public String toString() {

      return "Student [id=" + id + ", name=" + name + ", gender=" + gender

             + ", age=" + age + "]";

   }

}

5)创建student表与Student实体类之间的关系映射文件

        技术:XML

       名字:理论上前缀不限,后缀必须是小写字母xml,但提倡使用如下格式:实体类名.hbm.xml

     位置:理论不限,但提倡放在与实体类同一个目录下

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

   <class name="gz.itcast.entity.Student" table="student">

      <!-- 主键配置 -->

      <id name="id" column="id">

          <!-- 主键策略 -->

          <generator class="assigned"></generator>

      </id>

      <property name="name" column="name"></property>

      <property name="gender" column="gender"></property>

      <property name="age" column="age"></property>

   </class>

</hibernate-mapping>

6)创建hibernate与MYSQL数据库的连接配置文件

        技术:XML

       名字:理论上前缀不限,后缀必须是小写字母xml,但提倡使用如下格式:hibernate.cfg.xml

     位置:理论不限,但提倡放在IDE工具的src目录下

<!DOCTYPE hibernate-configuration PUBLIC

   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

   <!-- 数据库连接配置 -->

   <property name="hibernate.connection.driver_class">

      com.mysql.jdbc.Driver

   </property>

   <property name="hibernate.connection.url">

      jdbc:mysql://localhost:3306/day14?useUnicode=true&amp;characterEncoding=utf-8

   </property>

   <property name="hibernate.connection.username">root</property>

   <property name="hibernate.connection.password">root</property>

   <!-- 数据库方言 -->

   <property name="hibernate.dialect">

      org.hibernate.dialect.MySQL5InnoDBDialect

   </property>

   <!-- 对象关系映射的配置 -->

   <mapping resource="gz/itcast/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

       

7)编写测试代码

public class TestHello {

  

   public static void main(String[] args) {

          //创建配置管理器对象

          Configuration configuration = new Configuration().configure();

         

          //创建服务注册器

          StandardServiceRegistry serviceRegistry =

                new StandardServiceRegistryBuilder().

                applySettings(configuration.getProperties()).

                build();

          //创建SessionFactory对象

          SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

          //获得Session对象

          Session session = sessionFactory.openSession();

          //打开事务

          Transaction tx = session.beginTransaction();

         

          Student s = new Student();

          s.setId(4);

          s.setName("陈六");

          s.setGender("");

          s.setAge(20);

          //保存方法

          session.save(s);

          //提交事务

          tx.commit();

          //关闭Session连接

          sessionFactory.close();

   }

}


网站公告

今日签到

点亮在社区的每一天
去签到