使用JDBC开源库的API

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。

步骤:

1、 添加依赖

2、创建JdbcTemplate对象。依赖于数据源DataSource

*JdbcTemplate template = new JdbcTemplate(ds);

3、调用JdbcTemplate的方法来完成CRUD的操作

*update():执行DML语句。增、删、改语句。

* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合。

  注意:这个方法查询的结果集长度只能是1

*queryForList():查询结果将结果集封装为list集合。

  注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

*query():查询结果,将结果封装为JavaBean对象。

  query的参数:RowMapper

  一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装

  newBeanPropertyRowMapper<类型>(类型.class)

*queryForObject:查询结果,将结果封装为对象。

* 需求:
1)、修改1号数据的 salary 为 10000
2)、添加一条记录
3)、删除刚才添加的记录
4)、查询id为1的记录,将其封装为Map集合
5)、查询所有记录,将其封装为List
6)、查询所有记录,将其封装为Emp对象的List集合
7)、查询总记录数

druid.properties

driverClassName=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3308/jdbcTemplate?useSSL=false&serverTimezone=UTC
username=root
password=12345678
initialSize=5
maxActive=10
maxWait=3000

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Druid
连接池的工具类
 */

public class JDBCUtils {

    //1.定义成员变量 DataSource
    
private static DataSource ds ;

    static{
        try {
            //1.加载配置文件
            
Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            
ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 
获取连接
     */
    
public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 
释放资源
     */
    
public static void close(Statement stmt,Connection conn){
       /* if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();//
归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }*/

        
close(null,stmt,conn);
    }


    public static void close(ResultSet rs , Statement stmt, Connection conn){


        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();//归还连接
            
} catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 
获取连接池方法
     */

    
public static DataSource getDataSource(){
        return  ds;
    }

}

//--------------------------

import java.util.Date;

public class Emp {
    private Integer id;
    private String ename;
    private Integer job_id;
    private Integer mgr;
    private Date joindate;
    private Double salary;
    private Double bonus;
    private Integer dept_id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public Integer getJob_id() {
        return job_id;
    }

    public void setJob_id(Integer job_id) {
        this.job_id = job_id;
    }

    public Integer getMgr() {
        return mgr;
    }

    public void setMgr(Integer mgr) {
        this.mgr = mgr;
    }

    public Date getJoindate() {
        return joindate;
    }

    public void setJoindate(Date joindate) {
        this.joindate = joindate;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Double getBonus() {
        return bonus;
    }

    public void setBonus(Double bonus) {
        this.bonus = bonus;
    }

    public Integer getDept_id() {
        return dept_id;
    }

    public void setDept_id(Integer dept_id) {
        this.dept_id = dept_id;
    }
}

//-----------------------------------

import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

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

public class JdbcTemplateDemo2 {
    //1. 获取JDBCTemplate对象
    
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    /**
     * 1. 
添加一条记录
     */
    
@Test
    public void test2() {
        String sql = "insert into emp(id,ename,dept_id) values(null,?,?)";
        int count = template.update(sql,  "郭靖", 10);
        System.out.println(count);

    }

    @Test
    public void test3() {
        String sql = "delete from emp where id = ?";
        int count = template.update(sql, 1015);
        System.out.println(count);
    }


    /**
     * 4.
查询id为1001的记录,将其封装为Map集合
     * 注意:这个方法查询的结果集长度只能是1
     */
    
@Test
    public void test4() {
        String sql = "select * from emp where id = ?";
        Map<String, Object> map = template.queryForMap(sql, 1016);
        System.out.println(map);
        //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}

    
}


    /**
     * 5. 
查询所有记录,将其封装为List
     */
    
@Test
    public void test5() {
        String sql = "select * from emp";
        List<Map<String, Object>> list = template.queryForList(sql);

        for (Map<String, Object> stringObjectMap : list) {
            System.out.println(stringObjectMap);
        }
    }

    /**
     * 6. 
查询所有记录,将其封装为Emp对象的List集合
     */
    
@Test
    public void test6() {
        String sql = "select * from emp";
        List<Emp> list = template.query(sql, new RowMapper<Emp>() {

            @Override
            public Emp mapRow(ResultSet rs, int i) throws SQLException {
                Emp emp = new Emp();
                int id = rs.getInt("id");
                String ename = rs.getString("ename");
                int job_id = rs.getInt("job_id");
                int mgr = rs.getInt("mgr");
                Date joindate = rs.getDate("joindate");
                double salary = rs.getDouble("salary");
                double bonus = rs.getDouble("bonus");
                int dept_id = rs.getInt("dept_id");

                emp.setId(id);
                emp.setEname(ename);
                emp.setJob_id(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDept_id(dept_id);

                return emp;
            }
        });


        for (Emp emp : list) {
            System.out.println(emp.getEname());
        }
    }

//    一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
    
@Test
    public void test6_2() {

        String sql = "select * from emp";
        List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
}

----------------------------------------------------------

JdbcTemplate是什么】

  • JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。
  • Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
  • 常用方法
    • execute方法:可以用于执行任何SQL语句,一般用于执行DDL(数据库模式定义语言)语句;
    • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
    • query方法及queryForXXX方法:用于执行查询相关语句;

【为什么要使用jdbctemplate】

如果直接使用JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等一系列的动作,繁琐且代码看起来不直观。而使用 jdbctemplate 则无需关注加载驱动、释放资源、异常处理等一系列操作,我们只需要提供 sql 语句并且提取最终结果即可,大大方便我们编程开发。此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值、赋值等操作,提高开发效率;

【jdbctemplate常用方法】

jdbcTemplate主要提供的5类方法及使用:

(1)execute() 方法:可以执行任何SQL语句,一般用于执行DDL语句。

(2)update(sqlStr, 参数列表) 方法:用于执行新增、修改、删除等语句。

(3)batchUpdate() 方法:用于执行批处理相关语句,batchUpdate方法第二参数是一个元素为 Object[] 数组类型的 List 集合。

(4)query() 方法及 queryForXXX() 方法:用于执行查询相关语句,查询结果为基本数据类型或者是单个对象一般使用 queryForObject()

queryForInt():查询一行数据并返回 int 型结果。例子:jdbcTemplate.queryForInt("select count(*) from user")

queryForObject(sqlStr, 指定的数据类型, 参数列表):查询一行任何类型的数据,最后一个参数指定返回结果类型。例子:jdbcTemplate.queryForObject("selct count(*) from user", Integer.class)

queryForMap(sqlStr, 参数列表):查询一行数据并将该行数据转换为 Map 返回。将会将列名作为key,列值作为 value 封装成 map。当查询出来的行数大于1时会报错。例子:jdbcTemplate.queryForMap("select * from user where username = ?", "aaa");

List<Map<String, Object>> queryForList(sqlStr, 参数列表):将查询结果集封装为 list 集合,该集合的每一条元素都是一个 map。

query(sqlStr, RowMapper对象, 参数列表):查询多行数据,并将结果集封装为元素是 JavaBean 的 list。(注意,指定的JavaBean的属性最好不要是基本类型,因为查询出来的结果可能是null,而null赋值为基本数据类型将会报错。比如int最好定义为Integer)

(5)call() 方法:用于执行存储过程、函数相关语句。

2、编写代码所需的工具类JDBCUtils

  1. package com.Utils;

  2. import com.alibaba.druid.pool.DruidDataSourceFactory;

  3. import javax.sql.DataSource;

  4. import java.io.IOException;

  5. import java.sql.Connection;

  6. import java.sql.ResultSet;

  7. import java.sql.SQLException;

  8. import java.sql.Statement;

  9. import java.util.Properties;

  10. /**

  11. * 以下链接Druid的工具类

  12. */

  13. public class JDBCUtil {

  14. //创建Datasource对象

  15. private static DataSource ds;

  16. static {

  17. //创建Properties对象

  18. Properties pro = new Properties();

  19. try {

  20. pro.load(JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties"));

  21. ds=DruidDataSourceFactory.createDataSource(pro);

  22. } catch (IOException e) {

  23. e.printStackTrace();

  24. } catch (Exception e) {

  25. e.printStackTrace();

  26. }

  27. }

  28. /**

  29. * 返回链接对象

  30. */

  31. public static Connection getconnection() throws SQLException {

  32. return ds.getConnection();

  33. }

  34. /**

  35. * 关闭流

  36. */

  37. public static void close(Statement sta,Connection con){

  38. if(sta != null){

  39. try {

  40. sta.close();

  41. } catch (SQLException e) {

  42. e.printStackTrace();

  43. }

  44. }

  45. if(con !=null){

  46. try {

  47. con.close();//归还连接

  48. } catch (SQLException e) {

  49. e.printStackTrace();

  50. }

  51. }

  52. }

  53. /**

  54. * 关闭三个流

  55. */

  56. public static void close(ResultSet rs,Statement sta,Connection con){

  57. if(rs !=null){

  58. try {

  59. rs.close();

  60. } catch (SQLException e) {

  61. e.printStackTrace();

  62. }

  63. }

  64. if(sta !=null){

  65. try {

  66. sta.close();

  67. } catch (SQLException e) {

  68. e.printStackTrace();

  69. }

  70. }

  71. if(con !=null){

  72. try {

  73. con.close();//归还连接

  74. } catch (SQLException e) {

  75. e.printStackTrace();

  76. }

  77. }

  78. }

  79. /**

  80. * 获取数据源

  81. */

  82. public static DataSource getDatasource(){

  83. return ds;

  84. }

  85. }

3、编写JDBCTemplate基本程序

  1. package com.Jdbctemplate;

  2. import com.Utils.JDBCUtil;

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

  4. /**

  5. * 以下程序是使用Jdbctemplate初级方法

  6. */

  7. public class test {

  8. public static void main(String[] args) {

  9. //1、导入5个Jar包

  10. //2、新建对象

  11. JdbcTemplate jdbc = new JdbcTemplate(JDBCUtil.getDatasource());

  12. //3、编写sql语句

  13. String sql = "update student set age = 20 where name=?";

  14. //4、执行修改语句

  15. int count = jdbc.update(sql, "大王");

  16. //5、打印输出

  17. System.out.println(count);

  18. }

  19. }

4、运行程序,数字1代表成功
 

图片




【------补充资料----】
JdbcTemplate入门 - 代码先锋网(JDBCTemplate的使用 开始学习啦)
https://www.cnblogs.com/zwh0910/p/15708453.html


CREATE TABLE `emp`  (

  •   `id` int(0) NOT NULL AUTO_INCREMENT,
  •   `ename` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  •   `job_id` int(0) NULL DEFAULT NULL,
  •   `mgr` int(0) NULL DEFAULT NULL,
  •   `joindate` datetime(0) NULL DEFAULT NULL,
  •   `salary` double(10, 2) NULL DEFAULT NULL,
  •   `bonus` double(10, 2) NULL DEFAULT NULL,
  •   `dept_id` int(0) NULL DEFAULT NULL,
  •   PRIMARY KEY (`id`) USING BTREE
  • ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

【--------如果不需要jar包,依赖文件按开始------】

<dependencies>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-jdbc</artifactId>

            <version>4.2.5.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-tx</artifactId>

            <version>4.2.5.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-core</artifactId>

            <version>4.2.5.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-beans</artifactId>

            <version>4.2.5.RELEASE</version>

        </dependency>

        <!-- 连接到mysql -->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>8.0.22</version>

        </dependency>

        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>druid</artifactId>

            <version>1.2.1</version>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <version>1.18.8</version>

        </dependency>

    </dependencies>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值