创建一个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&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(); //新建sessionsessionFactory.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如果有执行updateget(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,3List 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);//排序//创建criterionCriteria 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查询
//创建SQLQueryNativeQuery 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




