1、jpa、hibernate、spring-data-jpa关系 JPA的是 Java Persistence API 的简写,JPA是一套规范,而不是具体的ORM框架。故Hibernate、TopLink 等ORM框架 都是JPA的实现,其中Hibernate已获得Sun的兼容认证。
【#|jpa、hibernate、spring-data-jpa关系】开发者面向JPA规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现
Spring框架几乎是无所不能,无所不在。其次Spring也想要做持久化相关工作,并且已有Spring-data-**这一系列包(Spring-data-jpa,Spring-data-template,Spring-data-mongodb等)。其中Spring-data-jpa即代表着,Spring框架对JPA的整合。Spring Data JPA是在JPA规范的基础下提供了jap接口Repository层的实现JpaRepository,
Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。
SpringData Jpa 极大简化了数据库访问层代码。 如何简化的呢? 使用了SpringDataJpa,我们的dao层中只需要写接口,就自动具有了增删改查、分页查询等方法。
让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦
2、spring-jdbc(spring-boot-starter-jdbc) spring-boot-starter-jdbc也就是创建项目时下图中的JDBC API,也就是JDBCTemplate,提供基础的 Spring 抽象类,包括 DataSource 等,帮助你在 Spring 框架下链接数据库。同时支持使用 JdbcTemplate 连接数据库、执行 SQL 语句。
文章图片
基础sql使用
public interface StudentDAO {
/**
* 查询所有学生
* @return 所有学生
*/
public List query();
}
public class StudentDAOImpl implementsStudentDAO{
@Override
public List query() {
List students = new ArrayList();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = "select id, name , age from student";
try {
connection = JDBCUtil.getConnection();
//这里我们把获取连接操作写在一个工具类中,方便调用
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
Student student = null;
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
student = new Student();
student.setId(id);
student.setName(name);
student.setAge(age);
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(resultSet,preparedStatement,connection);
//关闭操作也写在工具类中,方便调用
}
return students;
}
}
jdbcTemplate使用
public interface StudentDAO {
/**
* 查询所有学生
* @return 所有学生
*/
public List query();
}/**
* StudentDAO访问接口实现类:通过Spring jdbc的方式操作
*/
public class StudentDAOSpringJdbcImpl implementsStudentDAO{
private JdbcTemplate jdbcTemplate;
//使用SpringIoc注入
public List query() {
final List students = new ArrayList();
String sql = "select id, name , age from student";
jdbcTemplate.query(sql, new RowCallbackHandler(){
//RowCallbackHandler是一个接口,这里使用内部类的方式实现接口
@Override
public void processRow(ResultSet rs) throws SQLException {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
Student student = new Student();
student.setId(id);
student.setName(name);
student.setAge(age);
students.add(student);
}
});
return students;
}
}
这里解释一下这个接口:接口中的processRow方法参数是一个ResultSet,也就是一个结果集,我们可以定制自己对结果集的操作。
我们可以清楚的看到,相对于原生的JDBC,很多冗余的代码都不见了,代码也清爽了许多。这貌似看起来已经很不错了,
然后程序员是真的很“懒”呀,他们又想:我们拿到结果集之后还要自己一个个将值设置到对象中,这个机械化的操作,能不能也有类似模板的东西帮我们去做?答案是可以的,
结果集直接映射成对应的实体类,我们拿到的结果就是若干个实体类,省去了手动设值的过程,也就是ORM(Object Relational Mapping,对象关系映射)。
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class RunAQuery {private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}public int getCount() {
return this.jdbcTemplate.queryForObject("select count(*) from mytable", Integer.class);
}public String getName() {
return this.jdbcTemplate.queryForObject("select name from mytable", String.class);
}
}
关于JdbcTemplate 使用查看文章
JdbcTemplate详解_北航_Curry的博客-CSDN博客_jdbctemplate
Spring Boot 整合JdbcTemplate_探索er的博客-CSDN博客_springboot整合jdbctemplate
3、spring-data-jdbc(spring-boot-starter-data-jdbc) 除了基础的数据库连接功能,还额外提供了 CrudRepository ,如下所示
文章图片
@Repository public interface UserRepository extends CrudRepository{ //自定义其他方法 }
4、spring-data-jpa(spring-boot-starter-data-jpa) 5、mybatis&mybatisplus fastmybatis
fastmybatis: 一个mybatis开发框架,其宗旨为:简单、快速、有效
fastmybatis开发文档
推荐阅读
- #|深度学习笔记 —— 权重衰退 + 丢弃法
- 大数据|2021世界机器人大赛— 青少年机器人设计大赛
- 基于开源流批一体数据同步引擎ChunJun数据还原—DDL解析模块的实战分享
- JAVA|初步认识JAVA
- 数据库|围剿慢SQL,工行MySQL研发管控和治理实践
- 大数据|刚转行的运营人做哪些副业更简单,并且更赚钱()
- NOA|如何实现“轻高精地图”的城市NOH(毫末自动驾驶的8大亮点)
- 人工智能|人类高质量AI训练方式(精细化数据集管理颠覆"唯SOTA论")
- #|【系统分析师之路】2008年上系统分析师上午综合知识真题