Spring Data上---使用传统方式开发
一、什么是Spring Data
主旨:provide a familiar and consistent,Spring-based programming model for data access
简化数据库的访问。减少数据访问层的开发量
网址:https://spring.io/projects/spring-data
二、Spring Data应用场景
Spring Data包含多个子项目:
- Spring Data JPA
- Spring Data Mongo DB
- Spring Data Redis
- Spring Data Solr
- ...
三、使用传统方式访问数据库
1.使用JDBC
①创建maven项目
②添加依赖
mysql
mysql-connector-java
5.1.38
junit
junit
4.10
③创建数据库
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 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 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;
}
@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依赖:
org.springframework
spring-jdbc
4.3.5.RELEASE
org.springframework
spring-context
4.2.0.RELEASE
DataSource和JdbcTemplate注入
beans.xml:
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 query() {
final List students = new ArrayList();
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 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 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
注:本文部分内容来自慕课网