您的位置:首页 > 其它

Hibernate 笔记

2016-03-05 08:23 369 查看
sample code:

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对应的库表发生变化时,会使这个结果集失效。

主要数据类型对应关系:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: