hibernate框架如何在项目中运用

    xiaoxiao2021-03-25  150

    hibernate框架如何在项目中运用

    针对一个项目,如果要使用hibernate框架来对数据库进行操作;我们应该按如下步骤开始操作:

    1.建立hibernate框架,首先我们应该导入一些我们项目中所需要的架包,本次示例用到如下架包,也是所有项目基本都会用到的架包:


    简单的给大家介绍一下这些架包的具体作用:

    antlr-2.7.6.jar:语言转换工具,hibernate利用它将HQL语句转变成SQL语句 commons-collections-3.1.jar:用来增强java对集合的处理能力 dom4j-1.6.1.jar: xml文件解析器 javassist-3.9.0.GA.jar: hibernate在运行时用它来扩展java类 jta-1.1.jar:标准的java事务处理接口(跨数据库) slf4j: Hibernate使用的一个日志系统

    2.根据项目的详细设计说明书,在oracle或者mysql数据库中建立连接对象,然后根据账户和密码登录连接对象,在连接对象中创建自己项目所对应的数据库名称(后面事例以test为例),然后在test数据库中创建项目所需要的表:

    eg: CREATE TABLE `person` ( `ID` int(11) NOT NULL, `NAME` varchar(20) NOT NULL, `AGE` int(11) NOT NULL, `ADDRESS` varchar(100) NOT NULL, PRIMARY KEY (`ID`) )

    3.数据库中创建好表以后,然后在项目中创建pojo包,在包中创建表的映射类,如果有很多的表,就创建很多的类,类名和表名一致;然后根据表中的列的名称和属性在映射类中创建属性,形成一一对应的关系:

    public class Person { private int id; private String name; private int age; private String address; 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]"; } }

    4.表的映射类创建好以后,开始配置映射文件,映射文件的扩展名一般为.hbm.xml的形式,文件名的前缀一般和表名保持一致,该文件放在classPath目录下的任意位置。在实际项目开发过程中,我们一般单独建一个存放映射文件的包,以方便管理。映射文件是为了指定对象和关系数据表之间的映射,在运行时,Hibernate将根据这个映射文件来生成各种sql语句。

    <?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"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <!-- 指定类和表的映射,name属性下面写的是实体类的地址全称,table属性下面写的是表名 --> <class name="com.etc.cfg.Person" table="PERSON"> <!-- 指定持久化类的对象标识符和表的主键的映射 --> <id name="id" column="ID" type="integer"> <!-- 指定对象标识符生成器,负责为对象标识符生成唯一的标识符。increment 表示自增 --> <generator class="increment"></generator> </id> <!-- 属性。映射类的属性和表的字段 --> <property name="name" column="NAME" type="string"></property> <property name="age" column="AGE" type="integer"></property> <property name="address" column="ADDRESS" type="string"></property> </class> </hibernate-mapping>

    5.映射文件配置好以后,开始配置hibernate的主配置文件。主配置文件里面配置hibernate的初始化信息,这个文件在classPath的任意目录下;一般命名为: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"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <!-- 属性:配置数据库的驱动类 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> --> <!-- 属性:配置数据库的url地址 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- <property name="hibernate.connection.url">jdbc:oracle:thin@localhost:1521:orcl</property> --> <!-- 属性:配置连接连接对象的时候需要登录的用户名和密码 --> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">111111</property> <!-- 属性:配置数据库的sql方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> --> <!-- 属性:是否在控制台打印输出hibernate为我们自动拼接好的sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 映射:指定程序需要关联的映射文件 --> <mapping resource="com/etc/cfg/Person.hbm.xml"/> </session-factory> </hibernate-configuration>

    6.创建一个单例模式获取SessionFactory的工具类,它的作用是专门给调用者生产Session对象。在实际项目开发中,SessionFactory类放在一个连接池类中,SessionFactory生产出来的Session对象我们一般都是放在一个线程安全的threadLocal线程中,threadLocal一般是希望将某一个状态和线程相关联,hibernate主要也是事务管理,所以放在这里很合适,性能比thread更优秀。但是不管是在单个的Util工具类还是连接池这种对数据库访问量减少的更高级编程中,它的原理都是第一步先要加载配置文件,在实际项目的连接池中我们把文件读取这一块放在一个静态块中,这样就可以在类刚被加载的时候就读取配置文件。

    import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * 单例模式获取SessionFactory的工具类 * @author 莫小忆 */ public class SessionFactoryUtil { private static SessionFactory sessionFactory; private SessionFactoryUtil() { } public static SessionFactory getSessionFactory(){ if(sessionFactory == null){ //初始化配置文件读取对象 Configuration config = new Configuration(); //设定读取的主配置文件路径 config.configure("/hibernate.cfg.xml"); //config.addClass(Person.class); //创建一个session工厂 sessionFactory = config.buildSessionFactory(); } return sessionFactory; } }

    7.创建好SessionFactory的作用就是以后业务需求中谁要对数据库进行增删改查,就自己去向SessionFactory索要Session对象。由Session对象负责对数据库进行增删改查。在实际的项目开发中,我们一般都是按照表名创建类,在类里面专门编写业务需求,来实现所有对这个表进行操作的hql语言,也就是业务逻辑类,这是一个开发项目中80%的工作量。

    /** * 保存用户信息 */ @org.junit.Test public void insertPerson(){ SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory(); //创建session对象 Session session = sessionFactory.openSession(); //开启事务 Transaction ts = session.beginTransaction(); Person ps = new Person(); ps.setName("张三"); ps.setAge(20); ps.setAddress("北京"); //将用户信息保存早数据库 session.save(ps); //提交事务 ts.commit(); //关闭session对象,释放资源 session.close(); } /** * 根据id获取用户 */ @org.junit.Test public void findPersonById(){ SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory(); //创建session对象 Session session = sessionFactory.openSession(); //根据id获取对象 Person person = (Person) session.get(Person.class, 1); System.out.println(person.getName()); //关闭session对象,释放资源 session.close(); } /** * 查询全部用户 */ @org.junit.Test public void findPersons(){ SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory(); //获取session对象 Session session = sessionFactory.openSession(); //获取查询对象 String hql = "from Person"; Query query = session.createQuery(hql); List list = query.list(); //使用查询对象返回集合,集合中封装hql中查询的类的实例化对象 for(int i=0;i<list.size();i++){ Person person = (Person) list.get(i); System.out.println(person.getName()); } //关闭session对象,释放资源 session.close(); } /** * 修改用户信息 */ @org.junit.Test public void updatePersonById(){ SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory(); //获得session对象 Session session = sessionFactory.openSession(); //开启事务 Transaction ts = session.beginTransaction(); //根据id获取对象 Person person = (Person) session.get(Person.class, 1); person.setName("Tom"); person.setAge(25); //修改数据 session.update(person); //提交事务 ts.commit(); //关闭session对象,释放资源 session.close(); } /** * 删除用户信息 */ @org.junit.Test public void deletePerson(){ SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory(); //获取session对象 Session session = sessionFactory.openSession(); //开启事务 Transaction ts = session.beginTransaction(); //根据id获取对象 Person person = new Person(); //设定id,hibernate会根据id删除数据 person.setId(1); session.delete(person); //提交事务 ts.commit(); //关闭session对象,释放资源 session.close(); }

    8.hibernate所做的工作基本就到此为止了。所有用户需要的数据都被session缓存起来了,jsp需要数据的时候,通过session 取得,然后封装到bean对象里面,就可以在整个项目中流传了。

    结论:

    不管学习什么知识,其实最重要的还是要运用到实际开发当中,我们应该对知识深入浅出,当你真正理解了以后,就会发现,其实我们所用的东西,实际开发中只用到很少很少的一部分,没有想象中那么难。大家要有信心。

    转载请注明原文地址: https://ju.6miu.com/read-2105.html

    最新回复(0)