Hibernate ORM(Spring data JPA方式)举例
例子来源于Spring data的官方例子,是采用JPA的方式。
7.1 每个实体对应的dao接口
public interface UserDao extends CrudRepository<User, Integer> { }
public interface OrdersDao extends CrudRepository<Orders, Long> {
//不能用组合条件.若要用,需要在对应接口写方法
List<Orders> findByUseridAndTotal(String userid, BigDecimal total);
}
public interface OrderitemDao extends CrudRepository<Orderitem, Long> { }
每个Dao都要定义一个接口文件,即使是空的也需要,那1000个JavaBean文件就要有1000个类似的接口。那n个JavaBean呢,就需要有n个类似的接口, 这样编码复杂度就是O(n)。
7.2 保存和查询数据库表的举例代码
@Autowired
private UserDao userDao;
@Autowired
private OrdersDao ordersDao;
@Autowired
OrderitemDao orderitemDao;
//...其它省略代码
User n = new User();
n.setName("testName");
n.setEmail("hibernateUser@163.com");
userDao.save(n);
Orders orders=new Orders();
orders.setUserid("Hibernate");
orders.setName("ORM framework");
orders.setTotal(new BigDecimal("92.22"));
orders.setRemark(""); //empty String test
ordersDao.save(orders);
Orderitem orderitem=new Orderitem();
orderitem.setOrderid(100001L);
orderitem.setUserid("bee");
orderitem.setCategory("book");
orderitem.setPrice(new BigDecimal("30"));
orderitemDao.save(orderitem);
// ordersDao.findOne(id); //不能用组合条件.若要用,需要在对应接口写方法
// List<Orders> list = (List<Orders>) ordersDao.findAll();
List<Orders> list = (List<Orders>) ordersDao.findByUseridAndTotal("Hibernate",new BigDecimal("92.22"));
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
7.3 打印的日志
Hibernate: insert into user (email, last_name, name, password, username) values (?, ?, ?, ?, ?)
Hibernate: insert into orders (createtime, name, remark, sequence, total, userid) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into orderitem (category, createtimne, orderid, price, remark, status, userid) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: select orders0_.id as id1_1_, orders0_.createtime as createti2_1_, orders0_.name as name3_1_, orders0_.remark as remark4_1_, orders0_.sequence as sequence5_1_, orders0_.total as total6_1_, orders0_.userid as userid7_1_ from orders orders0_ where orders0_.userid=? and orders0_.total=?
Orders[id=1,userid=Hibernate,name=ORM framework,total=92.22,createtime=null,remark=, sequence=null]
7.4 结论
- 3个实体,需要写3个接口文件;n个实体则需要写n个。
- 需要为每一个实体定义不同的dao变量操作数据库,如userDao,ordersDao,orderitemDao。n个实体需要定义n个dao变量。
- 使用Javabean中的字段,组合成查询条件,需要在接口中声明方法。
- 通过观察日志发现,不能默认过滤null和空字符串字段。像createtime是null,当DB表设置了默认是当前时间时,还是被保存为null。
- 编码复杂度为O(n)。