hibernate文档
1、求总条数,getSession.createQuery(hql).setString("name",name).setString(0,age).setData("applyDate",applyDate).uniqueResult() 还可以使用setPAramter();
参数绑定setParamter 可以绑定任意类型的数据,query.setParameter(“customername”,name,Hibernate.STRING);一些类型必须指明类型,如date在hibernate中可能映射成date也可能映射成timestamp
setProperties 可以绑定实体类 setString 可以按参数名称绑定,也可以使用位置绑定
uniqueResult() 来获得总条数,intValue()转换为int类型
ehcache http://raychase.iteye.com/blog/1545906
唯一依赖于slf4.jar
1、若返回单个字段的时候 List<object[]> list=session.createQuery("select user.name,user.age from User user").list();
但也可以动态构造实例对象,List<User> list=sesssion.createQuery("select new User(user.name,user.age) from User user").list(); 这样获得的user对象是瞬时态的,如果用saveorupdate的时候,执行的是save方法
get与load区别,get查询时,若没有对象返回null,若是load没有对象则抛出异常
1、hibernate的配置:第一先配置他的dataSource,然后再配置sessionFactory,有三个属性,一个为dataSource 一个为hibernateProperties 一个为 packagesToScan,扫描包下面的实体类与数据库对应
2、PropertyPlaceholderConfigurer可以用来读取properties配置文件
3、hibernate实体类注解: 类名前加@Entity(name="t_user") name可选代表数据库一个表, @Table(name="t_user")
注解配置 <mapping class="com....User"/> xml配置<mapping resource="com/...user.xml"/
4、@Temporal(TemporalType.TIME),日期映射,返回给jsp后不用再去转换
7-7
1、list返回的数据类型,若是两个表关联的情况,则一个对象为object[0] 另一个对象为object[1],也可以写成包装类型VO,vo。对象。属性便可,也可以是利用@onttoone来关联,获取一个对象,其实也是另外形式的VO
http://blog.csdn.net/tanyit/article/details/6987279#_Toc251597130
1、hibernate的映射关系
一对多单向,在一的一方配置,多的一方不用管,例如班级与学生表,private Set<Student> student=new HashSet<>(); ,然后在get上面@OneToMany(cascade={CascadeType.ALL}) ,@joinColumn(name="ClassesId"),name值可以任意,代表外键的名称 这一个必须有,否则会生成一个class_student的中间表,在多的一方不用配置,只需要自己的Id,和name便可,外键也不用配置,若要写的话,必须和joinColumn一致,否则会生成两个字段
多对一单向,相对简单,只需要在多的一方,@ManyToOne(cascade={CascadeType.ALL)便可以
多对一双向,在多的一方配置@ManyToOne 在一的一方配置@OneToMany(cascade={CascadeType.ALL},mappedBy="classes") 其中classes代表的是表名
一对一单向,
至于是使用单向还是双向,就看是否需要获取对方数据,例如需要通过人员查询到部门,又需要通过该部门查询到拥有哪些人员,这样就需要双向的,如果是考题获取选项,这种模型的就需要单向就可以
2、级联,cascade取值有四个类型,all所有情况下都级联,save-update只有新增和更新的时候执行级联,delete 删除的时候执行级联,none任意情况下都不执行级联
3、关于hibernate的懒加载 http://blog.csdn.net/huhui_cs/article/details/8589977 获取到的对象只是代理对象,若要取属性的时候才会发出sql语句
1、get与load
load为延迟加载,查询得到的对象其实只是一个保存了id属性的代理对象User,load后并不发出sql语句,而user.getId后依旧不发送sql、而当getName时才会发送
load加载要比get的性能好一些
clear()清除所有对象的缓存,evict(User)清除单个对象的缓存,使其处于游离态
flush() 刷新缓存与数据库一致,会立即发出sql语句,但是必须得 session.close(),或者commit()这样才可以提交
2、spring与hibernate整合
在dao中获得sessionFactory对象方法: 直接在dao注入sessionFactory,利用AutoWire 也可以使用get set方式获得sessionFactory
dao继承HibernateDaoSupport 需要
@Autowired //必须有这一段 否则启动项目会报错 private SessionFactory sessionFactory1;//这一句不可以有 否则无法生成sessionFactory 因为写了就相当于把sessionFactory 赋值给了当前类 public void setSessionFactory1(SessionFactory sessionFactory1) { super.setSessionFactory(sessionFactory1); }
直接使用getSession获得session 或者通过getHibernateTemplate().find(hql),直接获得对象的list集合
在spring.xml 配置
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
context:component-scan base-package="com.longcai" 扫描,用include-file 来确定扫描什么 exclude-file来判断不扫描什么包 有 controller service repository componet
autowired利用byType resource先name,只需要写private 不用写set get,@service("加名字1") 则@Qualifier("使用那个名字1"),如果不加name1,bean的name默认为类名首字母小写,如果是实现类则用charDaoImpl便可
如果找不到就byType 若指定了@Resource(name="baseDao")则只能用byname