暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hibernate入门

产教Code 2019-08-08
185

创建一个java项目或者web项目(hibernate.cfg.xml文件在下载jar的zip包中有示例)


自己写的hibernate.cfg.xml配置文件(默认数据源)

ps:注意下方图片的配置属性值一般为update


<?xml version="1.0" encoding="utf-8"?>




<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--配置hibernate方言 生成那种sql语句-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--driver 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--连接数据库的URL-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp;characterEncoding=UTF8</property>
<!--数据库用户名-->
<property name="hibernate.connection.username">root</property>
<!--数据库密码-->
<property name="hibernate.connection.password">1234</property>
<!--show_sql true打印SQL语句-->
<property name="show_sql">true</property>
<!--格式化上方打印出来的SQL 因为上方打印出来的SQL是一条看起来很乱-->
<property name="format_sql">true</property>
<!--配置运行时对应的数据库表是 新建/更新/还是测试(新建表->操作->删除表)一般使用update-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 实体类配置-->
<mapping class="zd.lhd.entity.User"/>
<!--映射配置文件的加载-->
<mapping resource="zd/lhd/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>


数据库映射文件

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="zd.lhd.entity.User" table="smbms_user">
<id name="id" column="id">
<generator class="native"></generator> //标明主键自增类型
</id>
<property name=“属性名” colmun=“数据库字段名"></property>
<property name="userName"></property>
<property name="userPassword"></property>
<property name="gender"></property>
<property name="birthday"></property>
<property name="phone"></property>
<property name="address"></property>
<property name="userRole"></property>
<property name="createdBy"></property>
<property name="creationDate"></property>
<property name="modifyBy"></property>
<property name="modifyDate"></property>
</class>
</hibernate-mapping>

如果使用的数据源为c3p0链接oracle

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--c3p0配置-->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="automaticTestTable">Test</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="c3p0.testConnectionOnCheckout">true</property>
<property name="c3p0.idleConnectionTestPeriod">18000</property>
<property name="c3p0.maxIdleTime">25000</property>
<property name="c3p0.idle_test_period">120</property>
















<!--配置hibernate方言 生成那种sql语句-->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property>
<!--driver 数据库驱动 -->
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!--连接数据库的URL-->
<property name="hibernate.connection.url">jdbc:oracle:thin:172.20.10.4:1521:orcl</property>
<!--数据库用户名-->
<property name="hibernate.connection.username">system</property>
<!--数据库密码-->
<property name="hibernate.connection.password">1234</property>
<!--show_sql true打印SQL语句-->
<property name="show_sql">true</property>
<!--格式化上方打印出来的SQL 因为上方打印出来的SQL是一条看起来很乱-->
<property name="format_sql">true</property>
<!--配置运行时对应的数据库表是 新建/更新/还是测试(新建表->操作->删除表)一般使用update-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 实体类配置-->
<mapping class="zd.lhd.entity.User"/>
<!--映射配置文件的加载-->
<mapping resource="zd/lhd/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>


1.加载配置文件

Configuration cf=new Configuration().configure();  //这种方式默认加载hibernate.cfg.xml文件
Configuration cf=new Configuration().configure(***.cfg.xml);  //指定加载配置文件


2.创建会话工厂

SessionFactory sessionFactory=cf.buildSessionFactory();


3.创建会话

Session session = sessionFactory.openSession();    //新建session 
sessionFactory.getcurrSession();     //获取当前线程中的session,会自动关闭。不用close

4.开启事务或者在配置文件中配置自动提交事务(这个事务到最后整合SSH会交给Spring管理)

Transaction transaction = session.getTransaction();
transaction.begin();
//5.执行数据库操作
transaction.commit;




<!--自动提交事务:只针对insert有效-->
<property name="hibernate.connection.autocommit">true</property> //配置文件中配置自动提交事务


6.关闭会话

session.close();


7.关闭工厂

sessionFactory.close();


sessionAPI

save(Object obj);  //插入
saveOrupdate(); //保存或者修改 根据参数对象有没有id如果有执行update
get(Class<T> class,Serializable id); //根据id读取数据 如果id不存在返回null;
load(Class<T> class,Serializable id); //根据id读取数据 如果id不存在则报错;
delete(Object obj); //根据对象删除 其实sql语句还是根据id进行的删除
//1.我们可以先查询将查询出来的对象方入delete()方法中作为参数进行删除;
//2.我们可以自己创建一个对象为对象的id赋值将自己创建的对像当作参数给delete();
//先查询,在删除
User user = session.get(User.class, 1); //查询单条数据
session.delete(user);
//自己新建对象删除
User user1=new User();
user1.setId(2);
session.delete(user1);




update(); //更新操作 先查询在更新。
//下面这种操作也会更新,为什么呢?我们没有调用update()方法啊?(因为内部逻辑代码判断如果你查询出来中后set就是想更新,所以就为我们也执行了update
User user = session.get(User.class, 1);
user.setUserName("系统管理员");


load方法id不存在报错信息


详解get和load的区别:

load()设计模式为懒加载当用户执行load()方法的时候不会查询数据库,当用户用到数据库是才查询数据库将数据返回 (返回的是一个代理对象)


而get()只要执行了就会执行sql语句访问数据库。


Query对象(HQL)

//创建Query对象
Query query=session.createQuery(String str); //str值为“from 表名[条件]”
query.setParameter(0,”..”); //给第一个条件赋值
//分页
//从第几行显示
user.setFirstResult(3);
//每页显示多少条
user.setMaxResults(3); //这两句相当于limit 3,3
List list = user.list(); //返回多条数据
Object obj=user.uniqueResult(); //返回一条数据时使用。
for (Object obj:list) {
System.out.println(obj);
}



Criteria 查询对象(实现完全面向对象不写HQL语句)

//根据条件查询
Criteria criteria = session.createCriteria(Emp.class); //创建criteria对象
//public Criteria add(Criterion criterion); Restrictions是Criteria的实现类
criteria.add(Restrictions.eq("Empno",7788)); //ps: 前面为属性名而不是数据库字段名
BigDecimal bigDecimal=new BigDecimal("1000");
criteria.add(Restrictions.gt("Sal",bigDecimal)); //gt();大于 ge();大于等于
Emp emp= (Emp) criteria.uniqueResult(); //返回多条使用list();
System.out.println(emp);

//排序
//创建criterion
Criteria criteria = session.createCriteria(Emp.class);
BigDecimal bg=new BigDecimal("9000");
criteria.add(Restrictions.le("Sal", bg));
Criteria sal = criteria.addOrder(Order.desc("Sal"));
List list = sal.list();
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}




//分组
Criteria criteria = session.createCriteria(Emp.class);
BigDecimal bg=new BigDecimal("9000");
criteria.add(Restrictions.le("Sal", bg));
Criteria deptno = criteria.setProjection(Projections.groupProperty("Deptno"));
List list = deptno.list();
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}  
…..


SQLQuery使用原生sql查询

//创建SQLQuery
NativeQuery sqlQuery = session.createSQLQuery("select * from EMP where EMPNO=?");
sqlQuery.setParameter(1,7788);
List<Object[]> list = sqlQuery.list(); //返回的是数集合
for (Object []o:list) {
for (Object objects:o) {
System.out.println(objects);
}
}


对象的三种状态

瞬时状态:自己new出来的对象就是处于瞬时状态的。

持久状态:从数据中查询出来的对象,因为在session拥有此对象缓存和快照(就是将查询出的对象复制一份)

游离状态:当session关闭之后 session中的缓存和快照都被清楚,就会让对象从持久状态转换为游离状态



clear(); //清楚session中的缓存
evict(Object obj); //清楚指定对象在session中的缓存
flush(); //强制进行脏检查





下方代码介绍:

当我们使用get或者load进行查询之后此时查出来的对象处于持久状态

这个时候我们改变这个对象里面的参数后进行事务的提交或者flush()

hibernate会拿这个对象和快照进行脏检查如果有改变就执行更新.(这个对象必须是在持久状态)



文章转载自产教Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论