8.28笔记

1.在项目中引入jar包,并且添加引用

2.创建hibernate.cfg.xml配置文件

需要配置的内容

1.1Driver_class:驱动

Url:配置

Username:用户名

Password:密码

1.2.方言的配置

1.3在后台生成SQL打印到console台

1.4关联小配置

3.配置小配置

在entity包中创建一个和实体类同名的xml文件。Student.hbm.xml

4.我想save a record to db,what’s step we should do?

解析:1.引入jar包

2.书写大配置文件

大配置文件必须放置在项目根目录(专业classpath下):界定:就是src

<?xml version=‘1.0‘ encoding=‘utf-8‘?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- Database connection settings 数据库连接设置-->

<!-- 驱动类 -->

<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>

<!-- url地址 -->

<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

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

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

<!-- SQL dialect  (SQL 方言) -->

<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>

<!-- Echo all executed SQL to stdout 在控制台打印后台的SQL语句 -->

<property name="show_sql">true</property>

<!-- 格式化显示SQL -->

<property name="format_sql">true</property>

<!-- Drop and re-create the database schema on startup -->

<property name="hbm2ddl.auto">update</property>

<!-- 关联小配置 -->

<mapping resource="cn/happy/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

3.创建小配置

<?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">

<hibernate-mapping package="cn.happy.entity">

<class name="Student" table="STUDENT">

<id name="sid" column="SID">

<!-- 主键生成策略:native:

native:如果后台是Oracle

后台是MySQL,自动应用自增

assigned:程序员给主键赋值

uuid:32位的16进制数

sequence

native

-->

<generator class="sequence">

<param name="sequence">SEQ_NUM</param>

</generator>

</id>

<property name="name" type="string" column="NAME"/>

<property name="age"/>

</class>

</hibernate-mapping>

4.测试类

Configuration cfg=new Configuration().configure(“默认读取src下的名称为hibernate.cfg.xml”);

SessionFactory sessionFactory=cfg.buildSessionFactory();

Session session=sessionFactory.openSession();

//执行 insert update delete 操作,HIbernate中必须开启事务

Transaction tx=session.beginTransaction();

Session.save(xxx);

Tx.commit();

Session.close();

作业:

1.今天的HIbernate入门案例写成blogs文章

2.自己完成通过HIbernate做到 修改,删除,查询例子

3.让你的机器上有idea环境

2016年8月6日13:38:54

1.hibernate中两种配置文件,

Hibernate.properties

Hibernate.cfg.xml

读取的是Hibernate.properties

2.sessionFactory重量级的,一个程序中只能有一个,并且是线程安全的。Session每个线程一份,线程非安全!

3.HIbernate中的是session,不是http协议中的session。当然他也不是connection,初学者可以看成是connection

4.PO=POJO+xml配置

5.HIbernate框架位于应用程序和数据库之间,将数据库底层操作完全封装。应用po对象进行HIbernate操作,完成对数据库的操作。

6.Java对象的三种状态

1.瞬时状态

Student stu=new Student(); //session和数据库中都没有

2.持久态   (OID)

Session.save(stu);//session和数据库中都有

3.游离态 (OID)

Session.close();//session中没有,数据库中有

7.ORM原理

思维:一个标准可以统领N个实现

POJO和PO

Configuration:SchemaExport:生成后台的SQL脚本

SessionFactory:一个应用程序中,只能有一个.

Session:多线程并发情况,解决线程安全的方案

方案一:通过synchronized关键字

方案二:ThreadLocal get()  set()

Java对象的三种状态

8.作业:序列化和持久化

Load和get()

saveOrUpdate()和merge()

Session线程非安全

关于代理对象

2016年8月8日13:38:50

1.load()和get()区别

解析:

1.1我们在程序中提供的OID,对应的底层数据库没有编号,load()报错,get()得到null

Load()报错的情况

1.2 延迟加载

Load()延迟加载 ,原因:产生的是代理对象

Get()非延迟加载, 原因:对象本身

共同特点:session.get(Student.class,1)

Session.load(Student.class,1)

策略:先检索session级别的缓存,如果没有,接着检索二级缓存,然后二级缓存也没有,检索数据库

2.session存储机制,一级缓存(Session)和二级缓存(SessionFactory)区别

3.脏检查

什么时机,HIbernate会进行脏检查。

清理缓存

清空缓存

4.如何在HIbernate继承log4j日志框架

5.数据库的四种隔离级别,隔离级别出现目的,解决什么问题

脏读,不可重复读,和幻象读

Oracle数据库默认事务隔离级别:Read-Commited

丢失更新(乐观锁和悲观锁)

6.小细节

2016年8月9日14:16:45

Save()

Update()

SaveOrUpdate()

Merge()

Delete()

检索单个对象

Load()

Get()

批量查询所有记录

HQL:HIbernate Query Language  HIbernate查询语言

From +类名

场景1:从数据表中拎出所有的姓名,打印到控制台

-----------------------------------------------------

2016年8月11日13:44:52

1.HQL概念

2.HQL查询所有列

From Student

List<Student> list=session.createQuery(“from Student”).list();

3.检索部分列

List<Object[]> list= session.createQuery(“select age,name from Student”).list();

4.检索单列

List<String> list= session.createQuery(“select name from Student”).list();

5.参数书写和赋值方式

两种,第一种:?

query.setParameter(“0”,”张三”);

第二种:名称  :属性名

query.setParameter(“属性名”,”属性值”)

6.动态查询

核心代码:

job

salary

StringBuilder sb=new StringBuilder (“select stu from Student stu where 1=1 ”);

If(stu.getJob()!=null){

Sb.apppend(“ and job=:job ”);

}

....

...

..

Query query=session.creatQuery(sb.toString());

Query.setProperties(stu);

StringBuffer和StringBuilder区别?

解析:  StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

1.分页

我要学生表中的4---6条数据

1.关联关系中的单向多对一

Eg> 员工(多的一方)和部门(一的一方)

步骤:1.构建两个实体类,在entity层

Dept.class

package cn.happy.entity;

/**

* 1.1   部门表

* @author happy

*

*/

public class Dept {

private Integer deptNo;

private String  deptName;

public Integer getDeptNo() {

return deptNo;

}

public void setDeptNo(Integer deptNo) {

this.deptNo = deptNo;

}

public String getDeptName() {

return deptName;

}

public void setDeptName(String deptName) {

this.deptName = deptName;

}

}

package cn.happy.entity;

/**

* 1.2 员工类

* @author happy

*

*/

public class Emp {

private Integer empId;

private String empName;

//记住  部门信息

private Dept dept;

public Integer getEmpId() {

return empId;

}

public void setEmpId(Integer empId) {

this.empId = empId;

}

public String getEmpName() {

return empName;

}

public void setEmpName(String empName) {

this.empName = empName;

}

public Dept getDept() {

return dept;

}

public void setDept(Dept dept) {

this.dept = dept;

}

}

2.创建两个hbm小配置文件

Emp.hbm.xml

<many-to-one name=”dept” class=”Dept”  column=”deptNo”></many-to-one>

3.构建大配置

引入小配置

4.测试类

3.一对多

Dept.hbm.xml

<set name=”emps”>

<key column=”deptNo”></key>

<one-to-many class=”Emp”></one-to-many>

</set>

4.cascade:级联

级联添加:当我添加部门的时候,自动添加员工

5.inverse:反转

周五作业:

1.7个人,周一提问HQL语句和关联映射

2.形成blogs,多对一单向关联

一对多双向关联

晚上完成的

3.按照我的文档或者视频。。两种多对多配置,并且形成blogs。

云题库相关知识点! 周一上午考试!

4.预习第七章视频,缓存。二级缓存视频。

---------------九章   注解,Cretiater查询-----

MyBatis框架

-------------------------------------------------------------------

8月29日 HIbernate内测+Struts2 第一章

2016年8月13日13:39:54

1.关联映射

多对一单向关联

在Emp类植入Dept属性

Emp.hbm.xml

<many-to-one name=”dept” class=”Dept” column=”detpNo”></many-to-one>

一对多双向关联

部门中建立员工集合

在Emp类植入Dept属性

Dept.hbm.xml

<set name=”emps”>

<key column=”deptNo”></key>

<one-to-many class=”Emp”/>

</set>

1.多对多单向

2.多对多的双向

Project

Emp

方案二:有第三张表关系表介入的

 Project

Emp

ProEmp

3个小配置

3.延迟加载

立即加载:

2016年8月15日13:41:54

1.session.openSession()  随机从Session工厂中拎出一个Session

程序员手动的关闭Session

Session.getCurrentSession():获取一个和线程绑定的session。如果发现线程变量中没有  session,也是使用openSession.当事务有出口(commit ,rollback)的时候,自动将session关闭.

你要想在程序中使用getCurrentSession,得再大配置中加一个

<!--  <property name="current_session_context_class">thread</property> -->

2.no  session问题

问题引发:因为dao使用load(),默认延迟加载的,当在biz关闭session之后,UI层无法获取对象的非ID属性值。

解决方案:1.变成get,即时加载

2.用Hibernate.isInitialized(obj)被初始化。

3.类级别的lazy=”false”

4.实体类用final修饰,由于大家都知道。延迟加载的原因是内存中有代理对象(其实是Emp类的子类)。咱们可以让一个类没有子类。

5.在biz层先用一道需要UI使用到的属性。然后在biz关闭。

6.b/s,Hibernate提供了一个解决方案:OpenSessionInView。

2.1 类级别的查询策略

Lazy:true (默认值)

False

3.多对一关联的查询策略

Lazy:proxy (默认值)

No-proxy

false

4.一对多,或者多对多

Fetch:影响Hibernate针对底层SQL的生成。

当fetch和lazy连用的时候,有两种情况必须知道

情况一:当fetch取值为Join的时候,lazy属性会被忽略。Set集合中的lazy,或者多对一中配置的lazy。

情况二:当咱们使用query接口的list()方法,他会忽略配置中的左外连接查询,这个时候lazy属性重新发挥作用。

5.三种场景下,lazy各自取值和默认值。

4.openSessionInView模式

UI开启session

每当有一个请求过去,先走过滤器。开事务,开session

2016年8月16日13:40:46

缓存:就是一块空间,用来保存经常访问的数据

分类:一级和二级缓存(查询缓存基于二级缓存)

一级和session相关,和一次事务相关!

1.二级缓存的插件配置

EHCache插件

1.引入3个jar包

2.在大配置中

3.在src下添加ehcache.xml文件,从etc获取文件即可。

2.get和load方法数据可以进入,一级缓存和二级缓存,并且可以从一级缓存和二级缓存取数据。但是如果使用list(),这个时候只能将数据放入二级缓存,不能取,如果想取出数据,可以使用iterator方法()

3.关于query接口的list()和iterator()区别

4点!

4.集合缓存

5.N+1问题

描述:形成1条SQL+N条SQL

Iterator()

一对多,

弊病:

对数据库访问还是必须考虑性能问题的, 在设定了1 对多这种关系之后, 查询就会出现传说中的n +1 问题。 
1 )1 对多,在1 方,查找得到了n 个对象, 那么又需要将n 个对象关联的集合取出,于是本来的一条sql查询变成了n +1 条 
2)多对1 ,在多方,查询得到了m个对象,那么也会将m个对象对应的1 方的对象取出, 也变成了m+1

怎么解决n +1 问题?

1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。

2)二级缓存, 在对象更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n +1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。 
不同解决方法,不同的思路,第二条却刚好又利用了n +1 。

3) 当然你也可以设定fetch=join

-----2016年8月18日09:13:24

1.list()方法

只能向缓存中放入数据,不能取(查询缓存除外)

List()和iterator()区别

1.返回类型

2.查询策略不同:iterator()取出所有id,根据id检索,形成N+1问题。List一条SQL。

3.延迟加载角度,iterator()代理对象,list()对象本身

优化策略,批量删除

一对一

Fk: Foreign key  (外键配置)

Resume1

Resid

rescardNo

rescardName

ResumeUserId

Users1   (主的一方)

Uid

Uname

Upass

Pk方式配置一对一

Users2.hbm.xml

Users1

Uid (pk,fk)

Uname

Upass

表中形成外键约束

Resume1(主的一方)

Resid  pk

rescardNo

rescardName

<id>

<generator name=”foreign”>

<param name=””>resume2

<>

</id>

<one-to-one constrained=”true”></>

组件映射

3.HQL连接查询

query.createQuery(hql代码)

query.doWork()

query.list()

Query.iterator()

query.createSQLQuery(sql代码)

2016年8月22日13:35:08

1.QBC(Query by Criteria)进行检索

1.没有任何条件

Criteria接口

Criteria.add() 仍然是他本身

2.带条件查询

Restrictions.eq()  :Criterion 类型,作为Criteria的参数存在

3.关于别名的设置方式

criteria.createAlias(“dept”,”别名”)

关联查询 (用多的一方作为条件。获取多的一方的集合)

在CreateCriteria(一的一方的字节码)

4.Restrictions.in( )

2016年8月23日14:15:59

注解

@Entity

@Id

@Column

@Table

@GeneratedValue:设置属性的生成策略

@自定义的生成器

@GenericGenerator

HIbernate持久层和一个Orm框架。

担当角色

持久层的一个框架

访问数据的一个原理图

出发点Session.XXXXXX系列

推导Session-------->SessionFactory

SessionFactory----->new Configuration().configure(“hibernate.cfg.xml”).buildSessionFactory()

MyBatis:学习成本低,半自动化ORM框架,性能比HIbernate高,SQL语句是程序员手工定制的。程序员可以控制SQL语句的性能。

前身叫Ibatis 。并且被    .NET领域 ,挖掘过去叫NHibernate,

Hibernate比较笨重。

主流企业已经全线摒弃HIbernate,启用MyBatis。

据不完全统计,每10个开发团队,有11个在用Mybatis.

------------入门案例

1.检索部门信息

1.1 做实体类

@Override

public String toString() {

return "Dept [deptNo=" + deptNo + ", deptName=" + deptName + "]";

}

1.2 写MyBatis 大配置  mybatis-config.xml

<transactionManager type="JDBC" />

<!-- 数据源的方式 POOLED -->

<dataSource type="POOLED">

<property name="driver" value="oracle.jdbc.OracleDriver" />

<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />

<property name="username" value="dog" />

<property name="password" value="dog" />

</dataSource>

1.3 写小配置 Dept.xml

<select id="selectAllDept"  resultType="cn.happy.entity.Dept">

<!-- 这里写的SQL,而不是HQL,SQL中的表名是不区分大小写的 -->

select * from dept

</select>

植入SQL

1.4 写测试类

//session---->SQLSesssionFactory----->SqlSessionFactoryBuilder

Reader  reader=Resources.getResourceAsReader("mybatis-config.xml");

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

时间: 2024-11-07 02:21:24

8.28笔记的相关文章

6.28笔记-servlet3.0注解配置、文件上传、过滤器、监听器

一.servlet3.0注解配置 使用javaEE6.0 支持servlet3.0 value的值就是访问路径 urlPatterns的值也是访问路径 @WebServlet(name="DemoServlet3",value="/demoServlet3") public class DemoServlet3 extends HttpServlet { ... } 二.文件上传 表单 method 必须是post enctype="multipart/f

python语言特性-------python2.7教程学习【廖雪峰版】(一)

开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活.  2.Python是一种相当高级的语言.代码少还不好?代码少的代价是运行速度慢.3.用Python可以做什么?可以做日常任务,比如自动备份你的MP3:可以做网站,很多著名的网站包括YouTube就是Python写的:可以做网络游戏的后台,很多在线游戏的后台都是Python开发的.4.Python的哲学就是简单优雅,尽量写容易看明白的代码,

Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012

[Info   @09:03:33.737] ====================================================================[Info   @09:03:33.743] Team Foundation Server Administration Log[Info   @09:03:33.748] Version  : 11.0.61030.0[Info   @09:03:33.748] DateTime : 05/24/2014 17:0

Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持

在Google官方Android设计指南中(链接:http://www.apkbus.com/design/get-started/ui-overview.html)有一个新特性就是自我标识,也就是宣传自己,所以很多应用现在也自然的使用ActionBar并提供自己的logo. 微信的应用: Google的Android设计指南中是这样说的:应用的 启动图标 作为启动应用的入口是展示 logo 的最佳场所.你也可以将启动图标放置在 操作栏 上,从而保证在应用内的所有页面上都能看到它. 在使用Act

4.28 UNIX环境高级编程 笔记

int dup(int filedes); int dup2(int filedes,int filedes2); 这两个函数都可以实现复制一个现存的文件描述符,但是dup一定返回当前可用最小文件描述符,dup2可以用filedes2参数指定新描述符数值.如果filedes2已经打开,则先将其关闭.如果filedes等于filedes2,则返回filedes2而不关闭. 这些函数返回的新文件描述符与参数参数filesdes共享同一个文件表项. 图3 执行dup之后的内核数据结构 dup2是原子操

传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

《The Swift Programming Language》的笔记-第28页

·        第28页 本页里的主要内容是: 1 介绍swift语言里的各类数制,或者说某一整数的不同表示形式. 1)十进制,无前缀 2)二进制,以0b开头,后边是若干个0和1的序列 3)八进制,以0o开头,后边是若干0~7的序列 4)16进制,以0x开头,后是0~9.a~f序列 以常量31为例,二进制表示31为:0b11111 以常量31为例,八进制表示31为:0o37 以常量31为例,16进制表示31为:0x1f 2 科学计数表示数 1)以10为底的科学计数 2)以2为底的科学计数 12

笔记28 mssql的update :from语法

原文:笔记28 mssql的update :from语法 笔记28 mssql的update :from语法 1 --mssql的update :from语法 2 --a表 b表 结构分别 id ,name , id,memo 3 4 5 --b表的memo需要对照a表 关键ID相同就可以更新,语句如下 6 7 8 update b 9 set memo = a.name 10 from a,b 11 where a.id = b.id 12 --这个就是只更新from内的b结果集,等效于下面的

[原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

1.会话与状态管理 1)背景 ① HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的: ② 作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态: ③ 问题:怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息. 2)会话和会话状态 ① WEB应用中的会话:指一个客户端浏览器与WEB服务