步骤:·先拷贝hibernate开发包到lib下面,jdbc开发包到lib
·拷贝Log4j的属性文件到src下面,复制总的配置文件hibernate.cfg.xml到src下面,配置里面的内容
·对于新建的pojo类要对应的建一个 pojo类名.hbm.xml的配置文件(头子要注意复制进来)
·在hibernate.cfg.xml中添加pojo类的配置文件
一sessionfactory只能创建一次,因为太耗时间了,所以放在了静态代码块中
不能被继承,不能new,所以里面的方法是静态的,可以通过类名. 来调用
public final class DataBase {//不允许继承
private DataBase(){}//不允许new
private static SessionFactory sessionFactory;
static{
//configure()里面是针对与如果你的pojo
//相应的hbm.xml不是这个名字的话,可以在这里设置
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}
public static SessionFactory getFactory(){
return sessionFactory;
}
public static Session getSession(){
Session session = sessionFactory.openSession();
return session;
}
}
2,简单的映射文件 每个pojo类中都对应这一个 类名.hbm.xml的配置文件
<hibernate-mapping>
<class name="hwt.pojo.User" table="user">
<!-- 主键生成策略 -->
<id name="userId" column="userid">
<generator class="native"></generator>
</id>
<!-- 字段 -->
<property name="userName" column="username" unique="true"></property>
<property name="userSex" column="usersex"></property>
<!-- 关系 -->
</class>
</hibernate-mapping>
3,创建表
public static void main(String[] args){
Configuration configuration = new Configuration().configure();//读总的配置文件,只会读取一次
SchemaExport schemaExport = new SchemaExport(configuration);//创建表
schemaExport.create(true, true);//是否显示脚本,是否执行脚本
}
4,session接口和get-load-persist-save 方法
session类中的一些方法:
beginTransaction() // 开启事务
close()// 关闭session
createQuery();//创建查询
delete()//删除对象的
clear()// 清空缓存所有数据
evict()//从缓存里面清除一个数据
flush() //同步数据库
saverOrupdate()
refresh() 重新读取一次
lock()
--------------------
get(类.class, id ) //根据主键拿一条数据
load() //load 与get最大的区别就是他不会立即去访问数据库,而是在你第一次调用的 时候去访问数据,而且load()不会返回空的对象,如:User user = load(User.class, -100) 就算-100在数据库中不存在,也不会返回为空的对象 不能用 if(user == null){....} , 可以使用 System.out.print(user.getClass().getName); 打印出use的 对象名字
---------------------
save() // 保存对象,需要开启事务,当没有开启事务的时候也会把数据插入数据库,但是因为没有提交,所有又回滚了
persist() // 和save()一样,唯一的区别就是当没有开启事务的时候,persist不会把数据插入到数据库中
5,三种不同的对象状态
·瞬时对象:与session没有关系,在数据库中没有对应的记录,超过作用域将会被垃圾回收站回收,一般是刚new的对象且与session没有关系
·持久对象:在数据中有对应的数据记录,与session有直接的关联,session没有关闭,事务没有提交,hibernate可以检测到,当持久对象发生变化的时候,hibernate会自动改变数据中的值,save(),update(),get(),load(),persist()都能转变为持久对象,只有当事务提交了之后,commit()才会写入数据库;
·脱管对象(游离对象):与数据库中有数据对应,但是没有在session中,所有不能被hibernate检测到,所以在对象的内容改变时候,需要用update来更新,同时该对象也会变成持久型对象
saveOrupdate()方法就是针对于如果传过来一个对象,不知道是临时对象还是游离对象,所有就对于临时对象就用save(),对于有理对象就用update()
merge()方法类是saveOrupdate(), 只是merge()不会把这个对象变成持久对象,还是游离对象
对于对象的状态的判断,就是通过主键的id , 如果为 0 ,或者string类型的为 null ,同时可以通过在配置文件中的
<class ....> <id .... unsaved-value="为临时对象的依据"></id> ....</class>
6,Query对象
几个常用的方法:·list(); // 多个结果 ·uniqueResult(); // 唯一结果 ·setFirstResult( n ) //从那个位置开始取结果 ·setMaxResults( m ) //取多少个 ·以及一系列的set方法
hql中用 “:变量名” 来代替 ?,这样就可以不需要按照?的位置 个数来设置,可以用键值对来设置,可以减少犯错
"from User where username = ? "
"from User where username = : name"
public static void main(String[] args) {
Session session = DataBase.getSession();
//Query query = session.createQuery("from User where userSex = ?");
Query query = session.createQuery("from User where userSex = :sex");
//query.setInteger(0, 1);
query.setInteger("sex", 1); //这里可以不要一一对应于第几个问号,是一种键值对,用:name 代替 ?
query.setFirstResult(0); //从第几个开始取
query.setMaxResults(2); //取几个
List<User> list = query.list();//多个结果
//User user = (User) query.uniqueResult();//唯一结果
for (User user : list) {
System.out.println(user.getUserName());
}
}
7 ,criteria 条件查询
criteria 的大部分方法和Query中是一一样的
criteria中的条件可以在Restrictions中去找,里面好多条件都是静态的,可以直接根据类名.方法名来调用 如:Restrictions.eq("" , );
public static void main(String[] args) {
Session session = DataBase.getSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class); //对于某一个类创建一个条件查询
//criteria.add(Restrictions.eq("userName", "xixi")); ==
//criteria.add(Restrictions.ge("userSex", 1)); >=
// criteia.add(Restrictions.lt("birthDay","1990-01-01")); <
ne --> !=
//criteria.add(Restrictions.like("userName", "黄_")); like
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user.getUserName());
}
transaction.commit();
}
7,hibernate.cfg.xml中的几个重要的配置:
· <property name="show_sql">true</property> //显示sql的语句
· <property name="hbm2ddl.auto">update</property> // 这个是设置当pojo和配置文件发生了变化的时候,数据库会自动更新//还可以是 create-drop 和 create 的属性值,前者是当关闭程序的时候会将表删除,后者不会,但是在启动程序的时候两者都会删除表
· <property name="connection.provider_class"> //配置连接池
org.hibernate.connection.C3P0ConnectionProvider
</property>
· <property name="cache.provider_class"> //配置二级缓存,要开启的话,还需要在要配置的pojo类中写<cache usage="read-only"/> usage的值是可以改的
org.hibernate.cache.EhCacheProvider
</property>
·<property name="c3p0.max_size">1500</property>//连接池的最大连接数
·<property name="c3p0.min_size">30</property>//初始化的连接数
· <property name="cache.use_query_cache">true</property>//查询缓存,必须建立在二级缓存的基础上
· <property name="hibernate.search.default.indexBase"> // 针对于 hibernate-search的index目录,如果不能在servlet中及页面显示出来,就要设置这个参数
d:/index
</property>