前言
通过前一个示例学习(玩转Spring一),已了解@Bean注解的基本概念和利用Bean注解创建RestTemplate对应给Spring的Ioc容器管理。本示例将进一步理解@Bean与@Autowired的区别,学习利用Spring data jpa访问常用的MySQL数据库。
将学习的知识
@Autowired 注解(重点)@Entity 注解@RequestMapping PostMapping GetMapping 注解application.properties 配置文件
代码编辑
一、 下载官网的示例。
git clone https://github.com/spring-guides/gs-accessing-data-mysql.git
,怎样使用这一块可参考本人前面的文章哈。官网的教程地址:https://spring.io/guides/gs/accessing-data-mysql/
二、 在终端连接本地的MySQL数据库,创建名为db_example的数据库。如果没有安装MySQL的,自行百度安装,哈哈。
三、配置application.properties文件
我的本地MySQL账号密码均为root,各位大大根据实际情况调整。这里的文件格式为properties,使用等于号配置,官网推荐的是使用yaml格式来配置的。以后大规模配置的时候再使用Yaml格式来写啦。如果需要使用Yaml,只需要调整该文件名为 application.yaml或application.yml即可。
这里的spring.jpa.hibernate.ddl-auto有四种模式,分别为none,update,create,create-drop
none: The default for MySQL. No change is made to the database structure(默认模式,不对数据库结构进行调整)update: Hibernate changes the database according to the given entity structures(Hibernate会根据给定的实体类更新数据结构。我们一般使用这种模式).create: Creates the database every time but does not drop it on close.(每次运行该程序,会重新创建表格,但关闭时不会清理数据。注意,重新启动程序时会清理数据,只创建表结构。)create-drop: Creates the database and drops it when SessionFactorycloses(每次运行该程序,会重新创建表格,但关闭程序时会删除表格。删库跑路的方案,重启程序就完蛋).四、 在启动文件同一级的目录下,创建User.java的实体类。
为此类的属性自动生成getter、setter,在IDEA编辑器上右键选择Generate生成。
为此类加上@Entity注解,表明此类为实体类,与数据库的表进行关联,默认表名为类名(User),如果需要指定表名,可使用@Table(name="xx_user")注解此类。
@Id注解在属性上表明此属性为主键。
GenerationType, JPA提供的四种标用法为TABLE,SEQUENCE,IDENTITY,AUTO(默认). 具体的区别可看下图注释,了解一下就好。以后用到再细查。
五、编写UserRepository.java接口
此接口主要是继承CrudRepository接口,CrudRepository里面实现了大多数的增删改查等方法。
相信你会和我一样地好奇,这里只是创建了一节UserRepository接口,该接口继承于CrudRepository接口,怎么就实现了增删改查的方法呢?我们可从没写过类去实现这些接口中的方法啊。官方实例也只是简单的说明了一下Spring会自动实现这一接口。
Spring automatically implements this repository interface in a bean that has the same name (with a change in the case—it is calleduserRepository
其实是Spring通过动态代理对象去实现这个功能的。里面有个SimpleJapRepository类实现了这些方法。通过后面编写完MainController后的断点调试,可找到个类的源码,此处仅仅满足好奇心,其实作为初学者,我们知道怎么用就好啦。详细的调试可参考此文档:https://www.pianshen.com/article/2589187911/
六、编写MainController.java类,实现Controller层。
@Controller 注解表明此类为MVC中的Controller层,是一个控制器。
@RequestMapping 也可在方法上进行此注解的,包含解析post/get这两种请求。@PostMapping就是只能使用post请求啦。对应的@GetMapping就只能使用get请求。path的值为路径。
@Autowired 注解为告知Spring为这个userRepository为注入实例,根据类名来注入。还记得上一章我们创建的对象通过加@Bean注解来交给Spring进行管理吗。现在可通过@Autowired来注入使用啦。
七、启动、测试。
由于浏览器操作POST方法很繁琐,建议使用POSTMAN来提交测试数据。或者参考官网的终端curl命令。
curl localhost:8080/demo/add -d name=First -d email=someemail@someemailprovider.com
发送post请求添加数据后,在浏览器输入:http://localhost:8080/demo/all 即可查找到数据啦。
结束
本章学习了@Autowired 和@Entity的注解使用方式,了解了增删改查数据库的基本流程。在学习本例的过程中,用了比较长的时间查询CrudRepository动态代理的实现方式,感觉有点浪费时间。加油