Hibernate完成单表数据库操作

2024-08-31 13:18

本文主要是介绍Hibernate完成单表数据库操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、

在数据库中建立一张数据表,这里建立一个张新闻表(news)

CREATE TABLE news (
       id           number(8)         primary key ,
       title        varchar2(50)      not null,
       content      varchar2(500)     not null,
       pub_date     date              not null                                           
);

在MyEclipse中需要建立项目,并加入Hibernate框架支持。

但在这些之前,建议先在MyEclipse里建立与数据库的连接

找到DBBrowser 右键new ,选择建立一个新的数据库连接



2、可以开始建立项目:



选择copy checkedLibrary jars to project folder


点next 

加入Hibernate核心配置文件


3、生成的HibernateSessionFactory中,实现了连接池功能:

public class HibernateSessionFactory {

 

    // 配置文件的所在位置和名称

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

 

    // 用来实现连接池的,该类类似Map集合。

    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

    // Hibernate用来读取配置文件的类

    private static Configuration configuration = new Configuration();

    // 用来建立连接的,该类就是连接池,使用单例设计模式

    private static org.hibernate.SessionFactory sessionFactory;

    // 备用的配置文件位置

    private static String configFile = CONFIG_FILE_LOCATION;

 

    // 静态块,类加载时最先执行

    static {

        try {

            // 加载配置文件到内存中

            configuration.configure(configFile);

            // 建立连接池以及里面的连接

            sessionFactory = configuration.buildSessionFactory();

        } catch (Exception e) {

            System.err.println("%%%% Error Creating SessionFactory %%%%");

            e.printStackTrace();

        }

    }

 

    private HibernateSessionFactory() {

    }

 

    /**

     * 取得数据库连接对象

     *

     * @return Session

     * @throws HibernateException

     */

    public static Session getSession() throws HibernateException {

        // 先从ThreadLocal中取得连接。

        Session session = (Session) threadLocal.get();

 

        // 如果手头没有连接,则取得一个新的连接

        if (session == null || !session.isOpen()) {

            session = sessionFactory.openSession();

            // 把取得出的连接记录到ThreadLocal中,以便下次使用。

            threadLocal.set(session);

        }

 

        return session;

    }

 

    /**

     * 连接关闭的方法

     *

     * @throws HibernateException

     */

    public static void closeSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

        // ThreadLocal清空,表示当前线程已经没有连接。

        threadLocal.set(null);

        // 连接放回到连接池

        if (session != null) {

            session.close();

        }

    }

 

    public static Configuration getConfiguration() {

        return configuration;

    }

 

}


4、根据表自动生成pojo和映射文件:



id generator 选择assigned





生成的pojo对象:

public class News implements java.io.Serializable {

 

    private Integer id;

    private String title;

    private String content;

    private Date pubDate;

 以及getter/setter方法

映射文件:

<?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>

    <!--

        News类和SUNXUN用户下的NEWS表映射.

    -->

    <class name="org.liky.pojo.News" table="NEWS" schema="SUNXUN">

    <!--

        类中的Integer类型的id对应表中的主键

    -->

        <id name="id" type="java.lang.Integer">

        <!--

            表中主键字段为ID

        -->

            <column name="ID" precision="8" scale="0" />

            <!--

              主键生成方式

            -->

            <generator class="assigned" />

        </id>

        <!--

        类中的String类型的title属性与表中的TITLE字段对应,长度是50,不允许为空

        -->

        <property name="title" type="java.lang.String">

            <column name="TITLE" length="50" not-null="true" />

        </property>

        <property name="content" type="java.lang.String">

            <column name="CONTENT" length="500" not-null="true" />

        </property>

        <property name="pubDate" type="java.util.Date">

            <column name="PUB_DATE" length="7" not-null="true" />

        </property>

    </class>

</hibernate-mapping>


接下来写一个公共的DAO接口方法,为了方便使用:

/**

 * 公共接口

 *

 * @param<K>

 *            主键类型

 * @param<V>

 *            Vo对象的类型

 */

public interface IDAO<K, V> {

 

    public void doCreate(V vo) throws Exception;

 

    public void doUpdate(V vo) throws Exception;

 

    public void doRemove(K id) throws Exception;

 

    public List<V> findAll() throws Exception;

 

    public V findById(K id) throws Exception;

 

    /**

     * 分页查询方法

     * @param pageNo 当前页号

     * @param pageSize 每页记录数

     * @param keyword 关键字

     * @param column 查询的字段名

     * @return

     * @throws Exception

     */

    public List<V> findAll(int pageNo, int pageSize, String keyword,

            String column) throws Exception;

 

    /**

     * 查询全部记录数,用来计算总页数

     * @param keyword

     * @param column

     * @return

     * @throws Exception

     */

    public int getAllCount(String keyword, String column) throws Exception;

 

}


建立新闻的接口,继承公共接口,完成操作:

public interface INewsDAO extends IDAO<Integer, News> {

 

}

建立实现类对象:

public class NewsDAOImpl implements INewsDAO {

 

    public void doCreate(News vo) throws Exception {

        HibernateSessionFactory.getSession().save(vo);

    }

 

    public void doRemove(Integer id) throws Exception {

        // 注意,使用Hibernate删除时,必须先查询对象,再删除.

        HibernateSessionFactory.getSession().delete(findById(id));

    }

 

    public void doUpdate(News vo) throws Exception {

        HibernateSessionFactory.getSession().update(vo);

    }

 

    public List<News> findAll() throws Exception {

        // 使用HQL语句完成查询功能

        // 1.HQL查询的是类,而不是表

        // 2.可以不写SELECT关键字

        String hql = "FROM News";

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        return query.list();

    }

 

    public List<News> findAll(int pageNo, int pageSize, String keyword,

            String column) throws Exception {

        String hql = "FROM News AS n WHERE n." + column + " LIKE ?";

 

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

        query.setString(0, "%" + keyword + "%");

 

        // 分页处理

        query.setFirstResult((pageNo - 1) * pageSize);

        query.setMaxResults(pageSize);

 

        return query.list();

    }

 

    public News findById(Integer id) throws Exception {

        // 根据主键完成查询功能,需要传入类型,以及主键值

        return (News) HibernateSessionFactory.getSession().get(News.class, id);

    }

 

    public int getAllCount(String keyword, String column) throws Exception {

        // 这里由于查询的不再是对象,因此必须写SELECT统计数量

        String hql = "SELECT COUNT(n) FROM News AS n WHERE n." + column

                + " LIKE ?";

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

 

        query.setString(0, "%" + keyword + "%");

       

        return (Integer) query.uniqueResult();

    }

 

}


 

5、建立DAO工厂类:

public class DAOFactory {

 

    public static INewsDAO getINewsDAOInstance() {

        return new NewsDAOImpl();

    }

 

}

编写Service层,这里随意定义几个方法:

public interface INewsService {

 

    public void insert(News news) throws Exception;

 

    public void delete(int id) throws Exception;

 

    public News findById(int id) throws Exception;

 

    // 如果要一次性返回多种类型的数据,可以使用Map集合,这样方便区分.

    public Map<String, Object> list(int pageNo, int pageSize, String keyword,

            String column) throws Exception;

 

}

 

建立实现类

public class NewsServiceImpl implements INewsService {

 

    public void delete(int id) throws Exception {

        // 加入事务处理功能

        Transaction tx = HibernateSessionFactory.getSession()

                .beginTransaction();

        try {

            DAOFactory.getINewsDAOInstance().doRemove(id);

            tx.commit();

        } catch (Exception e) {

            e.printStackTrace();

            tx.rollback();

            throw e;

        } finally {

            HibernateSessionFactory.closeSession();

        }

    }

 

    public News findById(int id) throws Exception {

        News news = null;

        try {

            news = DAOFactory.getINewsDAOInstance().findById(id);

        } catch (Exception e) {

            e.printStackTrace();

            throw e;

        } finally {

            HibernateSessionFactory.closeSession();

        }

        return news;

    }

 

    public void insert(News news) throws Exception {

        // 加入事务处理功能

        Transaction tx = HibernateSessionFactory.getSession()

                .beginTransaction();

        try {

            DAOFactory.getINewsDAOInstance().doCreate(news);

            tx.commit();

        } catch (Exception e) {

            e.printStackTrace();

            tx.rollback();

            throw e;

        } finally {

            HibernateSessionFactory.closeSession();

        }

    }

 

    public Map<String, Object> list(int pageNo, int pageSize, String keyword,

            String column) throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();

        try {

            map.put("allNews", DAOFactory.getINewsDAOInstance().findAll(pageNo,

                    pageSize, keyword, column));

            map.put("allCount", DAOFactory.getINewsDAOInstance().getAllCount(

                    keyword, column));

        } catch (Exception e) {

            e.printStackTrace();

            throw e;

        } finally {

            HibernateSessionFactory.closeSession();

        }

        return map;

    }

 

}

建立service工厂类

public class ServiceFactory {

 

    public static INewsService getINewsServiceInstance() {

        return new NewsServiceImpl();

    }

 

}

建立完可以用Juint4测试,新建一个与src文件夹平级的test folder



测试时会发现,查询全部记录数方法出错,因为类型转换问题;

    public int getAllCount(String keyword, String column) throws Exception {

        // 这里由于查询的不再是对象,因此必须写SELECT统计数量

        String hql = "SELECT COUNT(n) FROM News AS n WHERE n." + column

                + " LIKE ?";

        Query query = HibernateSessionFactory.getSession().createQuery(hql);

 

        query.setString(0, "%" + keyword + "%");

 

        // 手工使用拆箱方法,Long转换为基本数据类型的int.

        return ((Long) query.uniqueResult()).intValue();

    }

 

测试代码如下:

public class NewsServiceImplTest {

 

    @Test

    public void testDelete() throws Exception {

        ServiceFactory.getINewsServiceInstance().delete(2);

    }

 

    @Test

    public void testFindById() throws Exception {

        System.out.println(ServiceFactory.getINewsServiceInstance().findById(2)

                .getTitle());

    }

 

    @Test

    public void testInsert() throws Exception {

        News news = new News(3, "测试添加数据032", "测试内容023", new Date());

        ServiceFactory.getINewsServiceInstance().insert(news);

    }

 

    @Test

    public void testList() throws Exception {

        Map<String, Object> map = ServiceFactory.getINewsServiceInstance()

                .list(1, 2, "添加", "title");

        System.out.println(map.get("allCount"));

        System.out.println(map.get("allNews"));

 

    }

 

}


6、如果想使用主键自增长功能,可以使用以下两种方式:

1)  increment:

        <id name="id" type="java.lang.Integer">

        <!--

            表中主键字段为ID

        -->

            <column name="ID" precision="8" scale="0" />

            <!--

              主键生成方式

            -->

            <generator class="increment" />

        </id>

1)  sequence:

      先建立好序列

CREATE SEQUENCE news_seq;

修改配置文件

        <id name="id" type="java.lang.Integer">

            <!--

            表中主键字段为ID

        -->

            <column name="ID" precision="8" scale="0" />

            <!--

              主键生成方式

            -->

            <generator class="sequence">

                <param name="sequence">news_seq</param>

            </generator>

        </id>




这篇关于Hibernate完成单表数据库操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124009

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3