JDBC 编程初步

JDBC 概述

什么是JDBC

是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成,JDBC提供了一种操作数据的标准,JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统。

通过驱动连接

JDBC的API

java.sql包装的就是JDBC的API。各大数据库厂商就会对JDBC的API提供实现类——驱动包。注意不要引错包。

连接Mysql

1. 添加驱动

  1. 在项目当中创建一个文件夹为lib
  2. 把Mysql驱动包复制到该文件夹下
  3. builder path 编译路径

2. 创建连接

eclipse 中查看驱动相关api:ctrl+shift+t 查找 drive 点进去后, 要求关联源码,把驱动压缩包直接关联。

1. 加载驱动

把com.mysql.jdbc.Driver这份字节码加载进 JVM,当一份字节码被加载到 JVM 时,就会执行该字节码中的静态代码块:

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

代码实现:

Class.forName("com.mysql.jdbc.Driver");

2. 获取连接对象

连接时要求传入数据库地址、用户名、密码

String url = "jdbc:mysql://localhost:3306/new";
String user = "root";
String password = "abcd";
Connection conn = DriverManager.getConnection(url, user, password);

查看连接数( SHOW PROCESSLIST )

3. 创建并执行sql语句

数据库SQL结构化语言:

  1. 数据查询语言(DQL: Data Query Language)
SELECT <字段名> FROM <表或视图名> WHERE <查询条件>;
  1. 数据操纵语言(DML:Data Manipulation Language)
INSERT INTO <表名>(列1,列2,...) VALUES (值1,值2,...);
UPDATE <表名> SET <列名>=新值 WHERE <列名>=某值;
DELETE FROM <表名> WHERE <列名>=某值;
  1. 数据定义语言(DDL:Data Definition Language)

CREATE、ALTER、DROP,用于在数据库中创建新表或删除表,以及为表加入索引等。

  1. 数据控制语言(DCL:Data Control Language)

通过GRANT、DENT、REVOKE,确定单个用户或用户组对数据库对象的访问权限。

Statement接口作用:用于进行Java程序和数据库之间的数据传输。

具体类有3个实现:

1. Statement

用于对数据库进行通用访问,使用的是静态sql。

String sql = "DML/DDL";
Statement st = conn.createStatement();
int row = st.executeUpdate(sql);
2. PreparedStatement

用于预编译模板SQL语句,在运行时接受sql输入参数。

预编译语句:

没有预编译语句时,所有的sql都是进行拼接:

String sql = "insert into stu values("+stu.getId()+",'"+stu.getName()+"'")";

PreparedStatement 用于预编译模板SQL语句,在性能和代码灵活性上有显著地提高。PreparedStatement 对象使用 ? 作为占位符,即参数标记;使用 setXXX( index,value) 方法将值绑定到参数中,每个参数标记是其顺序位置引用,注意 index 从 1 开始;

PreparedStatement 对象执行SQL语句:(注意,它们都没有参数)

  • executeQuery()
  • executeUpdate()
SQL注入

就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

用户登入示例:

预编译语句可以防SQL注入,所以更安全。之所以PreparedStatement能防止注入,是因为它把单引号转义了,变成了 \',这样一来,就无法截断SQL语句,进而无法拼接SQL语句 基本上没有办法注入了。

String sql = "insert into student(name,age) values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, stu.getName());
ps.setInt(2, stu.getAge());
ps.executeUpdate();
3. CallableStatement

要访问数据库存储过程时使用,也可以接受运行时输入参数。

4.处理结果集

结果集 ResultSet:表示数据库查询的结果的集合,在执行查询语句时就会得到一个这样的结果。

常用方法:

  • boolean next():判断是否有下一行数据。若有,则向下移动一行指针。

  • getXxx(int columnIndex):获取当前行中,第几列 (从1开始),(不推荐)

  • getXxx(String columnName):获取当前行中,指定列名的列的值。columnName是列名/列的别名。
    若列的类型是VARCHAR/CHAR/TEXT,都使用getString来获取列的值。
    若列的类型是int/integer,都使用getInt来获取列的值。

Mysql与Java数据类型对照表:

3. 释放数据资源

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

        e.printStackTrace();
    }
}
if (st != null) {
    try {
        st.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
if (conn != null) {
    try {
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
posted @ 2019-03-29 11:40  Lomen~  阅读(580)  评论(0编辑  收藏  举报