JDBC(Java DataBase Connectivity)

1 JDBC

1.1 JDBC的基本概念

JDBC(Java DataBase Connectivity)是官方(sun公司)定义的一套操作所有关系型数据库的规则,它由一组用Java语言编写的类和接口组成,各个数据库厂商去实现这套接口,提供数据库驱动jar包。

1.2 JDBC的基本实现

package com.hc.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo01 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        try {
            // 1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2.获取数据库连接对象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/s_t?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT", "root", "****");
            // 3.定义sql语句
            // String sql = "update student set Sage = 30 where Sno = '201215121'";
            // String sql = "update student set Sage = 19";
            String sql = "insert into student values ('201215126','黄P','男','23','CS')";
            // 4.获取执行sql的对象 Statement
            statement = connection.createStatement();
            // 5.执行sql
            int flag = statement.executeUpdate(sql);
            // 6.处理结果
            System.out.println(flag);
            if (flag > 0) {
                System.out.println("操作成功!");
            } else {
                System.out.println("操作失败!");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7.释放资源
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

1.3 JDBC中的基本对象

1.3.1 DriverManager

  • 注册驱动,告诉程序使用哪一个数据库驱动jar包。
    DriverManager类中的static void registerDriver(Driver driver)负责注册。然而,1.2中似乎并未调用该方法,通过查看源码发现:在com.mysql.cj.jdbc.Driver类中存在静态代码块如下:
static {
	try {
			java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
}

可以看出,Class.forName("com.mysql.cj.jdbc.Driver");即在进行驱动的注册,mysql 5之后的驱动jar包可以省略注册驱动的步骤。

  • 获取数据库连接对象。
    DriverManager类中的static Connection getConnection(String url, String user, String password) 负责获取数据库的连接。参数规则如下:
    url:指定连接的路径,语法jdbc:mysql://ip地址(域名):端口号/数据库名称,例如,jdbc:mysql://localhost:3306/s_t。当然,如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
    user:用户名
    password:密码

1.3.2 Connection

  • 获取执行sql 的对象。
    Connection类中存在两个执行sql的对象,具体为Statement createStatement()PreparedStatement prepareStatement(String sql)
  • 事务管理。
    开启事务:setAutoCommit(boolean autoCommit) ,调用该方法设置参数为false,即开启事务
    提交事务:commit()
    回滚事务:rollback()

1.3.3 Statement

Statement执行sql的对象:

  • boolean execute(String sql) :可以执行任意的sql
  • int executeUpdate(String sql) :执行DMLinsertupdatedelete)语句、DDL(createalterdrop)语句。(返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功,返回值 > 0的则执行成功,反之,则失败)
  • ResultSet executeQuery(String sql) :执行DQLselect)语句

1.3.4 PreparedStatement

PreparedStatement对象是为了解决SQL注入问题,SQL注入问题是指在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题,例如:sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
解决方法:预编译的SQL:参数使用?作为占位符。例如,select * from user where username = ? and password = ?;

1.3.5 ResultSet

ResultSet:结果集对象,封装查询结果

  • boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
  • getXxx(参数):获取数据。Xxx:代表数据类型。例如:int getInt()String getString()
    int:代表列的编号,从1开始,如: getString(1)
    String:代表列名称。 如:getDouble("balance")
    实验步骤如下:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据

//循环判断游标是否是最后一行末尾。
while(rs.next()){
	//获取数据
	int id = rs.getInt(1);
	String name = rs.getString("name");
	double balance = rs.getDouble(3);
	System.out.println(id + "---" + name + "---" + balance);
}

2 JDBC连接池

关于连接池的概念和引入看

2.1 C3P0连接池

  • ① 定义配置文件c3p0-config.xml,放置在src目录下即可
<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/s_t?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">10</property>
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0"> 
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>
  • ② 测试
package com.hc.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Demo {
    public static void main(String[] args) throws SQLException {
        // 1.创建数据库连接池对象
        DataSource dataSource = new ComboPooledDataSource();
        // 2. 获取连接对象,并测试其最大连接个数
        for (int i = 1; i <= 11; i++) {
            Connection connection = dataSource.getConnection();
            System.out.println(connection);

            if (i == 5)
                connection.close();
        }
    }
}

2.2 Druid连接池

下面采取封装工具类的方式实现Druid连接池:

  • ① 定义配置文件,放置src或其他目录都可
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/s_t?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
username=root
password=1234
initialSize=5
maxActive=10
maxWait=3000
  • ② 定义工具类
package com.hc.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class JDBCUtils {

    private static DataSource dataSource;

    static {
        try {
            Properties properties = new Properties();
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(is);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void close(Connection conn,Statement stat){
        close(conn,stat,null);
    }

    public static void close(Connection conn, Statement stat, ResultSet resu){

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

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

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

    public static DataSource getDataSource(){
        return dataSource;
    }
}

  • ③ 测试
package com.hc.datasource.druid;

import com.hc.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DruidUtilsTest {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement prep = null;

        try {
            conn = JDBCUtils.getConnection();
            String sql = "insert into student values(?,?,?,?,?)";
            prep = conn.prepareStatement(sql);
            prep.setString(1, "201215129");
            prep.setString(2, "皇城");
            prep.setString(3, "女");
            prep.setInt(4, 23);
            prep.setString(5, "CS");

            int res = prep.executeUpdate();
            System.out.println(res);

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(conn, prep);
        }

    }
}

3 Spring JDBC

Spring框架对JDBC进行了简单的封装,提供了一个JDBCTemplate对象简化JDBC的开发。代码测试如下:

package com.hc.template;

import com.hc.domain.student;
import com.hc.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

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

public class JDBCTemplateDemo {
    public static void main(String[] args) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        String sql = "update student set Sname = ? where Sno = ?";
        int count = jdbcTemplate.update(sql, "黄世称", "201215121");
        System.out.println(count);

        sql = "delect from student where Sno = ?";
        count = jdbcTemplate.update(sql, "201215130");
        System.out.println(count);

        sql = "insert into student values(?,?,?,?,?)";
        count = jdbcTemplate.update(sql, "201215130", "邓世昌", "女", 25, "CS");
        System.out.println(count);

        sql = "select * from student where Sno = ?";
        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql, "201215121");
        System.out.println(stringObjectMap);

        sql = "select * from student";
        List<Map<String, Object>> lists = jdbcTemplate.queryForList(sql);
        for (Map<String, Object> map : lists) {
            System.out.println(map);
        }

        List<student> studentList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<student>(student.class));
        for (student s : studentList) {
            System.out.println(s.toString());
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是聪聪黄吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值