java踩雷系列4-Hibernate(4)Hibrnate的简单使用

前面花了点篇幅讲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)标识实现应用程序级别上的锁定机制)
(悲观:认为事物每次操作都有别的事物在操作同一数据,在数据库层上的锁定)

内容挺多的,以后用到之后再陆续会补充到这一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值