SpringData入門(一)-使用傳統方式訪問數據庫

一.導學

什麼是SpringData?

在這裏插入圖片描述

  • 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你就會知道它的強大了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章