前面花了点篇幅讲hibernate的配置文件
然后后来打包遇到了一个问题:
不把这些配置文件打包进jar,运行的时候虽然可以运行,但是换到别的路径就找不到相应的资源文件了
另外我想把这个配置文件做成公开的,即可通过修改配置文件连接不同地址的不同数据库,然后刚开始的思路是想在怎么打包,后来发现还不如通过代码进行这些相关的配置
通过代码动态配置连接信息:
private HibernateUtil(String cfgName, String url, String DBname, String DBpwd) {
try {
Configuration cfg = new Configuration().configure(cfgName);
String user = ConfigsManager.getString("DBuser");
cfg.setProperty(Environment.URL, "jdbc:sqlserver://" + url + ";databaseName=" + DBname);
cfg.setProperty(Environment.USER, user);
cfg.setProperty(Environment.PASS, DBpwd);
LogManager.writeLine(HibernateUtil.class,
"Connecting to " + url + ",user:" + user + ",databaseName:" + DBname);
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
// TODO: handle exception
LogManager.writeLine(HibernateUtil.class, e.toString());
}
}
通过.setProperty方法,可以将一些配置值暴露给使用者
sessionFactory的创建在hibernate5.0后代码只需要2行,比以前的要简单很多
Configuration cfg = new Configuration().configure(cfgName);
sessionFactory = cfg.buildSessionFactory();
直接贴一个封装了部分常用功能的类
里面包括存储过程,执行原生sql语句及hql的更新,查询等。
package com.Global;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.jdbc.Work;
public class HibernateUtil {
private SessionFactory sessionFactory = null;
public static HibernateUtil Init(String cfgName, String url, String DBname, String DBpwd) {
return new HibernateUtil(cfgName, url, DBname, DBpwd);
}
private HibernateUtil(String cfgName, String url, String DBname, String DBpwd) {
try {
Configuration cfg = new Configuration().configure(cfgName);
String user = ConfigsManager.getString("DBuser");
cfg.setProperty(Environment.URL, "jdbc:sqlserver://" + url + ";databaseName=" + DBname);
cfg.setProperty(Environment.USER, user);
cfg.setProperty(Environment.PASS, DBpwd);
LogManager.writeLine(HibernateUtil.class,
"Connecting to " + url + ",user:" + user + ",databaseName:" + DBname);
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
// TODO: handle exception
LogManager.writeLine(HibernateUtil.class, e.toString());
}
}
public Session getSession() {
return sessionFactory.getCurrentSession();
}
/*
* 执行无返回存储过程
*/
public void executeVoidProcedureSql(final String queryString, final Object[] params) throws Exception {
try {
Session ProceDureSession = sessionFactory.openSession();
ProceDureSession.doWork(new Work() {
public void execute(Connection conn) throws SQLException {
CallableStatement call = conn.prepareCall("{" + queryString + "}");
if (null != params) {
for (int i = 0; i < params.length; i++) {
call.setObject(i + 1, params[i]);
}
}
call.execute();
ProceDureSession.close();
}
});
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
}
}
@SuppressWarnings("rawtypes")
public List getList(String hql) {
Session session = getSession();
session.beginTransaction();
Query query = session.createQuery(hql);
var List = query.list();
session.getTransaction().commit();
return List;
}
public void ExcuteUpdate(String sql) {
Session session = getSession();
session.beginTransaction();
SQLQuery query = session.createSQLQuery(sql);
query.executeUpdate();
session.getTransaction().commit();
}
public <T> void Update(T obj) {
if (obj == null)
return;
Session session = getSession();
session.beginTransaction();
session.update(obj);
session.getTransaction().commit();
}
public void Update(final String hql, final Object[] params) {
Session session = getSession();
session.beginTransaction();
var query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
query.setParameter(i + "", params[i]);
query.executeUpdate();
session.getTransaction().commit();
}
}
补充:
写的挺好的介绍hql的一篇博客:
https://www.cnblogs.com/quchengfeng/p/4111749.html
(偷懒不想整理了,挺多内容的)
其他需要注意的地方:
一对多,多对多
分页查询
乐观锁,悲观锁
(乐观:认为事物每次操作基本上没有别的事物也在操作同一数据,基于数据版本(Version)标识实现应用程序级别上的锁定机制)
(悲观:认为事物每次操作都有别的事物在操作同一数据,在数据库层上的锁定)
内容挺多的,以后用到之后再陆续会补充到这一篇