starter-data-jdbc
包含
- 配置
- starter-jdbc
- 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有两种风格
- bean-base 缺点复杂用spring-data-jdbc解决
- 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包。