新建一个数据库名: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
);
写入想要的方法,待实现
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);
}
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();
}
}
在实现类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;
}
}
通用类写完后,就可以写一个自己的实现类用来检测是否能成功运行
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 (?, ?, ?, ?, ?, ?)
插入成功
通过通用类,可以完成项目中,大部分相同的CRUD操作,减少代码量。