hibernate基础,Java中级面试含答案

junit有两个jar包:junit和hamcrest-core

Students.hbm.xml 具体如下:

对象关系映射文件Student.hbm.xml

<?xml version="1.0"?>

使用Junit进行测试

要使用到的标签:

@Test:要测试的方法。

@Before:初始化方法(表示在测试前会先执行before方法进行初始化)。

@After:释放资源。

执行次序:@before标签下的方法——>@test方法——>@after释放资源

@Before

public void init() {

// 创建配置对象

Configuration config = new Configuration().configure();

config.addClass(Student.class);

// 创建服务注册对象

ServiceRegistry serviceRegistery = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();

// 创建会话工厂对象

sessionFactory = config.buildSessionFactory(serviceRegistery);

// 创建会话对象

session = sessionFactory.openSession();

// 开启事务

transaction = session.beginTransaction();

}

@Test

public void testSaveStudent() {

Student s = new Student(1,“张三丰”,“男”,new Date(),“武当山”);

session.save(s);

}

@After

public void destory() {

// 提交事务

transaction.commit();

// 关闭会话

session.close();

// 关闭会话工厂

sessionFactory.close();

}

hibernate4.3.x版本中 ServiceRegistryBuilder 已过时–“Deprecated. Use StandardServiceRegistryBuilder instead”,得用StandardServiceRegistryBuilder,也就是它的父类代替。太开玩乐了,儿子废了,老爸顶上!

服务注册对象 这个在博客留言中我已经详细说明,调试不通可以查看hibernate博客留言

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

hibernate配置文件的常用配置

hibernate.show_sql:是否把hibernate运行时的SQL语句输出到控制台,编码阶段便于测试。

hibernate.format_sql:输出到控制台的SQL语句是否进行排版,便于阅读。建议设TRUE。

hbm2ddl.auto:表结构生成策略。可帮助由java代码生成数据库脚本,进而生成具体的表结构。

create(表结构存在,先删除,再重新创建)|update(在原有表结构中插入)|create-drop(先创建再删除)|validate(验证表结构,如现在结构与原结构不同,则不会创建表结构)

hibernate.default_schema:默认的数据库。执行SQL时,默认给所有表名加上数据库前缀

hibernate.dialect:配置hibernate数据库方言,hibernate可针对特殊数据库进行优化。

hbm2ddl.auto:1.create表示每次生成新的数据表,再对数据操作2.update表示在原有旧的数据表上执行操作3.create-drop表示先创建后删除(不常用)4.validate:用现有的表结构和原来的表结构进行验证,如果不同就不创建hibernate.default_schema:给数据库表加上一个表前缀

关于session的说明:

1.不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库;

2.session可以理解为操作数据库的对象;

3.session与connection,是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用;

4.把对象保存到关系型数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。

1.Configuration对象:配置文件对象,读取hibernate配置文件xxx.cfg.xml

2.SessionFactory对象:读取对象/关系映射文件 xxx.hbm.xml

3.session对象:数据库链接对象,获得之后可以操作数据库。可以理解为操作数据库的对象

4.Transaction:使用session操作数据库需要开启的事务

transaction简介:事务

·hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。

所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。

·如果想让hibernate想jdbc那样自动提交事务,必须调用session对象的doWork()方法,活得jdbc的connection后,设置其为自动提交事务模式。(注意:通常并不推荐这样做)

–自动提交事务(注意:通常并不推荐这样做)—

//不开启事务(transaction.commit()//提交事务)的方式

@Test

public void testSaveStudents(){

Stusdents s= new Students(1,“ZSF”,new Date(),“wudang”);

session.doWork(new Work(){

@Override

public void execute(Connection connection) throws SQLException{

connection.setAutoCommit(true);

}

})

session.save(s);//保存对象进入数据库

session.flush();//强制发出SQL语句(通过SQL写入SQL)

}

—自动提交事务(注意:通常并不推荐这样做)—

private Transaction transaction;

transaction = session.beginTransaction();//打开事务

transaction.commit()//提交事务

需要注意的是:在使用save()方法后并不会真正输出sql语句,需要调用flush()强制输出sql语句才可以。然后因为采用了自动提交方式(setAutoCommit(true)),数据才真正保存在数据库。

如何获得session对象 ,调用SessionFactory对象的方法:

(1)openSessionion

(2)getCurrentSession

如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:

如果是本地事务(jdbc事务)

thread

如果是全局事务(jta事务)

jta

openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;

getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一

一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;

前者相当于多例,后者相当于单例。前者创建的session对象要手动关闭,不关闭的话,再次创建session时,就会创建新的session,两个session的hashCode不同;后者创建的session会在事务提交后自动关闭,不需要手动关闭,再次创建的session与已关闭的session是一致的,hashCode相同。

如果你没有设置数据库连接池,那么初始连接池的大小是20,最小是1,也就是说当你启动hibernate的时候,hibernate就初始化了一个connection对象放在你的数据库连接池里面了。如果你第一次调用openSession的时候,hibernate直接就把连接池里面的connection对象给你了,但是如果你没有关闭session,那么这个connection对象就没有被释放,所以当你再次调用openSession的时候,hibernate就会创建一个新的connection对象,如果一直这样,连接池就溢出了

1,事务:事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做2,JDBC事务JDBC事务由Connnection对象控制管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期。3,JTA事务提供了跨数据库连接(或其他JTA资源)的事务管理能力

hbm配置文件常用设置

hbm.xml配置文档

<hibernate-mapping

schema=“schemaName” //模式的名字

catalog=“catalogName” //目录的名称

default-cascade=“cassade_style” //级联风格

default-access=“field/property/CalssName” //访问策略

default-lazy=“true/false” //加载策略

package=“packagename” //默认包名

/>

<class

name=“ClassName” //对应映射的类

table=“tableName” //对应映射数据库的表

batch-size=“N” //抓取策略,一次抓取多少记录

where=“condition” //条件 eg:抓取条件

entity-name=“EntiyName” //如果需要映射多张表

/>

//表的主键

<id

name=“propertyName” //对应的属性

type=“typeName” //对应类型

column=“column_nam” //映射数据库中表当中字段名的名称

length=“length” //指定长度

//主键生成策略

主键生成策略:

由于使用MYSQL,着重讲解一下两个

native:有底层数据库自动生成标识符

assigned:手工赋值

hibernate表单操作的内容

1、单一主键;2、基本类型;3、对象类型;4、组件属性;5、表单操作CRUD实例

单一主键:指表中由某一列来充当主键

assigned 由java应用程序负责生成(手工赋值),主键手动赋值

native 由底层数据库自动生成标识符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。另外,即使手动赋值主键,也不会起作用。主键自动增长,手工赋值不起作用

mysql 中为AUTO_INCREMENT PRIMARY KEY

assigned 当为int时 默认0 其他默认null

hibernate映射类型、java数据类型、sql数据类型的对应关系

2.时间类型

在sql中用DATE表示日期,TIME表示时间,TIMESTAMP表示日期+时间

而在java中用java.util.Date即可代表日期、时间或日期+时间

hibernate映射类型date、time、timestamp分别对应sql的DATE、TIME、TIMESTAMP

hibernate映射类型date、time、timestamp对应java的java.util.Date

因此,type属性的取值使用hibernate映射类型能做到更精确的控制,使用java类型java.util.Date输出为日期+时间

date 表示日期:YYYY-MM-ddtime 表示时间:hh:mm:ss tiemstamp时间戳: yyyy-MM-dd hh:mm:ss

另外,映射的数据类型设置会决定最后数据库中的类型。比如我们在Java程序中使用的是java.util.Date类型定义变量Birthday。但在映射关系的配置文档中对应的type改成date类型,那么最后保存在数据库的Birthday类型就是date,也就是YYYY-MM-dd,而非java.util.Date(或者timestamp)的YYYY-MM-dd hh:mm:ss。

CLOB类型:大文本类型;

BLOB:大的二进制文件类型(如音频、视频、图片等)

MySQL不支持变准SQL的CLOB类型,在MySQL智能光,用TEXT,MEDIUMTEXT以及LONGTEXT类型表示长度唱过255字节的长文本数据。

separatorChar

public static final char separatorChar

与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 ‘/’;在 Microsoft Windows 系统上,它为 ‘\’。

separator

public static final String separator

与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。

pathSeparatorChar

public static final char pathSeparatorChar

与系统有关的路径分隔符。此字段被初始为包含系统属性 path.separator 值的第一个字符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上,此字段为 ‘:’;在 Microsoft Windows 系统上,它为 ‘;’。

pathSeparator

public static final String pathSeparator

与系统有关的路径分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 pathSeparatorChar。

blob例子 对象类型

public void saveImage() throws Exception{

Student s=new Student(1,“李四”,“男”,new Date(),“北京”);

File f=new File(“d:”+File.separator+“boy.jpg”);

InputStream input=new FileInputStream(f);

Blob image=Hibernate.getLobCreator(session).createBlob(input, input.available());

s.setImage(image);

session.save(s);

}

public void readImage() throws Exception{

Student s=(Student) session.get(Student.class, 1);

Blob image=s.getImage();

InputStream input=image.getBinaryStream();

File f=new File(“d:”+File.separator+“girl.jpg”);

OutputStream output=new FileOutputStream(f);

byte[] buff=new byte[input.available()];

input.read(buff);

output.write(buff);

output.close();

input.close();

}

组件属性:某个类对象的成员属性是一个自定义类型对象。

存储在数据库中的效果和单一字段一样

  1. 使用Hibernate Annotation来做对象关系映射
  1. 添加必须包:hibernate-jpa-2.0-api-1.0.0.Final.jar

  2. 在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上。

a) @Entity 映射一个实体类 @Table 指定关联的表

b) @Id 映射OID

c) @GeneratedValue 指定OID的生成策略

d) @Version 映射版本号属性

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

[外链图片转存中…(img-Vah9Mq9Y-1711134804640)]

[外链图片转存中…(img-LnuQCWYk-1711134804641)]

3、文中提到面试题答案整理

[外链图片转存中…(img-U2PzOkWp-1711134804641)]

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

[外链图片转存中…(img-TTs0eb7H-1711134804642)]

[外链图片转存中…(img-yMLtWzG0-1711134804643)]

[外链图片转存中…(img-8NUMYU0G-1711134804643)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值