在前一篇博客 IntelliJ使用Maven创建SpringMVC服务 的基础上添加数据库实现, tomcat默认适用JDBC连接数据库服务, 有个澳大利亚小伙觉得写SQL太麻烦,就编写了Hibernate框架,直接用Java操作数据库。 (PS:这跟Android平台用的LitePal、GreenDao、Realm和iOS平台用的CoreData、Realm作用一样, 让开发者不用再写SQL语句便能读写数据库)
实测gif
本demo目录结构的说明:
本demo使用REST风格的url格式,例如:
连接MySQL的列表页链接: http://localhost:8080/userdb/users
操作内存的列表页链接:http://localhost:8080/user1/users
第一, 我们需要安装MySQL并启动服务, Macbook的入口在launchpad---系统偏好设置
第二、虽然hibernate可以生成数据库的表, 但建议使用图形化工具创建database和table, 注意编码格式要选utf-8。 Macbook可以使用Sequel Pro软件连接到本机MySQL服务,并通过图形化界面创建数据库。 PS:hibernate可以连接多个数据库,所以创建了exampledb和exampledb1用于测试。
第三、 配置Hibernate和生成Java类。 选中File---> Project Structure--->Facets后点击+并选中Hibernate
点击图标+生成配置文件, 注意可以有多个! 本demo中有2个, 分别连接数据库exampledb和exampledb1。
第四、 设置hibernate的配置文件。 这里有坑:1、一定要添加属性connection.characterEncoding, 否则读写数据库的中文是乱码!
2、<mapping class....>是自动生成的, 即在IntelliJ-->Persistence-->右键hibernate.xml->Generate Persistence Mapping->By Database Schema生成的。
设置包名并选中数据库的表, 点击OK后会生成对应的Java文件并在hibernate配置文件里添加<mapping class..>。
第五、编写增删改查接口, 注意操作的类就是上面生成的实体类。
public class UserDao {
//查询所有记录
public static List<User1Entity> queryAll() {
Session session = null;
List<User1Entity> list = null;
Transaction transaction = null;
try {
Configuration cfg = new Configuration().configure("hibernate1.cfg.xml"); //有2个配置文件
SessionFactory sf = cfg.buildSessionFactory();
session = sf.openSession();
transaction = session.beginTransaction();
String sql = "from User1Entity order by id asc "; //注意数据库里表名是user1,这里要用映射的类
Query query = session.createQuery(sql);
list = query.list(); //查询所有
transaction.commit();
} catch (HibernateException ex) {
ex.printStackTrace();
if (transaction != null) {
transaction.rollback();
}
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return list;
}
/**
* 根据索引查找记录
* @param id, 索引
* @return
*/
public static User1Entity getItemById(int id) {
User1Entity entity = null;
Session session = null;
List<User1Entity> list = null;
Transaction transaction = null;
try {
Configuration cfg = new Configuration().configure("hibernate1.cfg.xml"); //有2个配置文件
SessionFactory sf = cfg.buildSessionFactory();
session = sf.openSession();
transaction = session.beginTransaction();
entity = (User1Entity) session.get(User1Entity.class, id);
transaction.commit();;
} catch (HibernateException ex) {
ex.printStackTrace();
if (transaction != null) {
transaction.rollback();
}
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return entity;
}
public static boolean addItem(User1Entity user) {
SessionFactory factory;
Session session = null;
Transaction transaction = null;
boolean ret = true;
try {
Configuration cfg = new Configuration().configure("hibernate1.cfg.xml");
factory = cfg.buildSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction(); //开启事务
session.save(user); //保存记录
transaction.commit(); //提交事务
} catch (Exception e){
ret = false;
e.printStackTrace();
//回滚事务
if (transaction != null) {
transaction.rollback();
}
} finally {
if(session != null && session.isOpen()){
session.close();
}
}
return ret;
}
/**
* 删除记录
* @param id, 索引值
* @return 成功或失败
*/
public static boolean delete(int id) {
SessionFactory factory;
Session session = null;
Transaction transaction = null;
boolean ret = true;
try {
Configuration cfg = new Configuration().configure("hibernate1.cfg.xml");
factory = cfg.buildSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction(); //开启事务
Object user = session.get(User1Entity.class, id); //根据索引找到记录
session.delete(user);
transaction.commit();
} catch (HibernateException ex) {
if (transaction != null) {
transaction.rollback();
}
ex.printStackTrace();
ret = false;
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return ret;
}
/**
* 更新记录
* @return 成功或失败
*/
public static boolean update(User1Entity entity) {
SessionFactory factory;
Session session = null;
Transaction transaction = null;
boolean ret = true;
try {
Configuration cfg = new Configuration().configure("hibernate1.cfg.xml");
factory = cfg.buildSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction(); //开启事务
session.update(entity);
transaction.commit();
} catch (HibernateException ex) {
if (transaction != null) {
transaction.rollback();
}
ex.printStackTrace();
ret = false;
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return ret;
}
}
因为有2个hibernate配置文件, 建议初始化时使用文件名区别:Configuration cfg = new Configuration().configure("hibernate1.cfg.xml"); 如果是new Configuration().configure()读取的配置文件是hibernate.cfg.xml。
源代码: http://download.youkuaiyun.com/detail/brycegao321/9923425
参考:
http://blog.youkuaiyun.com/mr_sk/article/details/68947018
http://www.cnblogs.com/tonglin0325/p/5516440.html
http://www.cnblogs.com/baiduligang/p/4247164.html
http://blog.youkuaiyun.com/yerenyuan_pku/article/details/52733275
http://blog.youkuaiyun.com/zdp072/article/details/38691049