spring-springboot使用数据

风格不统一 提交于 2020-08-09 11:57:20

本章内容

  使用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

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!