本章内容
使用spring的JdbcTemplate
使用SimpleJdbcInsert插入数据
使用SpringData声明JPAreposity
使用JDBC读取和写入数据
调整领域对象以适应持久化
在将对象持久化到数据库的时候,通常最好有一个字段作为对象的唯一标识。
使用JdbcTemplate
定义jdbcTemplate repository
public interface IngredientRepository{
Iterable<Ingredient> findAll();
Ingredient findOne(String id);
Ingredient save(Ingredient ingredient)
}
开始使用jdbcTemplate编写repository
@Repository
public class JdbcIngredientRepository implements IngredientRepository{
private JdbcTemplate jdbc;
@Autowired
public JdbcIngredientRepository(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
...
}
@Override
public Iterable<Ingredient> findAll(){
return jdbc.query("select id,name,type from Ingredient",this::mapRowToIngredient);
}
@Override
public Ingredient findOne(String id) {
return jdbc.queryForObject("select id,name,type from Ingredient where id=?",this::mapRowToIngredient,id);
}
private Ingredient mapRowToIngredient(Result rs,int rowNum) throws SQLException{
return new Ingredient(rs.getString("id"),rs.getString("name"),Ingredient.Type.valueOf(rs.getString("type")));
}
findAll()方法预期返回一个对象的集合,它使用了JdbcTemplate的query()方法。query()会接收要执行的sql以及spring RowMapper的一个实现(用来将结果集中的每行数据映射为一个对象)。query()方法还能以最终参数的形式接收查询中所需要的任意参数。
findOne()方法预期只会返回一个Ingredient对象,所以它使用了JdbcTemplate的queryForObject方法,而并不是query()。
@Override
public Ingredient findOne() {
rturn jdbc.queryForObject("select id,name,type from Ingredient where id = ?",
new RowMapper<Ingredient>() {
public Ingredient mapRow(ResultSet rs,int rowNum)throws SQLException{
return new Ingredient(
rs.getString(id),
rs.getString(name),
Ingredient.Type.valueOf(rs.getString("type")))
};
},id);
}
插入一行数据
@Override
public Ingredient save(Ingredient ingredient){
jdbc.update("insert into Ingredient (id,name,type) values(?,?,?)",
ingredient.getId(),
ingredient.getname(),
ingredient.getType().toString());
return ingredient;
}
因为这里不需要将ResultSet数据映射为对象,所以update()方法要比query或queryForObject()简单的多。
在控制器中注入和使用Repository
@Controller
@RequestMapping("/design")
@SessionAttributes("order")
public class DesignTacoController{
private final IngredientRepository ingredientRepo;
@Autowired
public DesignTacoController(IngredientRepository ingredientRepo){
this.ingredientRepo = ingredientRepo;
}
@GetMapping
public String showDesignForm(Model model){
List<Ingredient> ingredients = new ArrayList<>();
ingredientRepo.findAll().forEach(i->ingredients.add(i));
Type[] types = Ingredient.Type.values();
for(Type type:types){
model.addAttribute(type.toString().toLowerCase(),filterByType(ingredients,type))
}
return "design";
}
...
}
定义模式和预加载数据
插入数据
使用spring Data JPA持久化数据
添加Spring Data JPA到项目中
将领域对象标注为实体
声明JPA Repository
自定义JPA repository
来源:oschina
链接:https://my.oschina.net/u/4269669/blog/4417041