springboot学习 spring-boot-starter-data-jdbc


starter-data-jdbc

包含

  1. 配置
  2. starter-jdbc
  3. data-jdbc https://docs.spring.io/spring-data/jdbc/docs/2.2.0/reference/html/#project

data-jdbc

注解 + 反射

interface PersonRepository extends PagingAndSortingRepository<Person, String> {
	// @Query("SELECT * FROM person WHERE name = :name")
	// List<Person> findByLastname(String lastname);
	// 上下等价
	List<Person> findByLastname(String lastname);
}

流程

findByLastname -> Lastname 对应的实体有没有@Column注解 -> 有注解 Lastname = name

SELECT * FROM person WHERE name = :name -> mate -> 有注解 name = Lastname -> setter

选用这种orm没问题,再来看看starter-jdbc

starter-jdbc

starter-jdbc的一个很大的缺点就是,每一个bean都会和sql执行绑定,重复且繁琐.现在的好消息是orm以及帮我们解决了这个,但是orm维护的bean,不灵活.

比如一个很复杂的sql返回了,各部门薪资前三的员工,这是一个联表,很明显无法映射到两各类中.

jdbc有两种风格

  1. bean-base 缺点复杂用spring-data-jdbc解决
  2. map-base 缺点认为所有结果都是map,而map不好读.(只看代码你无法知道map有什么?需要看sql语句)

现在1.解决了.2,灵活适合这种情况下.

func map(
new map
List<Actor> actors = this.jdbcTemplate.query(
        "select first_name, last_name from t_actor",
        new RowMapper<Actor>() {
            public void mapRow(ResultSet rs, int rowNum) throws SQLException {
                map.put("first_name", rs.getString("first_name"));
                map.put("last_name", rs.getString("last_name"));
            }
        });
return map
)

存在线程竞争,可以考虑concurrent包。

springboot学习 spring-boot-starter-data-jdbc

上一篇:目录操作函数


下一篇:Nosql