Hibernate 笔记
2016-03-05 08:23
369 查看
sample code:
Hibernate 配置:
JDBC方式: 主要属性:
properties方式 xml方式sample
dialect --net.sf.hibernate.dialect.MySQLDialect
driver_class driverClassNamecom.mysql.jdbc.Driver
url urljdbc:mysql://localhost/sample
username usernameroot
password password
使用JDBC时,可以指定连接池,默认为:
hibernate.connection.pool_size 2
C3P0
hibernate.c3p0.max_size 2
hibernate.c3p0.min_size 2
hibernate.c3p0.timeout5000
hibernate.c3p0.max_statements 100
hibernate.c3p0..idle_test_period3000
hibernate.c3p0..acquire_increment2
hibernate.c3p0.validatefalse
hibernate.c3p0.provider_class net.sf.hibernate.connection.C3P0ConnectionProvider
DBCP
JNDI方式:主要属性:
properties方式 sample
dataSource jdbc/test
username user
password
dialect net.sf.hibernate.dialect.MySQLDialect
UserType和CommonUserType支持用于自定义数据
DetachedCriteria可以脱离当前session存在,每次使用时与当前session绑定可以获得更好的代码重用效果。
Criteria高级特性:限定查询范围,分组与统计
//返回从第100条结果开始的20条记录
criteria.setFirstResult(100);
criteria.setmaxResults(20);
criteria.addOrder(Order.asc("name"));
HQL: [select/update/delete ...][from ...] [where ...] [group by ... [having ...]] [order by ...]
HQL 子句大小写无关,但是类名属性名区分大小写
HQL 查询的目标实体存在继承关系判定,例如 "from TUser" 将返回所有TUser以及子类的记录。"from java.lang.Object" 返回数据库中所有库表的记录。
table T_User <--------> class TUser
HQL: "from TUser" <--------> SQL: "select * from T_User"
HQL: "from TUser as user where user.name='Eric'";
where 字句中可以使用算数表达式:
"from TUser user where (user.age%2=1)"
"select user.name user.age from TUser user";
面向对象的风格:
"select new TUser(user.name, user.age) from TUser as user"
占位符:
Query query=session.createQuery("select user.name user.age from TUser user where user.age=:age ");
query.setParameter("age",Integer.valueOf(18));
//query.setParameter(new User().withAge(Integer.valueOf(18)));
引用查询:将查询语句放到配置文件中
User{
Address
age
}
即时加载:当宿主实体加载时,Hibernate会立即自动读取器关联的数据并完成关联属性的填充。当"from TUser"时,会生成两条sql语句。一条查询TUser表,另一条查询Address表。
延迟加载:当真正需要数据的时候才进行读取操作。即当调用user.getAddress时,发生第二条查询。
预先加载:和即时加载类似,但是是通过outer-join完成关联数据的加载,这样通过一条sql即可完成对数据的读取。
批量加载:通过批量提交多个限定条件,一次完成多个数据的读取。
SQL查询:session.createSQLQuery("select (user.*) from T_User user","user",TUser.class).list();
--------------------------------------------------------------------------------
实体对象生命周期
Transit ---------session.save/(setId->update)----------------> Persist
Persist---------session.close------------------------------------->Detached
Transit---------user.setId------------------------------------------->Detached
Detatched----session2.update---------------------------------->Persist
Persist--------session.delete------------------------------------->Transit
脏数据的检查:
1.拦截器:当对象的setter方法被调用时, 对象被设置为待更新状态;
2.版本号:持久层框架维护对象版本,当提交时,比较对象版本与持久层版本的差异(Hibernate采用)。
session.find 对缓存只写不读,也就是从来不利用缓存;session.iterate方法首先查看缓存,如果没有则查询db;
session.evict(user),清除user的一级缓存;
sessionFactory.evict()清除二级缓存;
Query Cache,缓存之前查询过的结果集,但是如果Hibernate发现SQL对应的库表发生变化时,会使这个结果集失效。
主要数据类型对应关系:
Configuration config = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()) .buildServiceRegistry(); SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession(); session.createQuery("from Stocks"); Stock stock00 = new Stock(); stock00.withBegin(1.2f).withEnd(1.5f).withHigh(1.5f); session.save(stock00); // find the stock whose id is one; Stock stock01 = (Stock) session.get(Stock.class, Integer.valueOf(1)); session.delete(stock01); // delete via HQL; session.delete("from Stock where code=600030");// delete via HQL; // delete via Query Query query = session.createQuery("delete Stock where date<'2015-12-13'"); query.executeUpdate(); // query via Query String hql = "from Stock stock where stock.code like ?"; Query query2 = session.createQuery(hql); query2.setParameter(0, "6000%"); List<Stock> stocks = query2.list(); // query via Criteria Criteria criteria = session.createCriteria(Stock.class); criteria.add(Expression.eq("code", "600030")); criteria.add(Expression.gt("date", "2015-12-13")); List<Stock> stocks2 = criteria.list(); Criteria criteria2 = session.createCriteria(Stock.class); criteria2.add(Example.create(new Stock().withBegin(3.2f))); List<Stock> stocks3 = criteria.list();
Hibernate 配置:
JDBC方式: 主要属性:
properties方式 xml方式sample
dialect --net.sf.hibernate.dialect.MySQLDialect
driver_class driverClassNamecom.mysql.jdbc.Driver
url urljdbc:mysql://localhost/sample
username usernameroot
password password
使用JDBC时,可以指定连接池,默认为:
hibernate.connection.pool_size 2
C3P0
hibernate.c3p0.max_size 2
hibernate.c3p0.min_size 2
hibernate.c3p0.timeout5000
hibernate.c3p0.max_statements 100
hibernate.c3p0..idle_test_period3000
hibernate.c3p0..acquire_increment2
hibernate.c3p0.validatefalse
hibernate.c3p0.provider_class net.sf.hibernate.connection.C3P0ConnectionProvider
DBCP
JNDI方式:主要属性:
properties方式 sample
dataSource jdbc/test
username user
password
dialect net.sf.hibernate.dialect.MySQLDialect
UserType和CommonUserType支持用于自定义数据
DetachedCriteria可以脱离当前session存在,每次使用时与当前session绑定可以获得更好的代码重用效果。
Criteria高级特性:限定查询范围,分组与统计
//返回从第100条结果开始的20条记录
criteria.setFirstResult(100);
criteria.setmaxResults(20);
criteria.addOrder(Order.asc("name"));
HQL: [select/update/delete ...][from ...] [where ...] [group by ... [having ...]] [order by ...]
HQL 子句大小写无关,但是类名属性名区分大小写
HQL 查询的目标实体存在继承关系判定,例如 "from TUser" 将返回所有TUser以及子类的记录。"from java.lang.Object" 返回数据库中所有库表的记录。
table T_User <--------> class TUser
HQL: "from TUser" <--------> SQL: "select * from T_User"
HQL: "from TUser as user where user.name='Eric'";
where 字句中可以使用算数表达式:
"from TUser user where (user.age%2=1)"
"select user.name user.age from TUser user";
面向对象的风格:
"select new TUser(user.name, user.age) from TUser as user"
占位符:
Query query=session.createQuery("select user.name user.age from TUser user where user.age=:age ");
query.setParameter("age",Integer.valueOf(18));
//query.setParameter(new User().withAge(Integer.valueOf(18)));
引用查询:将查询语句放到配置文件中
User{
Address
age
}
即时加载:当宿主实体加载时,Hibernate会立即自动读取器关联的数据并完成关联属性的填充。当"from TUser"时,会生成两条sql语句。一条查询TUser表,另一条查询Address表。
延迟加载:当真正需要数据的时候才进行读取操作。即当调用user.getAddress时,发生第二条查询。
预先加载:和即时加载类似,但是是通过outer-join完成关联数据的加载,这样通过一条sql即可完成对数据的读取。
批量加载:通过批量提交多个限定条件,一次完成多个数据的读取。
SQL查询:session.createSQLQuery("select (user.*) from T_User user","user",TUser.class).list();
--------------------------------------------------------------------------------
实体对象生命周期
Transit ---------session.save/(setId->update)----------------> Persist
Persist---------session.close------------------------------------->Detached
Transit---------user.setId------------------------------------------->Detached
Detatched----session2.update---------------------------------->Persist
Persist--------session.delete------------------------------------->Transit
脏数据的检查:
1.拦截器:当对象的setter方法被调用时, 对象被设置为待更新状态;
2.版本号:持久层框架维护对象版本,当提交时,比较对象版本与持久层版本的差异(Hibernate采用)。
session.find 对缓存只写不读,也就是从来不利用缓存;session.iterate方法首先查看缓存,如果没有则查询db;
session.evict(user),清除user的一级缓存;
sessionFactory.evict()清除二级缓存;
Query Cache,缓存之前查询过的结果集,但是如果Hibernate发现SQL对应的库表发生变化时,会使这个结果集失效。
主要数据类型对应关系:
相关文章推荐
- Java 序列化
- 成员方法
- for循环效率对比
- .NET 统一用户管理 -- 单点登录
- AngularJs一些记录
- thinkphp-1
- Tsinsen-A1100 竖式问题 (iomanip中setw()的使用)
- 3943: [Usaco2015 Feb]SuperBull|最大生成树
- jquery_dialog实现效果
- iOS UI设计---九宫格布局算法
- 【集合框架】JDK1.8源码分析之HashMap(一)
- OSChina 周六乱弹 ——大萌别睡了,该起来喝药拉!
- 第25课:Spark Sort-Based Shuffle内幕工作机制
- serialVersionUID 作用
- 用户文章评论
- 浅谈hibernate+入门实例
- 浅谈hibernate+入门实例
- Socket
- 巨巨来袭
- Python图像处理库PIL的ImagePath模块介绍