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();
}
组件属性:某个类对象的成员属性是一个自定义类型对象。
存储在数据库中的效果和单一字段一样
- 使用Hibernate Annotation来做对象关系映射
-
添加必须包:hibernate-jpa-2.0-api-1.0.0.Final.jar
-
在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上。
a) @Entity 映射一个实体类 @Table 指定关联的表
b) @Id 映射OID
c) @GeneratedValue 指定OID的生成策略
d) @Version 映射版本号属性
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
知其然不知其所以然,大厂常问面试技术如何复习?
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的大量技术点且讲解的非常深入
[外链图片转存中…(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)]