JDBC 编程初步
JDBC 概述
什么是JDBC
是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成,JDBC提供了一种操作数据的标准,JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统。
通过驱动连接
JDBC的API
java.sql包装的就是JDBC的API。各大数据库厂商就会对JDBC的API提供实现类——驱动包。注意不要引错包。
连接Mysql
1. 添加驱动
- 在项目当中创建一个文件夹为lib
- 把Mysql驱动包复制到该文件夹下
- 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结构化语言:
- 数据查询语言(DQL: Data Query Language)
SELECT <字段名> FROM <表或视图名> WHERE <查询条件>;
- 数据操纵语言(DML:Data Manipulation Language)
INSERT INTO <表名>(列1,列2,...) VALUES (值1,值2,...);
UPDATE <表名> SET <列名>=新值 WHERE <列名>=某值;
DELETE FROM <表名> WHERE <列名>=某值;
- 数据定义语言(DDL:Data Definition Language)
CREATE、ALTER、DROP,用于在数据库中创建新表或删除表,以及为表加入索引等。
- 数据控制语言(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();
}
}