东方咖啡屋 2020-02-11
hibernate在hibernate.cfg.xml中配置数据库驱动,url,账号密码等
hibernate是有3种状态的,分别是瞬时、持久、脱管。其中new className()时数据库中还没有对应记录,这个时候className对象的状态是瞬时。
通过session的save把该对象保存在了数据库中,该对象也和session产生了联系,此时的状态应该是持久的。
最后把session关闭了,这个对象在数据库中有了对应的数据,但是已经和session失去了联系,相当于脱离了管理,状态是脱管。
hibernate有两种面向对象的查询方法,分别是criteria和hql
hibernate有多对一,一对多,多对多的关系。例如Product和Category是多对一的关系,则应该在Product.hbm.xml文件中设置<many-to-one>,再在hibernate.cfg.xml中增加Category的映射。
public class CategoryDAOImpl implements zhongfucheng.dao.CategoryDao{ @Override publicvoidaddCategory(Category category) { QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)"; try { queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()}); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public Category findCategory(String id) { QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); String sql = "SELECT * FROM category WHERE id=?"; try { Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class)); return category; } catch (SQLException e) { throw new RuntimeException(e); } } @Override public List<Category> getAllCategory() { QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource()); String sql = "SELECT * FROM category"; try { List<Category> categories = (List<Category>) queryRunner.query(sql, new BeanListHandler(Category.class)); return categories; } catch (SQLException e) { throw new RuntimeException(e); } } }
要比较hibernate和传统的DBUtil的区别,就先看看传统方式是怎么进行crud的,如果是插入一个新的数据,则将对象的属性进行拆分,然后拼装成SQL语句。
在进行查询时,则是将sql数据的属性拼装成javabean对象,其操作时十分繁琐的。但是如果使用hibernate则直接对对象进行操作。
假设在一个事务中做了两件事情,第一件事情执行成功但是第二件事情执行失败,则第一个事务执行也就不会生效,只有在表的类型是INNODB时才支持事务hibernate支持级联操作,作为级联是指在数据库中多个表的对应关系,假设有一张教师信息表,表中的属性有教师的年龄手机号码家庭住址等信息,另一张表是老师和所带的班级之间的信息,一个班级对应一个老师,包括老师的手机号码,如果在表1 中改变老师张三的手机号码,如果设置了级联,则表二中张三的手机号码也会改变