hibernate的crud操作

1:hibernate操作的帮助类

public class hibernateUtil {

	public static SessionFactory factory;
	static{
		Configuration cfg = new Configuration();
		cfg.configure();
	    factory = cfg.buildSessionFactory();
	}
}

 2:hibernate的持久化类

//pojo持久化类
//对象的序列化的作用:让对象在网络上传输,以二进制的形式传输
public class Person implements Serializable{
    private String id;
    private String name;
    public Person()
    {
       //提供一个默认的构造函数,Session.get利用反射时候根据这个
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }  
}

3:hibernate的持久化类和mysql表的映射关系

<?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>
<!-- 类与表的映射,类对表名,名词一样可以不写
     name:类的全名
     table:表名,和类名一样可以不写
 -->
<class name="com.hibernate.domain.Person" table="Person">
   <!-- 
     id为标示属性,和数据库的id对应
     name为属性的名词,column为列的名词,一样也可以不写
     generator为主键产生器,手动,自动,要告诉hibernate容器用什么方式产生主键
    -->
   <id name="id" column="id" length="20" >
       <!-- <generator class="increment"></generator> -->
      <!--  <generator class="identity"></generator> -->
      <!--   <generator class="assigned"></generator> -->
          <generator class="uuid"></generator>
   </id>
   
   <!-- 
            描述一般属性,length可以不写,但是默认是最大值
       type属性有2种写法java类型如java.lang.String和hibernate类型string(小写)
             但java类型效率更高,因为hibernate也要转为java类型在和sql进行对应varchar
    -->
    <property name="name" column="name" length="20" type="string"></property>
</class>
</hibernate-mapping>

4:hibernate的配置文件

<?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>
<!-- hibernate的配置文件,数据库连接和mapping -->

  <!-- 
        一个session-factory只能连接一个数据库
    -->
<session-factory>
    <!-- 
        数据库的用户名
    -->
    <property name="connection.username">root</property>
    <!-- 
        密码
    -->
    <property name="connection.password">123</property>
    <!-- 
        url
    -->
    <property name="connection.url">
        jdbc:mysql://localhost:3306/hibernate
    </property>
    <!-- 
        作用:根据持久化类和映射文件生成表
        validate
        create-drop
        create
        update
    -->
    <property name="hbm2ddl.auto">update</property>
    <!-- 
        显示hibernate内部生成的sql语句
    -->
    <property name="show_sql">true</property>
    <mapping resource="com/hibernate/domain/hibernate.hbm.xml" />
  </session-factory>
</hibernate-configuration>

5:完成hibernate的crud操作

package com.hibernate.test;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.hibernate.Util.hibernateUtil;
import com.hibernate.domain.Person;

//数据库的增删改查总结
/*
 * 1:查询不用事务,增删改用事务
 * 2:添加不用查找id,查询删除更新都要根据id找到这个对象进行操作
 * 3:crud操作都通过核心session操作
 */
public class PersonTest extends hibernateUtil {

    /*
     * 判断一个类是不是持久化类 1:加载配置文件 2:在配置文件中加载映射文件 3:解析映射文件的class name是否存在,存在就是持久化类
     */
    // session.save()
    @Test
    public void savePerson() {
        // 通过继承hibernateUtil自动生成sessionFactory
        // 下面的公共代码可以继承hibernateUtil来实现
        /*
         * Configuration cfg = new Configuration(); cfg.configure();
         * //启动和加载hibernate的配置文件hibernate.cfg.xml SessionFactory factory =
         * cfg.buildSessionFactory();
         */

        /*
         * hibernate把配置文件中的数据库连接信息,映射文件和持久化类的信息封装到sessionFactory中
         * sessionFactory单列模式,该类本身是线程安全的 sessionFactory是重量级了类,肯定啊封装了怎么多东西
         */
        Session session = factory.openSession();
        // openSession打开数据库连接--->查询
        // ---->增删改-->要开启事务--cud--提交事务-->关闭连接
        Transaction tran = session.beginTransaction();

        Person p = new Person();
        p.setName("xxxxx");
        session.save(p);
        // save相当于自动拼sql insert into Person(id,name) value(?,?)
        // 客户端的操作必须是持久化对象p
        tran.commit();
        session.close();
    }

    // session.createQuery
    @Test
    public void QueryPerson() {
        // 查询所有
        Session session = factory.openSession();
        // hibernate的查询语句是HQL语句from 类名
        List<Person> persons = session.createQuery("from Person").list();
        for (Person p : persons) {
            System.out.println(p.getName());
        }
        session.close();
    }

    // session.get
    @Test
    public void queryPersonById() {
        Session session = factory.openSession();
        // 利用session.get()产生Person对象,调用的是默认的构造函数,所有一定要用构造函数
        Person p = (Person) session.get(Person.class, 1);
        System.out.println(p.getName());
        session.close();
    }

    //hibernate内部根据标识符,看标识符在数据库中相应的表中,有就删除
    //session.delete()
    @Test
    public void deletePerson() {
        Session session = factory.openSession();
        Transaction tran = session.beginTransaction();
       /*
        * 1:找出要删除的id
        * 2:删除该id对应的记录
        */
        Person person=(Person) session.get(Person.class, 3);
        session.delete(person);
        tran.commit();
        session.close();
    }
    
    @Test
    public void updatePerson() {
        Session session = factory.openSession();
        Transaction tran = session.beginTransaction();
       /*
        * 1:找出要更新的id
        * 2:进行修改
        * 3;进行update操作
        */
        Person person=(Person) session.get(Person.class, 4);
        person.setName("林小小");
        session.update(person);
        tran.commit();
        session.close();
    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。