skyADMIN

spring data 之 CrudRepository

如何用Java写数据库的增删改查?

简单的方法就是自己写sql语句,连接发送。当要数据库、数据表很大的时候,这种方法简直就是在谋杀程序员。

于是有了hibernate框架。然后CRUD就有了一种优雅的写法。

为model包下建的实体对象建Dao文件,例如,现在我有一张User表,我在model中建一个User.java,用@Entity,@Table注解标注这是一个实体,对应User表,写明属性。

然后建一个UserDao.java,这个Dao不是class,而是interface(接口),继承CrudRepository。<User,Long>,写明User和Long的一一对应关系。

public interface UserDao extends CrudRepository<User,Long>{

}

注意看,这个只是个接口,并且里面什么也没有,也没有在其他地方写如何实现,只要有了这个后,在Controller中要操作数据库,只需要用@AutoWired注解自动装配一下UserDao:

@Autowired
private UserDao userDao;

然后,这个CrudRepository中提供了一些方法,比如findOne(),参数是id,返回值是User。还有比如findAll(),用法都可以去网上查询。

但是现在问题来了,假设user表中,不光有id,还有name,sex,age等等,如果我希望用name去查询呢?

只需要在UserDao.java中写上一个方法:public User findByName(String name);

别写实现,就这样就好了,然后在controller中就可以使用了。

昨天写遇着一个坑。数据表里有个字段叫yibanid,于是我在UserDao里写了一个方法叫findByYibanId(long id);,结果直接编译出错了。

一晚上没搞出来,第二天各种比较观察尝试依然无果,最后只好认认真真读一读报错信息。

报错信息的第一行是这样的:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘indexController’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.model.CreatorDao com.example.controller.IndexController.creatorDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘creatorDao’: Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property yibanId found for type Creator! Did you mean ‘yibanid’,’yibanid’?

恩,这整段是第一行,之前只读了差不多前一排半,然后在google,stackoverflow上搜索答案的时候用的从Injection of开始的那一句话,解决方案基本不适合我,后来终于耐心翻完了整个第一句话,发现重点在最后一部分:No property yibanId found for type Creator,很奇怪啊,为什么它说是yibanId呢?应该是yibanid啊,大小写的问题,可是我没有其他地方把I大写了,只有方法名那里。

把方法名改成findByYibanid,果然对了。

码字很辛苦,转载请注明来自环宇博客《spring data 之 CrudRepository》

评论