hibernate基础

步骤:·先拷贝hibernate开发包到lib下面,jdbc开发包到lib

     ·拷贝Log4j的属性文件到src下面,复制总的配置文件hibernate.cfg.xmlsrc下面,配置里面的内容

  ·对于新建的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(truetrue);//是否显示脚本,是否执行脚本

}

4session接口和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 , 如果为 ,或者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());

}

}

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();

}

7hibernate.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-searchindex目录,如果不能在servlet中及页面显示出来,就要设置这个参数

d:/index

</property>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值