文档章节

hibernate1—配置、查询、主键

CarlDing
 CarlDing
发布于 2016/06/27 14:44
字数 1645
阅读 83
收藏 0

 

使用C3p0的连接主键生成策略,表关系

HQL/QBC/Native-SQL

 

配置文件:

   Hibernate.cfg.xml

   Hibernate.properties - 只能配置常量,不能添加影射文件

   *.hbm.xml - 影射文件  

1:再谈Hibernate的配置

直接使用c3p0的连接

 

步1:添加依赖

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>5.2.0.Final</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.39</version>

</dependency>

如果在配置c3p0的连接,则在hibernate.cfg.xml中只要添加c3p0的信息,就会直接使用c3p0的连接:

添加c3p0的包:

  C3p0.jar  c3p0自己的包

  Hibernate-c3p0.jar - hibernate为c3p0开发支持组件。

 

 

 

如果是maven项目,则直接添加依赖:

   <dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-c3p0</artifactId>

    <version>5.2.0.Final</version>

</dependency>

 

步2:添加hibernate.cfg.xml

<hibernate-configuration>

<session-factory>

<!-- 添加连接数据库的信息 -->

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="connection.username">guest</property>

<property name="connection.password">1234</property>

<property name="connection.url">jdbc:mysql:///hib?characterEncoding=UTF-8</property>

<!-- 只要添加任意一个C3p0的信息,就是使用c3p0的连接 -->

<property name="hibernate.c3p0.max_size">3</property>

</session-factory>

</hibernate-configuration>

 

 

步3:读取上面的配置文件

 

以下是Hibernate5.0之前的版本:

public class HibernateUitls {

private static SessionFactory sessionFactory;

static {

Configuration config = new Configuration();

config.configure();

Properties prop=  config.getProperties();//获取它的所有配置的信息

ServiceRegistry sr =

new StandardServiceRegistryBuilder().applySettings(prop)

.build();

sessionFactory = config.buildSessionFactory(sr);

}

}

 

5.0以后:

 

package cn.hib;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUitls {

private static SessionFactory sessionFactory;

static {

Configuration config = new Configuration();

config.configure();

sessionFactory = config.buildSessionFactory();

}

/**

 * 提供一个工厂方法,返回当前的SessionFactory

 */

public SessionFactory getSessionFactory(){

return sessionFactory;

}

/**

 * 再提供一个方法,用于打开一个新的会话,一个Session就是一个Connection

 */

public Session openSession(){

return sessionFactory.openSession();

}

}

 

测试是否使用的是c3p0的连接:

    public void test1(){

Session s = HibernateUitls.openSession();

s.doWork(new Work() {

@Override

public void execute(Connection connection) throws SQLException {

//只要在work中执行,这个connection就会受到session的事务管理

//auto commit:com.mchange.v2.c3p0.impl.NewProxyConnection@31276e,false

System.err.println("auto commit:"+connection+","+connection.getAutoCommit());

}

});

}

 

步4:影射一个类

创建一个表:

 

开发一个JavaBean

   ....

添加一个配置文件
     Stud.hbm.xml

 

 

创建类,创建影射文件的方式:反向工程

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Generated 2016-6-19 14:39:40 by Hibernate Tools 3.5.0.Final -->

<hibernate-mapping>

    <class name="cn.hib.domain.Stud" table="studs">

        <id name="id" length="32" type="java.lang.String">

            <column name="ID" />

            <generator class="uuid" />

        </id>

        <property name="name" length="32" type="java.lang.String">

            <column name="stud_name" />

        </property>

        <property name="age" type="java.lang.Integer">

            <column name="stud_age" />

        </property>

    </class>

</hibernate-mapping>

 

2:查询

QBC - QueryByCriteria(全限定名称)

Criteria:

1:查询所有

 

 

Session s =

HibernateUitls.openSession();

Criteria c =

s.createCriteria(Stud.class);

Object obj =  c.list();

System.err.println(obj);

s.close();

 

2:根据id条件

根据id查询三种方式:

1:使用Criteria.add(条件 - Restra....idEq(xxxx)) . uniqueResult();

 

@Test

public void testQueryOne() {

Session s = HibernateUitls.openSession();

Criteria c = s.createCriteria(Stud.class)// 以下是添加条件

.add(Restrictions.idEq("4028806a5558a679015558a67aed0000"));

Object obj = c.uniqueResult();

System.err.println(obj);

s.close();

}

 

 

2:session.get(Stud.class,ID); :Stud

@Test

public void testOne() {

Session s = HibernateUitls.openSession();

// 查询的特点的直接命中数据库

Stud stud = s.get(Stud.class, "4028806a5558a679015558a67afc0001");

System.err.println(stud);

s.close();

}

 

 

3:session.load(Stud.class,”id”) : StudProxy 学生的代理对象

@Test

public void testOne() {

Session s = HibernateUitls.openSession();

// 查询的特点的直接命中数据库

Stud stud = s.load(Stud.class, "4028806a5558a679015558a67afc0001");

System.err.println(stud);

s.close();

}

 

 

Load vS get :

  区别:load懒加载(不会命中数据库,不会执行SQL语句,总会一个代理的对象,

只有当用户使用这个对象的非id属性时

),Get非懒加载 - 总是命中数据库。

 

3:更多条件的查询

添加更多的条件:

@Test

public void testQueryMore() {

Session s = HibernateUitls.openSession();

Criteria c = s.createCriteria(Stud.class)// 以下是添加条件

.add(Restrictions.eq("name", "Jack")).add(Restrictions.eq("age", 33))

.add(Restrictions.like("name", "J", MatchMode.ANYWHERE));

Object obj = c.uniqueResult();

System.err.println(obj);

s.close();

}

 

 

@Test

public void testQueryMore() {

Session s = HibernateUitls.openSession();

Criteria c = s.createCriteria(Stud.class)// 以下是添加条件

.add(Restrictions.or(Restrictions.eq("name", "Jack"), Restrictions.eq("name", "Mary")));

Object obj = c.uniqueResult();

System.err.println(obj);

s.close();

}

 

 

 

 

4:查询一部分字段 - 投影查询

 

@Test

public void testProjection() {

Session s = HibernateUitls.openSession();

Object obj =

s.createCriteria(Stud.class)//

 .setProjection(Projections.property("name")).list();

System.err.println(obj);//list<String>

s.close();

}

Hibernate: select this_.stud_name as y0_ from studs this_

[Jack, Alex0, Jerry, Alex2, Alex0, Alex1, Alex2]

 

@Test

public void testProjection() {

Session s = HibernateUitls.openSession();

Object obj = s.createCriteria(Stud.class)//

.setProjection(Projections.projectionList()//

.add(Projections.property("name"),"name")//

.add(Projections.property("age"),"age")//

)//封装成Map

///.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)//

//封装成JavaBean

.setResultTransformer(Transformers.aliasToBean(Stud.class))//

.list();

 

System.err.println(obj);// list<Object[]>

s.close();

}

 

5:排序

@Test

public void testDistinct() {

Session s = HibernateUitls.openSession();

Object obj = s.createCriteria(Stud.class)//

.setProjection(Projections.distinct(Projections.property("name")))

.addOrder(Order.desc("name")).list();

System.err.println(obj);// list<Object[]>

s.close();

6:去重复的查询

 

@Test

public void testDistinct() {

Session s = HibernateUitls.openSession();

Object obj = s.createCriteria(Stud.class)//

.setProjection(Projections.distinct(Projections.property("name"))).list();

System.err.println(obj);// list<Object[]>

s.close();

}

 

 

 

 

 

3:主键生成策略

 

1:assigned : 程序员自己指定

 

@Test

public void testSave(){

Session s =

HibernateUitls.openSession();

s.beginTransaction();

 

Stud stud = new Stud();

stud.setId("S001");//UUID.random().toString().replace("-","");

stud.setName("张三");

stud.setAge(22);

s.save(stud);

s.getTransaction().commit();

s.close();

}

 

 

2:guid原生的uuid 中间带有 - 长度是36位的

 

(见代码)

 

3:increment

先查询数据库中最大的int类型的id的值,再+1,保存到数据表中去。

<class name="cn.hib.domain.Person" table="persons">

<id name="id" type="integer" column="p_id">

<generator class="increment"></generator>

</id>

<property name="name" type="string" length="30"></property>

 

</class>

 

@Test

public void testSave2(){

Session s =

HibernateUitls.openSession();

s.beginTransaction();

 

Person p = new Person();

p.setName("张三");

s.save(p);

s.getTransaction().commit();

s.close();

}

 

Hibernate: select max(p_id) from persons

Hibernate: insert into persons (name, p_id) values (?, ?)

 

 

4:native 由数据库自己生成主键

DROP TABLE persons;

 

CREATE TABLE persons(

   p_id INT PRIMARY KEY AUTO_INCREMENT,

   p_name VARCHAR(30)

 );

 

 

 

5:uuid - 是由Hiberante自己计算的uuid

同一个Session写入记录时,有顺序。

 

 

 

4:影射的方式

1: 类+配置文件 类+类.hbm.xml

(略)

 

2:使用注解的方式只有类

在使用注解时,Hiberante首选使用JPA(SUN)javax-persists.jar的注解:

@Table(name="persons")

@Entity

@GenericGenerator(name = "nnd", strategy = "native")

public class Person {

@Id

@Column(name="p_id")

@GeneratedValue(generator="nnd")

private Integer id;

@Column(name="p_name")

private String name;

 

<!-- 添加类的配置 -->

<mapping class="cn.hib.domain.Person"/>

 

3:只有配置文件,没有类此时将使用map来影射

<class entity-name="Car" table="cars">

<id name="id" column="car_id" type="string" length="32">

<generator class="uuid"></generator>

</id>

<property name="name" length="30" type="string" column="car_name">

 

</property>

</class>

 

@Test

public void testSave3(){

Session s =

HibernateUitls.openSession();

s.beginTransaction();

 

Map<String, Object> map = new HashMap<>();

map.put("name", "一行数据");

s.save("Car", map);

 

s.getTransaction().commit();

s.close();

}

 

 

 

5:HQL - Hibernate Query Language

查询的对象是类,不是表,条件是类的属性名而不是表的字段名。

 

1:查询所有

@Test

public void testHQL(){

Session s =

HibernateUitls.openSession();

Query query =

s.createQuery("from Stud");

Object obj = query.list();

System.err.println(obj);//list<stud>

s.close();

}

 

2:条件查询

占位符号 ?

@Test

public void testHQL() {

Session s = HibernateUitls.openSession();

Query query = s.createQuery("from Stud where name=?").setString(0, "Jack");

Object obj = query.list();

System.err.println(obj);// list<stud>

s.close();

}

命名的条件:

   @Test

public void testHQL() {

Session s = HibernateUitls.openSession();

Query query = s.createQuery("from Stud where name=:nm")//

.setString("nm", "Jack");

Object obj = query.list();

System.err.println(obj);// list<stud>

s.close();

}

 

 

 

3:投影查询

     Session s = HibernateUitls.openSession();

Query query = s.createQuery("select new map(name as nm,age as age) from Stud");

Object obj = query.list();

System.err.println(obj);// list<stud>

s.close();

 

Session s = HibernateUitls.openSession();

Query query = s.createQuery("select new Stud(name,age) from Stud");

Object obj = query.list();

System.err.println(obj);// list<stud>

s.close();

 

4:删除数据

     ???

 

5:修改数据

 

@Test

public void testUpdate() {

Session s = HibernateUitls.openSession();

s.beginTransaction();

 

s.createQuery("update Stud set name='马六' where id=:id")//

.setString("id","S001").executeUpdate();

 

s.getTransaction().commit();

s.close();

}a

 

 

5:Native-Sql

@Test

public void testNativeSQL() {

Session s = HibernateUitls.openSession();

s.beginTransaction();

 

List list = s.createSQLQuery("select stud_id as id,stud_name as name from studs")//

//.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)//

.setResultTransformer(Transformers.aliasToBean(Stud.class))

.list();

System.err.println(list);

s.getTransaction().commit();

s.close();

}

 

 

调用过程:

 

DELIMITER //

CREATE PROCEDURE p1(nm VARCHAR(30),ag INT)

BEGIN

   INSERT INTO studs(stud_id,stud_name,stud_age) VALUES(UUID(),nm,ag);

END

//

DELIMITER ;

 

CALL p1('Jim123',44);

 

@Test

public void testProce() {

Session s = HibernateUitls.openSession();

s.beginTransaction();

s.createStoredProcedureCall("p1").execute();

s.getTransaction().commit();

s.close();

}

 

 

© 著作权归作者所有

CarlDing
粉丝 5
博文 106
码字总数 78103
作品 0
济南
其他
私信 提问
Hibernate(二)——POJO对象的操作

POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作。   一,Hibernate框架中主键的生成策略有三种方式:   1...

凡尘里的一根葱
2015/11/11
27
0
MySQL----索引基础

原文链接:http://blog.csdn.net/liaodehong/article/details/52190223 什么是索引? 1、索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,...

J星星点灯
2018/01/30
0
0
最全面的 MySQL 索引详解

什么是索引? 1、索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2、索引,是数据库中专门用于帮助用户快速查询...

javaer
2016/10/09
37
0
MySQL学习笔记一

MySQL目录结构 配置my.ini MySQL5.7的my.ini位于ProgramDataMySQLMySQL Server 5.7目录下(可能有的版本的my.ini就在安装目录下),该该目录下还有一个data目录存放我们的创建的数据库。 打开...

Aaron_DMC
2016/12/16
42
0
走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

本文出自我的公众号:程序员江湖。 满满干货,关注就送。 Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了!...

你的猫大哥
2017/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Electron React Node

NPM配置手册https://cloud.tencent.com/developer/section/1490263 URL编码参考手册:https://www.w3cschool.cn/htmltags/html-urlencode.html 在配置React环境时,提示 npm ERR! code ECON......

DB_Terrill
18分钟前
4
0
Knative 实战:基于阿里云 Kafka 实现消息推送

在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何在阿里云上基于 Kafka 实现消息推送,本文给大家解锁这一新的姿势。 背景 消息队列 for Apache Kafka 是阿里云提供的分布式、高吞吐...

阿里云官方博客
18分钟前
4
0
自动评论csdn博客文章实现

正文 我们来用java代码爬取csdn博客网站,然后自动评论,这一波操作可以说是相当风骚了,话不多说,咱上代码。 第一步是登录代码,这个网上一大把,代码中用到了jsoup依赖包,用于解析html获...

码农实战
20分钟前
4
0
java速查手册Java Syntax Cheatsheet for Algorithms by TCXX

Numbers static MAX_VALUE xxxValue() public int compareTo(XXX) public boolean equals(Object o) static Integer valueOf(int i) static Integer valueOf(String s) static Integer value......

momo1987
28分钟前
3
0
vue Property or method "***" is not defined on the instance but referenced during render.报错

报错:title不是个方法 解决: 把:去掉不报错了

栾小糖
32分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部