一.導學
什麼是SpringData?
- 主旨:提供一個熟悉的、一致的,基於Spring框架的數據訪問框架。
- 簡化數據庫的訪問
- 官網 https://spring.io/projects/spring-data
- Spring Data包含多個子項目
- Spring Data JPA:減少我們數據訪問層的開發量
- Spring Data Mongo DB
- Spring Data Redis
- Spring Data Solr
二.使用傳統方式訪問數據庫
- 使用JDBC訪問數據庫
- 使用Spring提供的JdbcTemplate訪問數據庫
1.使用JDBC訪問數據庫
- 創建一個maven項目,導入依賴
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 數據庫驅動依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 單元測試依賴 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
- 開發JDBCUtil工具類
- 獲取Connection
- 關閉Connection、Statement、ResultSet
public class JDBCUtils {
public static Connection getConnection() throws Exception {
//不建議這種硬編碼
/*
String url = "jdbc:mysql:///springdata";
String user = "root";
String password = "123456";
String driverClass = "com.mysql.jdbc.Driver";*/
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
String url = properties.getProperty("jdbc.url");
String user = properties.getProperty("jdbc.user");
String password = properties.getProperty("jdbc.password");
String driverClass = properties.getProperty("jdbc.driverClass");
Class.forName(driverClass);
return DriverManager.getConnection(url,user,password);
}
public static void release(Connection connection, Statement statement, ResultSet resultSet){
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- db.properties
jdbc.url=jdbc:mysql:///springdata
jdbc.user=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
- 對象模型(實體類)
- 創建一個student表(id,name,age)
- id爲主鍵 自增
public class Student {
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- DAO接口
public interface StudentDao {
//查詢所有的學生信息
List<Student> findAll();
//添加一個學生
void save(Student student);
}
- DAO實現類
public class StudentDaoImpl implements StudentDao {
public List<Student> findAll() {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<Student> students = new ArrayList<Student>();
String sql = "select *from student";
try {
connection = JDBCUtils.getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
Student student = new Student();
student.setId(id);
student.setName(name);
student.setAge(age);
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(connection,statement,resultSet);
}
return students;
}
public void save(Student student) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = "insert into student(name,age) values (?,?)";
try {
connection = JDBCUtils.getConnection();
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,student.getName());
preparedStatement.setInt(2,student.getAge());
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(connection,preparedStatement,resultSet);
}
}
}
- DAO接口測試類
public class StudentDaoImplTest {
@Test
public void findAllTest(){
StudentDao studentDao = new StudentDaoImpl();
List<Student> students = studentDao.findAll();
for(Student student:students){
System.out.println(student);
}
}
@Test
public void save(){
StudentDao studentDao = new StudentDaoImpl();
Student student = new Student();
student.setName("test1");
student.setAge(19);
studentDao.save(student);
}
}
2.使用Spring提供的JdbcTemplate訪問數據庫
- 添加依賴
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- spring context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
- 創建配置文件類(視頻中用的是xml配置 這裏我改用註解)
- 配置DataSource、JdbcTemplate和Spring註解掃描
@Configuration //申明爲配置類
@ComponentScan("com.playmaker") //掃描這個包下的
public class SpringConfig {
@Autowired
private SpringJdbcProperties springJdbcProperties;
@Bean
public DriverManagerDataSource getDriverManagerDataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(springJdbcProperties.getDriverClass());
driverManagerDataSource.setUrl(springJdbcProperties.getUrl());
driverManagerDataSource.setUsername(springJdbcProperties.getUser());
driverManagerDataSource.setPassword(springJdbcProperties.getPassword());
return driverManagerDataSource;
}
@Bean
public JdbcTemplate getJdbcTemplate(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(getDriverManagerDataSource());
return jdbcTemplate;
}
}
- 上面這段相當於xml中這樣配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="url" value="jdbc:mysql:///spring_data"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
@PropertySource(value = "classpath:db.properties") //位置
@Component
public class SpringJdbcProperties {
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.user}")
private String user;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.driverClass}")
private String driverClass;
@Override
public String toString() {
return "SpringJdbcProperties{" +
"url='" + url + '\'' +
", user='" + user + '\'' +
", password='" + password + '\'' +
", driverClass='" + driverClass + '\'' +
'}';
}
public String getUrl() {
return url;
}
public String getUser() {
return user;
}
public String getPassword() {
return password;
}
public String getDriverClass() {
return driverClass;
}
}
- DAO接口實現
@Repository//讓Spring創建UserDaoImpl實例,相當於在配置文件去配置bean一樣,這裏也可以設置名字
public class StudentDaoSpringJdbcImpl implements StudentDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Student> findAll() {
List<Student> students = new ArrayList<Student>();
String sql = "select id,name,age from student";
List<Map<String,Object>> list_map = jdbcTemplate.queryForList(sql);
for(Map<String,Object> map:list_map){
int id = Integer.valueOf(map.get("id").toString());
String name = String.valueOf(map.get("name"));
int age = Integer.valueOf(map.get("age").toString());
Student student = new Student();
student.setId(id);
student.setName(name);
student.setAge(age);
students.add(student);
}
return students;
}
public void save(Student student) {
String sql = "insert into student(name,age) values(?,?)";
jdbcTemplate.update(sql,new Object[]{student.getName(),student.getAge()});
}
}
- DAO接口測試類
public class StudentDaoSpringJdbcImplTest {
private ApplicationContext applicationContext = null;
private StudentDao studentDao ;
@Before
public void init(){
applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
studentDao = applicationContext.getBean(StudentDao.class);
System.out.println("init...");
}
@After
public void destroy(){
applicationContext=null;
System.out.println("destroy...");
}
@Test
public void findAllTest(){
List<Student> students = studentDao.findAll();
for(Student student:students){
System.out.println(student);
}
}
@Test
public void save(){
Student student = new Student();
student.setName("test1");
student.setAge(19);
studentDao.save(student);
}
}
- 弊端分析
無論是原始JDBC連接數據庫還是Spring提供的JdbcTemplate來處理,DAO裏面代碼量太多,DAO的實現有很多重複代碼,如果你想實現更復雜的分頁功能之類的,還需要寫更大量的代碼,學習了Spring data你就會知道它的強大了