[Spring+SpringMVC+Mybatis]框架學習筆記(三):Spring實現JDBC

上一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DI
下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(四):Spring實現AOPhtml

第3章 Spring實現JDBC

利用springJdbcTemplate實現一個表的簡單的增刪改查。java

事先建表:mysql

CREATE DATABASE STUDENT;

USE STUDENT;

CREATE TABLE STUDENT(
    ID INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20) NOT NULL,
    AGE INT NOT NULL,
    SEX TINYINT(1) UNSIGNED DEFAULT 0 NOT NULL
)AUTO_INCREMENT = 100000;

INSERT INTO STUDENT(NAME,AGE,SEX) VALUES("STEVEN",31,1);
INSERT INTO STUDENT(NAME,AGE) VALUES("LUCY",28);

注入數據庫鏈接的四要素(數據庫類型、地址、用戶名、密碼):spring

  • 引入數據庫驅動包
    mysql-connector-java-5.1.39-bin.jar
    ojdbc5.jar
  • 引入spring-jdbc的jar包
    spring-jdbc-4.2.1.RELEASE.jar
    spring-tx-4.2.1.RELEASE.jar(跟事務相關)

3.1 實現方式1:配置文件方式

3.1.1 實體類

package com.steven.spring.sysmgr.entity;

import java.io.Serializable;

/**
 * 實體類
 * @author chenyang
 *
 */
public class Student implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = -3587920774423955014L;

    public Student(){
        
    }
    
    private int id;
    private String name;
    private int age;
    private int sex;
    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;
    }
    public int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
    
}

3.1.2 DAO層的接口和實現類

1)DAO接口:sql

package com.steven.spring.sysmgr.dao;

import java.util.List;
import java.util.Map;

import com.steven.spring.sysmgr.entity.Student;

public interface IStudentDao {
    
    public boolean addStudent(Student student);
    
    public boolean delStudent(Integer studentId);
    
    public boolean updateStudent(Student student);
    
    public List<Map<String, Object>> getStudentMap();
    
    public List<Student> getStudentList();
}

2)DAO接口的實現:數據庫

package com.steven.spring.sysmgr.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student;

public class StudentDao implements IStudentDao{
    
    private JdbcTemplate jdbcTemplate;
    
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public boolean addStudent(Student student) {
        boolean flag = false;
        String addSql = "INSERT INTO STUDENT(NAME,AGE,SEX) VALUES(?,?,?)";
        int rows = this.jdbcTemplate.update(addSql, student.getName(), student.getAge(), student.getSex());
        if(rows > 0){
            flag = true;
        }
        return flag;
    }

    @Override
    public boolean delStudent(Integer studentId) {
        boolean flag = false;
        String delSql = "DELETE FROM STUDENT WHERE ID = ?";
        int rows = this.jdbcTemplate.update(delSql, studentId);
        if(rows > 0){
            flag = true;
        }
        
        return flag;
    }

    @Override
    public boolean updateStudent(Student student) {
        boolean flag = false;
        String updateSql = "UPDATE STUDENT SET NAME=?, AGE=?, SEX=? WHERE ID=? ";
        int rows = this.jdbcTemplate.update(updateSql, student.getName(), student.getAge(), student.getSex(), student.getId());
        if(rows > 0){
            flag = true;
        }
        return flag;
    }

    @Override
    public List<Map<String, Object>> getStudentMap() {
        return this.jdbcTemplate.queryForList("SELECT ID,NAME,AGE,SEX FROM STUDENT");
    }

    @Override
    public List<Student> getStudentList() {
        String querySql = "SELECT ID, NAME, AGE, SEX FROM STUDENT";
        //第1種方式:用接口的匿名內部類來實現,優勢:能夠根據需求作二次改造
        /*return this.jdbcTemplate.query(querySql, new RowMapper<Student>(){

            @Override
            public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
                Student student = new Student();
                student.setId(rs.getInt("ID"));
                student.setName(rs.getString("NAME"));
                student.setAge(rs.getInt("AGE"));
                student.setSex(rs.getInt("SEX"));
                return student;
            }
            
        });*/
        
        //第2種方式:直接將行結果集映射到實體類中,優勢:簡便
        return this.jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Student>(Student.class));
        
    }
}

3.1.3 服務層的接口和實現類

1)服務類接口:apache

package com.steven.spring.sysmgr.service;

import java.util.List;
import java.util.Map;

import com.steven.spring.sysmgr.entity.Student;

public interface IStudentService {
    
    public boolean addStudent(Student student);
    
    public boolean delStudent(Integer studentId);
    
    public boolean updateStudent(Student student);
    
    public List<Map<String, Object>> getStudentMap();
    
    public List<Student> getStudentList();
}

2)服務類接口的實現,它依賴於IStudentDao:app

package com.steven.spring.sysmgr.service.impl;

import java.util.List;
import java.util.Map;

import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student;
import com.steven.spring.sysmgr.service.IStudentService;

public class StudentService implements IStudentService{

    private IStudentDao studentDao;
    
    public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    public boolean addStudent(Student student) {
        // TODO Auto-generated method stub
        return this.studentDao.addStudent(student);
    }

    @Override
    public boolean delStudent(Integer studentId) {
        // TODO Auto-generated method stub
        return this.studentDao.delStudent(studentId);
    }

    @Override
    public boolean updateStudent(Student student) {
        // TODO Auto-generated method stub
        return this.studentDao.updateStudent(student);
    }

    @Override
    public List<Map<String, Object>> getStudentMap() {
        // TODO Auto-generated method stub
        return this.studentDao.getStudentMap();
    }

    @Override
    public List<Student> getStudentList() {
        // TODO Auto-generated method stub
        return this.studentDao.getStudentList();
    }

}

3.1.4 spring-IOC的配置文件

spring-IOC的配置文件applicationContext.xml:利用SpringIOC實現服務類和DAO類的依賴框架

<?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="studentService" class="com.steven.spring.sysmgr.service.impl.StudentService">
        <property name="studentDao" ref="studentDao"/>
    </bean>
    
    <!-- 註冊DAO類 -->
    <bean id="studentDao" class="com.steven.spring.sysmgr.dao.impl.StudentDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>
    
    <!-- 註冊springJdbc查詢模板,模板依賴於數據源 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 註冊spring自帶的管理數據庫鏈接的數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>
    
</beans>

3.1.5 測試類

package com.steven.spring.sysmgr.test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.steven.spring.sysmgr.entity.Student;
import com.steven.spring.sysmgr.service.IStudentService;

public class SpringJdbcTest {
    private ApplicationContext ac;
    
    @Before
    public void init(){
        ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
    
    //模擬增長功能
    @Test
    public void testAddStudent(){
        IStudentService studentService = (IStudentService) ac.getBean("studentService");

        Student student = new Student();
        student.setName("Jacky");
        student.setAge(35);
        student.setSex(1);
        
        System.out.println(studentService.addStudent(student));
        
    }
    
    //模擬刪除功能
    @Test
    public void testDelStudent(){
        IStudentService studentService = (IStudentService) ac.getBean("studentService");
        
        int delStudentId = 100000;
        
        System.out.println(studentService.delStudent(delStudentId));
        
    }
    
    //模擬更改功能
    @Test
    public void testUpdateStudent(){
        IStudentService studentService = (IStudentService) ac.getBean("studentService");
        
        Student student = new Student();
        student.setId(100001);
        student.setName("Lily");
        student.setAge(26);
        student.setSex(0);
        
        System.out.println(studentService.updateStudent(student));
        
    }
    
    //模擬查詢功能,返回List<Student>
    @Test
    public void testGetStudentList(){
        IStudentService studentService = (IStudentService) ac.getBean("studentService");
        System.out.println(studentService.getStudentList());
    }
    
    //模擬查詢功能,返回List<Map<String, object>>
    @Test
    public void testGetStudentMap(){
        IStudentService studentService = (IStudentService) ac.getBean("studentService");
        System.out.println(studentService.getStudentMap());
    }
}

3.2 實現方式2:註解方式

一、在服務層接口實現類(@Service(...))和Dao層接口實現類(@Repository(...))中分別加入註解表示符,並聲明依賴關係(@Autowired)ide

1)DAO的實現類

package com.steven.spring.sysmgr.dao.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student;

@Repository("studentDao")
public class StudentDao implements IStudentDao{
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public boolean addStudent(Student student) {
        boolean flag = false;
        String addSql = "INSERT INTO STUDENT(NAME,AGE,SEX) VALUES(?,?,?)";
        int rows = this.jdbcTemplate.update(addSql, student.getName(), student.getAge(), student.getSex());
        if(rows > 0){
            flag = true;
        }
        return flag;
    }

    @Override
    public boolean delStudent(Integer studentId) {
        boolean flag = false;
        String delSql = "DELETE FROM STUDENT WHERE ID = ?";
        int rows = this.jdbcTemplate.update(delSql, studentId);
        if(rows > 0){
            flag = true;
        }
        
        return flag;
    }

    @Override
    public boolean updateStudent(Student student) {
        boolean flag = false;
        String updateSql = "UPDATE STUDENT SET NAME=?, AGE=?, SEX=? WHERE ID=? ";
        int rows = this.jdbcTemplate.update(updateSql, student.getName(), student.getAge(), student.getSex(), student.getId());
        if(rows > 0){
            flag = true;
        }
        return flag;
    }

    @Override
    public List<Map<String, Object>> getStudentMap() {
        return this.jdbcTemplate.queryForList("SELECT ID,NAME,AGE,SEX FROM STUDENT");
    }

    @Override
    public List<Student> getStudentList() {
        String querySql = "SELECT ID, NAME, AGE, SEX FROM STUDENT";
        //第1種方式:用接口的匿名內部類來實現,優勢:能夠根據需求作二次改造
        /*return this.jdbcTemplate.query(querySql, new RowMapper<Student>(){

            @Override
            public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
                Student student = new Student();
                student.setId(rs.getInt("ID"));
                student.setName(rs.getString("NAME"));
                student.setAge(rs.getInt("AGE"));
                student.setSex(rs.getInt("SEX"));
                return student;
            }
            
        });*/
        
        //第2種方式:直接將行結果集映射到實體類中,優勢:簡便
        return this.jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Student>(Student.class));
        
    }
}

2)服務層的實現類

package com.steven.spring.sysmgr.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student;
import com.steven.spring.sysmgr.service.IStudentService;

@Service("studentService")
public class StudentService implements IStudentService{
    @Autowired
    private IStudentDao studentDao;
    
    public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    public boolean addStudent(Student student) {
        // TODO Auto-generated method stub
        return this.studentDao.addStudent(student);
    }

    @Override
    public boolean delStudent(Integer studentId) {
        // TODO Auto-generated method stub
        return this.studentDao.delStudent(studentId);
    }

    @Override
    public boolean updateStudent(Student student) {
        // TODO Auto-generated method stub
        return this.studentDao.updateStudent(student);
    }

    @Override
    public List<Map<String, Object>> getStudentMap() {
        // TODO Auto-generated method stub
        return this.studentDao.getStudentMap();
    }

    @Override
    public List<Student> getStudentList() {
        // TODO Auto-generated method stub
        return this.studentDao.getStudentList();
    }

}

二、在配置文件中進行加入約束和掃描包

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 掃描包 -->
    <context:component-scan base-package="com.steven.spring.sysmgr"></context:component-scan>
    
    <!-- 註冊springJdbc查詢模板,模板依賴於數據源 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 註冊spring自帶的管理數據庫鏈接的數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>
</beans>

3.3 實現方式3:Dao實現類繼承JdbcDaoSupport

在Dao接口實現裏,不用引入JdbcTemplate的接口,而是繼承JdbcDaoSupport。由於JdbcDaoSupport類引入了JdbcTemlate。

使用這種方式時,能夠不用注入jdbcTemplate,即dao實現類直接依賴於dataSource。由於在類JdbcDaoSupport中會實例化JdbcTemplate。

<?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="studentService" class="com.steven.spring.sysmgr.service.impl.StudentService">
        <property name="studentDao" ref="studentDao"/>
    </bean>
    
    <!-- 註冊DAO類: 當Dao實現類繼承了JdbcDaoSupport,能夠直接注入dataSource-->
    <bean id="studentDao" class="com.steven.spring.sysmgr.dao.impl.StudentDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 註冊spring自帶的管理數據庫鏈接的數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>
</beans>

3.4 實現方式4:利用properties配置文件方式

一、在src根目錄下新建一個配置文件jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/student
jdbc.user=root
jdbc.password=123

二、讓spring加載配置文件

1)加載properties配置文件內容

方式1:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:jdbc.properties"/>
</bean>

方式2:

首先在xml配置文件中引入context頭文件標籤。

<context:property-placeholder location="classpath:jdbc.properties"/>

2)將dataSource的bean標籤更改成:

<!-- 註冊spring自帶的管理數據庫鏈接的數據源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

3.5 實現方式5:c3p0數據源鏈接池

1)引入c3p0數據鏈接池的jar包:c3p0-0.9.0.jar

2)xml配置文件數據源鏈接部分改成(注意不一樣點):

<!-- 註冊c3p0數據源鏈接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

3.6 實現方式6:dbcp數據源鏈接池

1)引入dbcp數據源鏈接池(Apache公司)須要的jar包
commons-dbcp-1.4.jar
commons-pool-1.6.jar

2)xml配置文件數據源鏈接部分改成(注意不一樣點):

<!-- 註冊dbcp數據源鏈接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

上一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DI
下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(四):Spring實現AOP

相關文章
相關標籤/搜索