男性健康项目表六.docx
- 文档编号:15960146
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:22
- 大小:27.22KB
男性健康项目表六.docx
《男性健康项目表六.docx》由会员分享,可在线阅读,更多相关《男性健康项目表六.docx(22页珍藏版)》请在冰点文库上搜索。
男性健康项目表六
男性健康项目表六
#Hibernate-day01
##1.Hibernate是什么:
是一个jdbc封装,(orm框架:
对象关系映射框架)是一个对象关系映射的框架
##2.为什么使用Hibernat:
对jdbc访问数据库的代码进行了轻量级的封装,简化了开发
##3.映射配置文件:
必须跟实体类在同一个包下(类名.hbm.xml)
1.配置一个class.他的name属性是javabean的全类名.table属性是数据库中的表名.数据库名可以不写(会默认去核心配置文件里找url中的数据库名)
2.配置一个id,name属性是javabean中的主键.Colom是数据库中的id.标签内还需要配置一个generator标签,里面配置的是自动增长策略
3.配置一个property标签,name属性是javabean中的属性.colom是数据库中表的字段名
##4.核心配置文件
~~~java
1.配置文件名:
hibernate.cfg.xml
2.配置一个session-factory标签
3.在session-factory标签中配置一个property标签,在hibernate.properties文件中找到mysql链接的class,url,username,password
4.在session-factory标签中配置一个property标签,配置一个name属性是provider,作用是一个连接池提供者
5.在session-factory标签中配置一个property标签,配置一个name属性是c3p0的标签
6.在session-factory标签中配置一个property标签,配置一个show-sql的name属性,作用是在控制台显示hibernate向数据库发送的sql语句
7.在session-factory标签中配置一个property标签,配置一个format-sql的name属性.作用是将控制台显示的sql语句进行格式化
8.在session-factory标签中配置一个property标签,配置一个dialect的name属性,作用是告诉hibernate以什么数据库的方式进行操作
9.在session-factory标签中配置一个property标签,配置一个mapping标签,配置hibernate的映射文件的所在位置,引入hbm文件,复制全路径(例:
com/chouyatou/domian/User.hbm.xml)
~~~
###注意
~~~java
配置hbm文件的时候,mapping中包名以/分隔,配置注解PO类的时候,mapping中包名以.分隔
~~~
##5.openSession是线程不安全.getCurrentSession是线程安全的
##6.先链接数据库.下一步就是配置c3p0
##7.hibernate的执行原理:
~~~java
1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。
2、由hibernate.cfg.xml中的
3、通过config.buildSessionFactory();//得到sessionFactory。
4、sessionFactory.openSession();//得到session。
5、session.beginTransaction();//开启事务。
6、persistentoperate;
7、session.getTransaction().commit();//提交事务
8、关闭session;
9、关闭sessionFactory;
~~~
##8.session的常用方法:
~~~java
save保存对象
update修改操作
delete删除
get/load根据id进行查询
savenOrUpdate执行save或update操作
createQuery(hql语句)获取一个Query对象(例:
session.createQuery("fromUser");from后面是类名)
CreateSQLQUery()获取一个可以操作sql的SQLQuery对象
createCriteria()获取一个Criteria它可以完成条件查询
~~~
##9.Query的使用:
~~~java
//解决转json的时候,获得的json数据为["c":
{"$ref":
"$.orders[0].c"}]
1.分页查询:
Queryquery=session.createQuery("fromCustomer");
query.setFirstResult((2-1)*6);//第二页的数据,从哪个数据开始
query.setMaxResults(6);//每页显示多少调数据
List
分页查询:
过滤属性(不想在json串中出现的属性)
//这个属性过滤器只要在转json串的时候使用了,才能生效
PageBean
PropertyFilterfilter=newPropertyFilter(){
@Override
//第一个参数是对象,第二个参数是属性名称(id,name),第三个参数是属性值
publicbooleanapply(Objectobject,StringpropertyName,Objectvalue){
if("id".equals(propertyName)){
returnfalse;
}
if("csimg".equals(propertyName)){
returnfalse;
}
if("phone".equals(propertyName)){
returnfalse;
}
returntrue;
}
};
//第一个参数是pageBean,第二个参数是属性过滤器
Stringjson=JSONObject.toJSONString(p,filter,SerializerFeature.DisableCircularReferenceDetect);
2.查询指定列的数据:
(查询几个字段,就提供几个字段的构造方法,但是必须提供无参构造方法)
selectnewCustomer(name,address)fromCustomer,得到的是一个存有多个[对象]的list集合(List
selectname,addressfromCustomer,得到的是一个存有多个[数组]的list集合(List
Queryquery=session.createQuery("selectnewCustomer(name,address)fromCustomer");
List
3.条件查询:
/如果查询结果可以保证就是唯一的,我们可以使用query.uniqueResult()来得到一个单独对象.
Queryquery=session.createQuery("fromCustomerwherename=?
");
//也可以这样写:
fromCustomerwherename=:
abc
query.setParameter(0,"田七");//query.setParameter("abc","田七")
List
~~~
##10.本地sql的查询:
~~~java
1.查询所有,得到的是一个存有数据的集合
SQLQuerysqlQuery=session.createSQLQuery("select*fromt_customer");
List
System.out.println(list);
2.将查询到的数据封装到对象中:
SQLQuerysqlQuery=session.createSQLQuery("select*fromt_customer");
sqlQuery.addEntity(Customer.class);//将查询到的数据封装到对象中
List
~~~
##11.Criteria
~~~java
1.criteria用的不多的原因:
只能进行单表查询,函数对sql语句进行了封装,需要去记
2.查询所有:
Criteriacriteria=session.createCriteria(Customer.class);
List
3.分页查询与query一样:
criteria.setFetchSize(10);
criteria.setMaxResults(10);
4.多条件查询:
1.两个条件都满足才查询
Criteriacriteria=session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("name","张三"));
criteria.add(Restrictions.eq("address","北京"));
Customerc=(Customer)criteria.uniqueResult();
2.满足任何一个就查询
Criteriacriteria=session.createCriteria(Customer.class);
//查询条件可以设置任意多个
criteria.add(Restrictions.or(Restrictions.eq("name","六"),Restrictions.eq("address","北京")));
List
~~~
##12.openSession和getCurrentSession的安全性:
~~~java
//涉及到线程安全的时候会用到
openSession和getCurrentSession,open不安全,get安全,是因为get会自动提交,open不会,会导未提交的数据被其他事物读到
~~~
#Hibernate-day02
##1.get和load的区别:
~~~java
<1>get直接得到了一个持久化类型对象.他是一个立即查询操作,
load获得的是一个持久化类的代理类型对象(有延迟策略,当对象使用的时候才会发sql语句)
<2>get方法查询时,如果不存在返回null
load方法查询是,如果不存在会产生异常(ObjectNullPointerException)
~~~
##2.PO类:
1.就是普通的java类加上hbm文件
2.提供一个与数据库表中主键相对应的属性,也叫做oid,作用是Hibernate框架是通过OID来区分不同的PO对象,
如果在内存中有两个相同的OID对象,那么hibernate认为它们是同一个对象
##3.PO类不能final修饰
~~~java
是因为load底层是用的cglib进行的代理操作.而cglib是用的继承方式,PO类被final修饰之后就不能被继承了,load就会报错,所以不能被final修饰
~~~
##4.建议的主键生成策略:
identity:
mysql使用,自动增长主键
sequence:
序列
uuid:
hibernate自动生成一个32位的字符串id
##5.PO类的三种状态:
*/不建议操作脱管态
1.三种状态:
瞬时态:
无oid,与session无关,在表中无记录,使用完之后,会被jvm回收掉,只是用于信息的携带(一般是指new出来的对象)
持久态:
有oid,与session有关,在事务未提交前,一直是持久态,在数据库中可能有,也可能没有,发生改变时,hibernate可以检测到
脱管态:
有oid,与session无关,在数据库中可能有,也可能没有,发生改变时,hibernate不能检测到
2.三种状态之间的切换:
瞬时态--->持久态[调用save或者saveOrUpdate]
持久态--->瞬时态[调用delete方法,被删除的持久化对象不建议使用]
持久态--->脱管态[调用session的evict(清除指定对象),close(关闭,清空一级缓存)者clear(清空一级缓存)方法把session关了就可以]
脱管态--->瞬时态[将oid删除(可以设置为null)]0.不建议使用
脱管态--->持久态[调用save,update或saveOrUpdate方法(lock方法已过时)]
##6.一级缓存:
(二级缓存是SessionFactory级别的缓存)
1.是什么:
hibernate的一级缓存就是session缓存,只要session不关闭,缓存就一直存在
2.特点:
1.当我们通过session的save,update,或get进行操作时.会将持久化对象保存到session中,下一次查询的时候就会先去缓存中查找,然后查数据库
2.当我们通过session的load,get或Query的list进行操作时,会先判断缓存中是否存在,如果没有在去数据库获取,并将查询到的数据存到一级缓存中
3.当调用session的close方法是,会将session清空
2.session缓存的作用:
减少与数据库的交互(操作数据库的时候,缓存中有的话,就会直接到缓存中找,没有的话再去数据库中找)
##7.持久化对象:
1.特点:
具有自动更新数据库的能力,也就是开启事务之后,查出对象,给对象重新赋值,不需要进行update和其他操作,就会改变数据库,
2.原因:
当我们查询出来数据之后,他会保存到session一级缓存中,而一级缓存的底层使用的是Map集合来存的,Map的key是我们查出来的对象,Map的value存的是对象的散装数据(快照区),当我们给对象重新赋值之后,提交事务,session关闭,向数据库发送请求时,会判断一级缓中的数据是否与快照区的数据一致,如果不一样就会发送update语句
##8.session的方法:
clear清空一级缓存.
evict清空一级缓存中指定的一个对象。
refresh重新查询数据库,用数据库中信息来更新一级缓存与快照
##9.表关系(映射文件的配置)
1.多的一方的hbm配置
name属性:
多的一方中一的属性名privateCustomerc;
class属性:
是一的一方的全路径
column属性:
描述关联之后,在多的一方产生的外键
many-to-one:
多对一
2.一的一方的hbm配置
name属性:
一的一方中set集合的名称
column:
是多的一方产生的外键(与多的一方产生的外键名相同)
class:
多的一方的类全路径
one-to-many:
一对多
##10.单项关联和双向关联
注意:
单项关联配置一方,双向关联配置双方
1.单项关联:
需要在任意一方的many或set中配置cascade为save-update就可以完成单项级联,或者两方都配置
2.双向关联:
需要在双方都配置cascade,但那是操作代码的时候尽量进行单项关联
//注意:
双向关联中,配置双方是因为可以通过任意一方就可以操作另一方,代码操作时进行单项关联是因为可以减少对数据的的操作(少发几条sql语句),减少资源浪费
##11.inverse:
1.使用:
只能在set上面去加,many上面没有这个属性,如果取值为false的话,就由有set标签的类维护外键,如果取值为true的话,就是将维护外键的权利交给另一方
2.取值:
外键在哪一个表中,就让哪一方来维护,如果在在本表中,取值为false,如果在其他表中,取值为true
#Hibernate-day03
##1.cascade:
(以客户与订单为例)
1.属性:
1.delete-orphan(与客户解除关系的时候就删除订单):
当客户将订单从集合中移除的时候(可以看做是解除关系),执行代码的时候会将这个订单删除,因为我调用了deleted-orphan,执行完代码并提交事务的时候,数据库中客户的集合中没有该订单,而订单表中的该记录却有客户的id,所以客户将订单移除的时候,就会将该记录删除
2.deleted(与客户解除关系的时候不删除):
虽然客户移除了该订单,只是将订单的外键设置为了null,但不会删除,因为为们没有指明与客户解除关系的时候就删除订单
2.常用属性:
none:
默认值,什么都不做
save-update:
当我们配置它时,底层使用save,update或saveOrUpdate完成操作,级联保存临时对象(也就是瞬时态的对象),如果是游离对象话(有oid与session无关)执行update
delete:
级联删除
delete-orphan:
删除与当前对象解除关系的对象(注解中,该属性已过时,推荐使用orphanRemoval=true)
all:
包含了save-update和delete操作
all-delete-orphan:
包含了delete-orphan和all操作
##2.cascade和inverse有什么区别:
1.cascade可以在单项关联和双向关联的的时候都可以有,inverse只在双向关联使用
2.cascade代表执行级联操作,inverse代表是否由己方维护主键
##3.注解开发:
```java
1.类中的配置:
@Entity---------------------------------------------//定义了一个实体类
@Table(name="t-book")-----------------------------//映射数据库中的表
@Id-------------------------------------------------//主键
@JoinColumn(name="customer_id")---------------------//定义一个外键
@GeneratedValue(strategy=GenerationType.IDENTITY)-//生命一个主键生成策略,默认是native
@GenericGenerator(name="myuuid",strategy="uuid")-//自定义使用uuid主键生成策略
@GeneratedValue(generator="myuuid")---------------//使用自定义主键生成策略
@Column(name="name",length=20)--------------------//映射表中的列名(类中非主键属性)
@Temporal(TemporalType.TIMESTAMP)-------------------//用来定义日期的,值分为年月日,时分秒,年月日时分秒
@transient------------------------------------------//不想生成到数据表中的属性
@OneToMany(targetEntity=Order.class,mappedBy="c")//一对多.指定一个实体类类型.mappedBy与inverse相同(表示customer不在维护主键)
@ManyToMany(targetEntity=Teacher.class)-----------//多对多,在不维护外键的一方配置一个mappedBy表示放弃维护外键
@OneToOne(targetEntity=Man.class)-----------------//一对一,在不维护外键的一方配置一个mappedBy表示放弃维护外键
@Cascade(CascadeType.SAVE_UPDATE)-------------------//建立级联操作
@NamedQuery-----------------------------------------//声明一个HQL语句,在使用的时候直接调用即可
@NamedNativeQuery(name="mysq",query="sql语句")------//声一个SQL语句,在使用的时候直接调用即可
@Proxy(lazy="true")-------------------------------//生命一个延迟策略,true表示类级别延迟加载,false表示类级别也实行立即检索
@Fetch(FetchMode.SUBSELECT)-------------------------//声明sql语句的格式
@LazyCollection(LazyCollectionOption.EXTRA)---------//生命是否延迟加载
@LazyToOne(LazyToOneOption.false)-------------------//是否延迟加载
//声明一个中间表,第一个name是中间表的表名,joinColumns是本类在中间表中的字段,inverseJoinColumns是另一方在中间表中的字段
@JoinTable(name="s_t",joinColumns={@
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 男性 健康 项目