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
        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

注:本文部分内容来自慕课网

你可能感兴趣的:(Spring Data上---使用传统方式开发)