Spring Data上---使用傳統方式開發
Spring Data上---使用傳統方式開發
一、什麼是Spring Data
主旨:provide a familiar and consistent,Spring-based programming model for data access
簡化資料庫的訪問。減少資料訪問層的開發量
網址: https://spring.io/projects/spring-data

springdata概覽.jpg
二、Spring Data應用場景
Spring Data包含多個子專案:
- Spring Data JPA
- Spring Data Mongo DB
- Spring Data Redis
- Spring Data Solr
- ...
三、使用傳統方式訪問資料庫
1.使用JDBC
①建立maven專案

建立maven專案1.png

maven2.png

maven3.png

maven4.png
②新增依賴
<!--MySQL Driver--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency>
③建立資料庫
create database spring_data; create table student( id int not null auto_increment, name varchar(20) not null, age int not null, primary key(id) ); insert into student(name,age) values("zhangsan",20); insert into student(name,age) values("lisi",20); insert into student(name,age) values("wangwu",20);
④編碼:
JDBC工具類:
package com.hcx.util; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * JDBC工具類 * 1.獲取連線 * 2.釋放資源 * Created by HCX on 2019/3/9. */ public class JDBCUtil { /** * 獲取Connection * @return 所獲得到的JDBC的Connection */ public static Connection getConnection() throws Exception { /*String url = "jdbc:mysql://localhost:3306/spring_data"; String user = "root"; String password = "root"; String driverClass = "com.mysql.jdbc.Driver";*/ InputStream inputStream = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(inputStream); 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); Connection connection = DriverManager.getConnection(url, user, password); return connection; } /** * 釋放DB相關的資源 * @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(); } } } }
db.properties:
jdbc.url = jdbc:mysql://localhost:3306/spring_data jdbc.user = root jdbc.password = root jdbc.driverClass = com.mysql.jdbc.Driver
Student實體:
package com.hcx.domain; /** * Student實體類 * Created by HCX on 2019/3/10. */ public class Student { //主鍵 private int id; //姓名 private String name; //年齡 private int 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; } }
StudentDAO:
package com.hcx.dao; import com.hcx.domain.Student; import java.util.List; /** * StudentDAO訪問介面 * Created by HCX on 2019/3/10. */ public interface StudentDAO { /** * 查詢所有學生 * @return所有學生 */ public List<Student> query(); /** * 新增一個學生 * @param student 待新增的學生 */ public void save(Student student); }
StudentDAOImpl:
package com.hcx.dao; import com.hcx.domain.Student; import com.hcx.util.JDBCUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; /** * StudentDAO訪問介面實現類:通過最原始的JDBC的方式操作 * Created by HCX on 2019/3/10. */ public class StudentDAOImpl implements StudentDAO { @Override public List<Student> query() { List<Student> students = new ArrayList<Student>(); 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; } @Override public void save(Student student) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "insert into student(name,age) values(?,?)"; try { connection = JDBCUtil.getConnection(); preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,student.getName()); preparedStatement.setInt(2,student.getAge()); preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtil.release(resultSet,preparedStatement,connection); } } }
單元測試:
DataSourceTest:
package com.hcx.util; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.Assert; import javax.sql.DataSource; /** * Created by HCX on 2019/3/10. */ public class DataSourceTest { private ApplicationContext ctx = null; @Before public void setup(){ ctx = new ClassPathXmlApplicationContext("beans.xml"); System.out.println("setup"); } @After public void tearDown(){ ctx = null; System.out.println("tearDown"); } @Test public void testDataSource(){ DataSource dataSource = (DataSource) ctx.getBean("dataSource"); Assert.notNull(dataSource); } @Test public void testJdbcTemplate(){ System.out.println("testJdbcTemplate"); JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); Assert.notNull(jdbcTemplate); } }
JDBCUtilTest:
package com.hcx.util; import org.junit.Assert; import org.junit.Test; import java.sql.Connection; import static org.junit.Assert.*; /** * Created by HCX on 2019/3/9. */ public class JDBCUtilTest { @Test public void testGetConnection() throws Exception { Connection connection = JDBCUtil.getConnection(); Assert.assertNotNull(connection); } @Test public void testRelease() throws Exception { } }
2.使用Spring JDBCTemplate
Maven依賴:
<!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.0.RELEASE</version> </dependency>
DataSource和JdbcTemplate注入
beans.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://localhost:3306/spring_data"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="studentDAO" class="com.hcx.dao.StudentDAOSpringJdbcImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> </beans>
springjdbc版本的query和save方法:
StudentDAOSpringJdbcImpl:
package com.hcx.dao; import com.hcx.domain.Student; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * StudentDAO訪問介面實現類:通過SpringJDBCTemplate的方式 * Created by HCX on 2019/3/10. */ public class StudentDAOSpringJdbcImpl implements StudentDAO { private JdbcTemplate jdbcTemplate; @Override public List<Student> query() { final List<Student> students = new ArrayList<Student>(); String sql = "select id,name,age from student"; jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet resultSet) throws SQLException { 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); } }); return students; } @Override public void save(Student student) { String sql = "insert into student(name,age) values(?,?)"; jdbcTemplate.update(sql,new Object[]{student.getName(),student.getAge()}); } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }
單元測試:
StudentDAOImplTest:
package com.hcx.dao; import com.hcx.domain.Student; import org.junit.Test; import java.util.List; import static org.junit.Assert.*; /** * Created by HCX on 2019/3/10. */ public class StudentDAOImplTest { @Test public void testQuery() throws Exception { StudentDAO studentDAO = new StudentDAOImpl(); List<Student> students = studentDAO.query(); for (Student student : students) { System.out.println("id:" + student.getId() + " ,name:" + student.getName() + " ,age:" + student.getAge()); } } @Test public void testSave(){ StudentDAO studentDAO = new StudentDAOImpl(); Student student = new Student(); student.setName("test"); student.setAge(60); studentDAO.save(student); } }
StudentDAOSpringJdbcImplTest:
package com.hcx.dao; import com.hcx.domain.Student; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; import static org.junit.Assert.*; /** * Created by HCX on 2019/3/10. */ public class StudentDAOSpringJdbcImplTest { private ApplicationContext ctx = null; private StudentDAO studentDAO = null; @Before public void setup(){ ctx = new ClassPathXmlApplicationContext("beans.xml"); studentDAO = (StudentDAO) ctx.getBean("studentDAO"); System.out.println("setup"); } @After public void tearDown(){ ctx = null; System.out.println("tearDown"); } @Test public void testQuery() throws Exception { List<Student> students = studentDAO.query(); for (Student student : students) { System.out.println("id:" + student.getId() + " ,name:" + student.getName() + " ,age:" + student.getAge()); } } @Test public void testSave() throws Exception { Student student = new Student(); student.setName("testSpringJDBC"); student.setAge(80); studentDAO.save(student); } @Test public void testGetJdbcTemplate() throws Exception { } @Test public void testSetJdbcTemplate() throws Exception { } }
3.對比分析
①不夠簡潔
②重複程式碼多
③要開發其他功能,比如分頁等還需要重新封裝。
Demo連線: https://github.com/GitHongcx/springdataDemo
注:本文部分內容來自慕課網