前导博文:https://blog.csdn.net/cs_hnu_scw/article/details/80720206
情景引入:
小白:快起床快起床,起来学习起来学习~~~~
我:你能不能让我安心点,今天周末,咱们不学习,放假放假!(适当的休息还是很有用的哦,劳逸结合~!)
小白:不行,昨天不是才休息的吗?我遇到问题遇到问题了~~
我:快说,你又有什么问题?你是十万个为什么吗?
小白:我学习完你上次对我说的关于通用Mapper的内容了,并且确实相比我之前的开发编码快很多,但是,但是,我现在有个想法,我想进一步的进行优化。
我:很不错,看样子,你是有认真学习我给你讲的内容嘛。通用Mapper的配置确实是很有用的,也是用的比较多的方式之一。
小白:你看,像我原来使用过Hibernate,我觉得这样的ORM架构就非常好,它内置很多的数据层操作的API,那么有没有什么更好的方法,可以类似这样,而不需要编写mapper.xml文件的呢?感觉好麻烦。。。。。
我:这个嘛。。你的意思是说,想直接利用接口就进行数据层操作是吗?就类似通用Mapper这样的形式是么?
小白:对的对的,你真聪明。。。
我:emmmmmmm,那看在你夸我的面子上,我就教你一个新知识吧。这就是Spring Data!!!!
情景分析:
在JavaWeb开发中,不管你用什么框架,开发的什么功能项目。都存在着对于数据库的数据交互。我们可能会针对某些烦人的操作感到无聊,总想有什么好的方式进行项目的开发。是的,这确实就是我们工作中遇到的实际存在的问题。一个好的架构,对于我们编程人员来说就是一种福音,那么,我就用这篇博文来讲一种数据库交互的方式---------Spring Data!
博文目录:
一:Spring Data简介
二:传统方式的数据库访问方式-----JDBC
三:基于Spring框架数据库访问方式---------JdbcTemplate模板
四:Spring Data的入门
五:Spring Data的进阶
六:让我给你总结总结
温馨提示:本博文的环境都是基于:IDEA+windows7+Mysql 5.7
简介
Spring Data的使命是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性。
它使得使用数据访问技术,关系数据库和非关系数据库,map-reduce框架以及基于云的数据服务变得很容易。 这是一个总括项目,其中包含许多特定于特定数据库的子项目。 这些项目是通过与许多支持这些令人兴奋的技术的公司和开发人员合作开发的。 -------Spring Data官网翻译
另外,用通俗的话来说:在企业级JavaEE应用开发中,对数据库的访问和操作是必须的。Spring Data作为SpringSource的其中一个子项目,旨在统一和简化对各类型持久化存储和访问,而不拘泥于是关系型数据库还是NoSQL数据存储,使得对数据库的访问变得方便快捷,并支持MapReduce框架及云计算服务;对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便,极大提高开发效率。
传统的数据库访问方式
当我们在学习JavaWeb的初级阶段的时候,我想,大家肯定学习过一种与数据库进行交互的方式,那就是-----JDBC。是的,它是最原始的一种方式,然而,它却有着很多的不足之处。
或许,你已经忘记了JDBC是如何操作数据库的了,没关系,我就用个简单的例子,来帮助大家进行回顾。这样对于我们后续的学习还是很有帮助的。
(一)让我们来搭一搭JDBC的开发实例(IDEA编辑器+Maven+mysql)
步骤:
1:使用IDEA编辑器创建一个Maven项目,不明白的欢迎看我Maven知识点的博文
2:在pom.xml文件中添加下面的依赖(顺便配置一下下载依赖的仓库---基于之前没有配置过的朋友)
<!-- 配置阿里云仓库,要不然从中央maven库下载很慢-->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
3:新建一个文件夹resource(和java目录同级,并且创建之后记得将这个文件右击然后选择Mark Dirctory as 然后选择resource即可),用于存储相关的配置文件,这里主要是放置jdbc.properties,便于灵活性的修改数据库连接等内容。
jdbc.url = jdbc:mysql:///springdata
jdbc.username = root
jdbc.password = 123456
jdbc.driverClass = com.mysql.jdbc.Driver
4:创建JDBC获取连接和释放资源的工具类(这个还是比较有用的,方便后续操作)
package com.hnu.scw.utils;
import javax.xml.transform.Result;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @ Author :scw
* @ Date :Created in 下午 8:48 2018/6/21 0021
* @ Description:JDBC相关的工具类
* @ Modified By:
* @Version: $version$
*/
public class JDBCUtil {
/**
* 根据properties获取数据库连接
* @return
* @throws Exception
*/
public static Connection getConnection() throws Exception {
InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String url = properties.getProperty("jdbc.url");
String userName = properties.getProperty("jdbc.username");
String password = properties.getProperty("jdbc.password");
String dirverClass = properties.getProperty("jdbc.driverClass");
Class.forName(dirverClass);
Connection connection = DriverManager.getConnection(url, userName, password);
return connection;
}
/**
* 释放数据库连接的相关对象
* @param resultSet
* @param statement
* @param connection
*/
public static void release(ResultSet resultSet , Statement statement , Connection connection){
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5:在数据库中创建一个数据表,并且同时创建一个实体类(以student学生实体为例子)
表结构如下:
package com.hnu.scw.model;
/**
* @ Author :scw
* @ Date :Created in 下午 5:14 2018/6/22 0022
* @ Description:定义一个实体对象
* @ Modified By:
* @Version: $version$
*/
public class Student {
private Integer id;
private String name;
private Integer age ;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
6:编写Dao层操作数据库接口方法
package com.hnu.scw.dao;
import com.hnu.scw.model.Student;
import java.util.List;
/**
* @ Author :scw
* @ Date :Created in 下午 5:16 2018/6/22 0022
* @ Description:定义操作student的dao接口层
* @ Modified By:
* @Version: $version$
*/
public interface StudentDao {
/**
* 查询所有的学生信息
* @return
*/
List<Student> selectAllStudent();
}
7:编写Dao层接口的实现类
package com.hnu.scw.dao.impl;
import com.hnu.scw.dao.StudentDao;
import com.hnu.scw.model.Student;
import com.hnu.scw.utils.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* @ Author :scw
* @ Date :Created in 下午 5:22 2018/6/22 0022
* @ Description:${description}
* @ Modified By:
* @Version: $version$
*/
public class StudentDaoImpl implements StudentDao {
@Override
public List<Student> selectAllStudent() {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
ArrayList<Student> students = new ArrayList<>();
try {
String sql = "select * from Student ";
connection = JDBCUtil.getConnection();
statement = connection.prepareStatement(sql);
resultSet = statement.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,statement , connection);
}
return students;
}
}
8:进行jdbc方法的测试。编写单元测试类
package com.hnu.scw;
import static org.junit.Assert.assertTrue;
import com.hnu.scw.dao.StudentDao;
import com.hnu.scw.dao.impl.StudentDaoImpl;
import com.hnu.scw.model.Student;
import com.hnu.scw.utils.JDBCUtil;
import org.junit.Test;
import java.sql.Connection;
import java.util.List;
/**
* Unit test for simple App.
*/
public class JDBCTest {
/**
* 测试jdbc连接是否成功
* @throws Exception
*/
@Test
public void testConnection() throws Exception {
JDBCUtil.getConnection();
}
/**
* 测试jdbc操作数据库方法(查询所有的学生表信息)
*/
@Test
public void testQuerySQL(){
StudentDao studentDao = new StudentDaoImpl();
List<Student> students = studentDao.selectAllStudent();
for (Student s : students) {
System.out.println(s.toString());
}
}
}
温馨提示:当执行了方法之后,如果提示单元测试成功,并打印我们预期的内容的话,那就说明我们的流程是成功的了哦!
JDBC操作的总结:</