Web应用脱离了数据也是白费。
目前来说,Java与数据库打交道比较常用的是JDBC和JPA
JDBCTemplate
我们先来看看不使用JdbcTemplate进行数据库操作的方法:
使用JdbcTemplate替换掉:
很明显,使用Template极大的简化了数据库操作。
设计Domain类
每个domain类最好包含id字段,这样便于建立索引,优化查询速度。当然,对于创建日期,可以选择性的使用该字段。
使用JdbcTemplate增删改查
在使用JdbcTemplate前,请添加相关依赖(数据库可以使用mysql):
我们打算实现以下操作:
1. 查询所有的数据
2. 根据id查询指定的数据
3. 保存一个新的数据
接口先行:
注入JdbcTemplate,实现上述接口:
使用@Repository注解用于包扫描成为Bean
@AutoWired注入JdbcTemplate
查询操作具体接口方法的实现:
注意,查询集合的时候使用的是Query方法,查询指定数据的时候使用QueryForObject方法
对象映射方法:
写入数据具体实现:
使用Update方法插入数据
完善Controller
数据库定义语句
将语句存储在schema.sql放置在src/main/resource目录下
数据库数据插入语句
存储为data.sql保存在src/main/resource目录下
数据库创建语句及数据库插入语句会在程序启动的时候默认加载
高级插入语句
根据上文的依赖关系,保存Taco的时候需要向Taco_Ingredients插入数据,保存order的时候,需要同时保存到Taco_Order_Tacos表
使用PreparedStstementCreator插入数据
在保存Taco之后,需要获取到Taco的id,根据id插入Ingredient到Taco_Ingredent表中。
这里使用的update与上文不同,需要两个参数:preparedStatementCreator及KeyHolder,其中,KeyHolder用于获取插入后产生的id,preparedStatementCreator用于生成sql语句。
接下来,注入两个service:
两个方法上的@ModelAttribute用于将对象添加到model中,但是对于订单来说,它需要存在整个会话中,而不是一次请求中,所以在类上添加了@SessionAttributes注解,将数据存到session中。
使用SimpleJdbcInsert插入数据
使用注入的JdbcTemplate生成两个SimpleJdbcInsert对象,生成一个ObjectMapper对象。
使用上述SimpleJdbcInsert插入数据:
通过将对象转换成HashMap将数据存储到数据库中。
注入到Controller使用:
方法中使用的SessionStatus的setComplete方法用于清除session中的order,因为订单已经完成,需要结算,如果不清空session的话,下一次使用order会包含脏数据。