java创建通用类--Hibernate

一、MySQL创建表

新建一个数据库名:guestbook 然后创建表 guestbook

CREATE TABLE GUESTBOOK
(
  ID           INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  NAME         VARCHAR(20) NOT NULL,
  PHONE        VARCHAR(20),
  EMAIL        VARCHAR(40),
  TITLE        VARCHAR(80) NOT NULL,
  CONTENT      VARCHAR(2000),
  CREATED_TIME DATE NOT NULL
);

二、检查连接数据库

检查配置文件确保可以连上数据库
java创建通用类--Hibernate_第1张图片

三、创建一个接口AaaDao

写入想要的方法,待实现

package com.ex.dao;

import java.util.List;

//    代表2个不同的类型,由不同接口来决定
//     T 对象的类型
//     PK  主键对象的类型
public interface AaaDao {

    public T findById(PK id);

    public List findAll();

    public T save(T t);

    public void update(T t);

    public void delete(PK id);
}

三、实现AaaDao

package com.ex.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.ex.dao.AaaDao;
import com.ex.util.HibernateSessionFactoryUtil;

public class AaaImpl.io.Serializable> implements AaaDao {

    // 相当于保存了对象的class
    private Class clazz;

    AaaImpl() {

        // 构造函数时保存
        clazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public T findById(PK id) {
        //从HibernateSessionFactoryUtil工具类中得到数据库的连接
        Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
        //开启一个事务
        Transaction tx = session.beginTransaction();
        T t = (T) session.load(clazz, id);

        tx.commit();

        return t;
    }

    public List findAll() {

        Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();

        Transaction tx = session.beginTransaction();

        // clazz.getName() 获取到类名
        Query query = session.createQuery("from " + clazz.getName());

        List list = query.list();

        tx.commit();

        return list;
    }

    public T save(T t) {

        Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        session.save(t);

        tx.commit();

        return t;
    }

    public void update(T t) {

        Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        session.update(t);

        tx.commit();

    }

    public void delete(PK id) {
        Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();

        T t = findById(id);

        session.delete(id);

        tx.commit();
    }
}

三、工具类HibernateSessionFactoryUtil

在实现类AaaImpl中可以发现

Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();

其实这个HibernateSessionFactoryUtil连接数据库的工具类也是自主编写(单例模式)

package com.ex.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactoryUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            //读取配置文件
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    private HibernateSessionFactoryUtil() {
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

四、测试通用类GuestbookAaaDaoImpl

通用类写完后,就可以写一个自己的实现类用来检测是否能成功运行

package com.ex.dao.impl;

import com.ex.model.Guestbook;
//可以直接实现我们已经写好的通用类,只需要传入class类,和主键类型
public class GuestbookAaaDaoImpl extends AaaImpl<Guestbook, Integer>{

}

五、测试类

右击GuestbookAaaDaoImpl 新建一个test类,此次我们来测试一个插入数据

package com.ex.demo.dao;

import java.util.Date;

import org.junit.Test;

import com.ex.dao.impl.GuestbookAaaDaoImpl;
import com.ex.model.Guestbook;

public class GuestbookAaaDaoTest {

    @Test
    public void testSave() {

        GuestbookAaaDaoImpl dao = new GuestbookAaaDaoImpl();

        Guestbook gb = new Guestbook();
        gb.setName("刘备xxxxxx");
        gb.setEmail("[email protected]");
        gb.setPhone("01082502282");
        gb.setCreatedTime(new Date());
        gb.setTitle("我喜欢这个网站");

        dao.save(gb);
    }
}

执行测试类,控制台打印sql语句信息

Hibernate: insert into guestbook.guestbook (NAME, PHONE, EMAIL, TITLE, CONTENT, CREATED_TIME) values (?, ?, ?, ?, ?, ?)

回到Mysql查询表guestbook
java创建通用类--Hibernate_第2张图片

插入成功

六、总结

通过通用类,可以完成项目中,大部分相同的CRUD操作,减少代码量。

你可能感兴趣的:(java-util)