文档章节

Hibernate

Asktao
 Asktao
发布于 2017/10/03 18:58
字数 2160
阅读 44
收藏 3

Hibernate配置

依赖的包:

  •     dom4j-1.6.1.jar
  •     antlr-2.7.7.jar
  •     hibernate-commons-annotations-4.0.4.Final.jar
  •     hibernate-core-4.3.8.Final.jar
  •     hibernate-jpa-2.1-api-1.0.0.Final.jar
  •     jandex-1.1.0.Final.jar
  •     javassist-3.18.1-GA.jar
  •     jboss-logging-3.1.3.GA.jar
  •     jboss-logging-annotations-1.2.0.Beta1.jar
  •     jboss-transaction-api_1.2_spec-1.0.0.Final.jar
  •     mysql-connector-java-5.1.34.jar

根目录新建一个lib文件夹,并将jar包导入。再选中所有jar包右击,选择build path->add build path,将包导入。

 Hibernate.cfg.xml
    相关的链接信息,资源信息和一些可选信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://192.168.1.108:3306/sett_ship</property>
		<property name="hibernate.connection.username">sa</property>
		<property name="hibernate.connection.password">buaa_1021</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- <property name="hibernatetool.metadatadialect">org.hibernate.cfg.reveng.dialect.SQLServerMetaDataDialect</property> -->
		<property name="show_sql">TRUE</property>
	</session-factory>
</hibernate-configuration>

*.hbm.xml
    把对象,映射成关系。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-9-23 20:30:23 by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
    <class name="edu.buaa.sem.po.SysAuthority" table="sys_authority" catalog="sett_ship">
       <!-- name:映射的对象;                 table:对应的数据库的表;  catalog:数据库名  -->
        <id name="id" type="java.lang.Long">
            <!-- 主键生成策略 -->
            <column name="id" />
            <generator class="identity" />
        </id>
           <!-- 实体类属性  -->
        <property name="name" type="string">
            <column name="name" length="40" />
        </property>
        <property name="description" type="string">
            <column name="description" length="100" />
        </property>
        <property name="enabled" type="string">
            <column name="enabled" length="1" />
        </property>
    </class>
</hibernate-mapping>

将*.hbm.xml 配置到hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.password">buaa_1021</property>
		<property name="hibernate.connection.url">jdbc:mysql://192.168.1.108:3306/sett_ship</property>
		<property name="hibernate.connection.username">sa</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- <property name="hibernatetool.metadatadialect">org.hibernate.cfg.reveng.dialect.SQLServerMetaDataDialect</property> -->
		<property name="show_sql">TRUE</property>

        <mapping resource="test/pojo/SysAuthority.hbm.xml" />

	</session-factory>
</hibernate-configuration>

第一个Hibernate程序

package test.wxh;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import test.pojo.SysAuthority;


public class Test {
	public static void main(String[] args){
		/**
		 * 创建第一个Hibernate程序
		 * 1、新建Configuration对象
		 * 2、通过Configuration创建SessionFactory对象
		 * 3、通过SessionFactory得到Session
		 * 4、通过session对象得到Transaction对象--Transaction事物
		 * 5、保存数据
		 * 6、提交事物
		 * 7、关闭session
		 * 
		 * */
		//1、新建Configuration对象
		Configuration cfg = new Configuration().configure();

		//是读取src下的 Hibernate.properties配置信息的,不推荐使用。
		//Configuration cfg_d = new Configuration();

		//2、通过Configuration创建SessionFactory对象
		//版本这样用---4.3
		ServiceRegistry registry = new StandardServiceRegistryBuilder()
							.applySettings(cfg.getProperties())
							.build();
		SessionFactory sf = cfg.buildSessionFactory(registry);
													//在Hibernate 3.X可以用。
													//SessionFactory sf = cfg.buildSessionFactory();
													//4.0---4.3之前的写法,过期了
													//		ServiceRegistry sr = new ServiceRegistryBuilder()
													//							.applySettings(cfg.getProperties())
													//							.buildServiceRegistry();
		
		//3、通过SessionFactory得到Session
		Session session = sf.openSession();
		
		//4、通过session对象得到Transaction对象--Transaction事物
		Transaction tx = session.beginTransaction();	//开始事务
		SysAuthority sysAutority = new SysAuthority();
		sysAutority.setName("WXH");
		sysAutority.setDescription("WXH_description");
		sysAutority.setEnabled("是");
		//5、保存数据
		session.save(sysAutority);

		//6、提交事物
		tx.commit();
		
		//7、关闭session
		session.close();
		System.out.println("执行结束!");
	}

}

第一个程序的详细介绍:

//1、Configuration 对象是用来管理读取配置文件
//Configuration cfg = new Configuration();
//如果配置文件改名,可以这样读取。
Configuration cfg = new Configuration().Configure("hb.cfg.xml");

//2、SessionFactory对象,是一个session工程,是一个重量级对象。在一个应用中最好也是单例。
//                      是一个线程安全的。属于进程级别的。
ServiceRegistry registry = new StandardServiceRegistryBuilder()
							.applySettings(cfg.getProperties())
							.build();
SessionFactory sf = cfg.buildSessionFactory(registry);

//3、session对象,使用Hibernate进行数据库操作,主要使用session。
//session对象可以理解为对connection对象的一个包装。
//session对象中提供了对数据库的crud,增删改查操作。
//session是一个线程,不安全的对象。生命周期短暂。一般和事物一一对应。
//session有被称为Hibernate中的一级缓存。
//session又是Transaction的一个工厂。
//如何查找呢?
SysAuthority sysA = (SysAuthority)session.get(SysAuthority.class, 1);
System.out.println("name="+sysA.getName);

//4、Transaction对象,是事务管理对象。通过session对象获取Transaction。
//两种写法 
Transaction tx = session.beginTransaction();	//开始事务
//还可以换种写法。
Transaction tran = session.getTransaction();
tran.begin(); 
/********事物完整代码***********/
package test.wxh;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import test.pojo.SysAuthority;

public class TestTransaction {

	public static void main(String[] args){
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction tx = null;

		try {
			cfg = new Configuration().configure();
			ServiceRegistry registry = new StandardServiceRegistryBuilder()
								.applySettings(cfg.getProperties())
								.build();
			sf = cfg.buildSessionFactory(registry);
			session = sf.openSession();
			tx = session.beginTransaction();
			SysAuthority sysAutority = (SysAuthority)session.get(SysAuthority.class, 1);
			System.out.println("name="+sysAutority.getDescription());
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();		//回滚事件
		}finally {
			if(session!=null && session.isOpen()){
				session.close();
			}
		}
		
		
		
	}
}

Hibernate log--Hibernate的日志

 

Hibernate使用

增删改查的四种方法:

1、session的方式

//插入
User user = new User();
user.setName("www");
session.save()

//查询
//get和load的区别是,get立刻去查,如果没有则是null。
//load是立刻去查,如果没有则抛异常。
User user = (User)session.get(User.class,id);
User user = (User)session.load(User.class,id);
System.out.println("name:"+user.getName());

//删除
User user = new User();
user.setId(2);
User.setName("这里设置是无用的");
session.delete(user);  //如果user为null,则会抛出异常。
//但更好的是,先读取再删除。可以判断是否为空,不处罚异常。
User user = (User)session.get(User.class,2);
if(user!=null){
    session.delete(user);
}

//更新 update
User user = new User();
user.setId(2);
session.update(User);        //这样更新会遗漏其他未更新的属性。
//最好是这样做:先读取,再修改。
User user = (User)session.get(User.class,2);
if(user!=null){
    user.setName("老王");
    session.update(user);
}

//创建数据库
public void testCreatDB(){
    Configurate cfg = new Configuration().Configure();
    SchemaExport se = new SchemaExport(cfg);
    //第一个参数:是否生成ddl脚本;第二个参数:是否执行到数据库中
    se.create(true,true);
}

2、HQL查询

查询

package test.wxh;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import test.pojo.SysAuthority;

public class HQLTest {
	public static void main(String[] args){
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction tx = null;

		try {
			cfg = new Configuration().configure();
			ServiceRegistry registry = new StandardServiceRegistryBuilder()
								.applySettings(cfg.getProperties())
								.build();
			sf = cfg.buildSessionFactory(registry);
			session = sf.openSession();
			tx = session.beginTransaction();
			
			String hql = "select name from SysAuthority";
			Query query = session.createQuery(hql);
			//list()方法,返回查询结果。
			List<String> list = query.list();
			
			for(String xxname:list){
				System.out.println("name:"+xxname);
			}
			//SysAuthority sysAutority = (SysAuthority)session.get(SysAuthority.class, 1);
			//System.out.println("name="+sysAutority.getDescription());
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();		//回滚事件
		}finally {
			if(session!=null && session.isOpen()){
				session.close();
			}
		}

	}
}
//查询两个条件时,返回的是数组集合。
List<Object[]> list2 = session.createQuery("select name,description from SysAuthority").list();
for(Object[] item:list2){
	System.out.println("name:"+item[0]);
	System.out.println("description:"+item[1]);
}
//将多个查询封装成对象。---- SysAuthority需要有toString方法。
//需要在SysAuthority中增加无参的构建方法。
//和 带指定参数的 构建方法。比如需要name和description,则构建这两个参数的构建方法。
/**
* public SysAuthority(){
* 		//TODO xxxxxxxxxxxxx
* }
* 
* public SysAuthority(String name,String description){
* 		super();
* 		this.name = name;
* 		this.description = description;
* }
* 
* */
List<SysAuthority> list3 = session
            .createQuery("select new SysAuthority (name,description) from SysAuthority").list();
for(SysAuthority sa:list3){
	System.out.println(sa);
}

PS:别名查询的方法--- 在表名后 + 别称。
    如:select b.name from Book b
    如:select b.name from Book as b

PS:整表查询的方法 --- 直接 from table,或者select t from table as t

使用Hibernate接口,写源生SQL语句

条件查询:

//条件查询:占位符
//setParameter()方法,第一个参数是下标,第二个从参数是数值。
List<SysAuthority> list4 = session.createQuery("from SysAuthority where id>?")
                           .setParameter(0, 1).list();
for(SysAuthority sa:list4){
	System.out.println("list4******************");
	System.out.println(sa.getName());
}
//条件查询:可命名的占位符。   :id   
// .setParameter()方法,第一个参数是下标,第二个从参数是数值。
List<SysAuthority> list5 = session.createQuery("from SysAuthority where id>:id").setParameter("id", 1).list();
for(SysAuthority sa:list5){
	System.out.println("list5******************");
	System.out.println(sa.getName());
}
//分页查询
List<SysAuthority> list6 = session.createQuery("from SysAuthority where id>:id")
		.setFirstResult(0)		//从数据库的第几条数据开始读取  (当前页-1)*每页显示条数
		.setMaxResults(2)		//指定每次读取多少条       每页显示条数
		.list();
for(SysAuthority sa:list6){
	System.out.println("list5******************");
	System.out.println(sa.getName());
}
//聚合函数---统计查询--结果唯一
/这里Long类型可以,  如果换成Integer类型,则会报错。还可以使用Number类型
//  除了count()方法,还有max() 等
Number count = (Number)session.createQuery("select count(b.name) from SysAuthority b").uniqueResult();
System.out.println("总数:"+count.intValue());		//转成指定的值
//分组查询  group by
//按名字分组,并查看每个分组下的数量。
List<Object[]> list7 = session.createQuery("select b.category.name count(b.id) from Book b group by b.category.name").list();
for(Object[] sa:list7){
	System.out.println("list7******************");
	System.out.println(sa[0]+"****"+sa[1]);
}
//排序
List<SysAuthority> list8 = session.createQuery("from SysAuthority sa order by sa.name").list();
for(SysAuthority sa:list8){
	System.out.println("list8******************");
	System.out.println(sa.getName());
}
//对象导航查询仙侠的书籍信息
String hql2 = "from book b where b.category.name=:name";
List<SysAuthority> list9 = session.createQuery(hql)
						.setString("name", "仙侠")
						.list();
for(SysAuthority sa:list9){
	System.out.println("list9******************");
	System.out.println(sa.getName());
}
//命名查询NamedQuery
/**
 * 在*.hbm.xml配置文件中写 query块,命名getByCategoryId,
 * 并且写好查询语句,并留出对应位置
 * 
 *      <query name="getByCategoryId">  
 *			<![CDATA[from SysAuthority where id = :id]]>  
 * 		</query>  
 * */
List<SysAuthority> list10 =session.getNamedQuery("getByCategoryId")
				.setInteger("id", 3)
				.list();
for(SysAuthority b:list10){
	System.out.println(b.getDescription());
}

原生SQL查询

//本地查询 SQL查询
String sql="select Name,description from sys_authority";
List<Object[]> list11 =session.createSQLQuery(sql)
				.list();
for(Object[]  b:list11){
	System.out.println("list11***************");
	System.out.println(b[0]+"-"+b[1]);
}
//如果查询是所有列
String sql2="select * from sys_authority";
List<SysAuthority> list12 =session.createSQLQuery(sql2)
				.addEntity(SysAuthority.class)
				.list();
for(SysAuthority b:list12){
	System.out.println("list12***************");
	System.out.println(b);
	System.out.println(b.getDescription());
}

对象查询  Criteria查询

//查询对象集合
List<SysAuthority> list13 =session.createCriteria(SysAuthority.class)
		.list();
for(SysAuthority b:list13){
	System.out.println(b+"-"+b.getDescription());
}

//条件查询--Restrictions.eq("id", 1)
List<SysAuthority> list14 =session.createCriteria(SysAuthority.class)
		.add(Restrictions.eq("id", 1))
		.list();
for(SysAuthority b:list14){
	System.out.println("list14 ***************");
	System.out.println(b+"-"+b.getDescription());
}
// in 查询
List<Integer> inl = new ArrayList<Integer>();
inl.add(1);
inl.add(2 );
List<SysAuthority> list15 =session.createCriteria(SysAuthority.class)
		.add(Restrictions.in("id", inl))
		.list();
for(SysAuthority b:list15){
	System.out.println("list15 ***************");
	System.out.println(b+"-"+b.getDescription());
}

//like查询
List<SysAuthority> list16 =session.createCriteria(SysAuthority.class)
		//.add(Restrictions.like("name", "中%"))
		//.add(Restrictions.like("name", "的", MatchMode.EXACT))
		//ilike ignoreCase like忽略大小写
		.add(Restrictions.ilike("description", "%登%"))
		.list();
for(SysAuthority b:list16){
	System.out.println("list16 ***************");
	System.out.println(b+"-"+b.getDescription());
}

//or 查询
List<SysAuthority> list17 =session.createCriteria(SysAuthority.class)
		.add(Restrictions.or(
				Restrictions.lt("id", 0), 
				Restrictions.eq("description", "登录")
				))
		.list();
for(SysAuthority b:list17){
	System.out.println("list17 ***************");
	System.out.println(b+"-"+b.getDescription());
}

//排序
List<SysAuthority> list18 =session.createCriteria(SysAuthority.class)
		.addOrder(Order.desc("name"))		// .asc("name")  正序
		.list();
for(SysAuthority b:list18){
	System.out.println("list18 ***************");
	System.out.println(b+"-"+b.getDescription());
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

Asktao
粉丝 27
博文 100
码字总数 116095
作品 0
丰台
程序员
私信 提问

暂无文章

Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
22分钟前
5
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
25分钟前
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
51分钟前
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
7
0
前端技术之:webpack热模块替换(HMR)

第一步:安装HMR中间件: npm install --save-dev webpack-hot-middleware 第二步:webpack配置中引入webpack对象 const webpack = require('webpack’); 第三步:增加devServer配置项: ho......

popgis
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部