JDBC
JDBC是什么?
-
是一个独立于特定数据库管理系统,通用的SQL数据库存取和操作的公共接口(API)。
-
为什么要提供固定的接口呢?
- 答: 操作方便提高效率。 不同的数据库都可以通过这套接口来编程。 经行了分层,程序员只需要通过接口进行编程--- 接口编程。
- 答: 操作方便提高效率。 不同的数据库都可以通过这套接口来编程。 经行了分层,程序员只需要通过接口进行编程--- 接口编程。
-
-
其他的数据库需要通过这套接口来编写自己家数据库的方法即 驱动。 这里的话需要用到的第三方库, 厂商提供的jar包
- 如何下载呢? 问得好
- 答: 请百度下载对应的接口即可
- 如何下载呢? 问得好
-
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
-
JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
JDBC体系结构
JDBC体系结构有些什么?
- 面向应用的API: 程序员使用。
- 面向数据库的API: 开放商所写驱动使用。
JDBC程序如何编写
先导入jar包, 即数据库厂家编写的java驱动
连接驱动
方式
// 以连接mysql服务器为例
public void testConnect1() throws SQLException {
//创建了 一个mysql驱动类
Driver driver = new com.mysql.cj.jdbc.Driver();
/*
jdbc:mysql 协议
ip : 端口
*/
String url = "jdbc:mysql://localhost:3306/test";
Properties info=new Properties();
// 这里使用了配置文件
info.setProperty("user","root");
info.setProperty("password", "123456");
driver.connect(url,info);
}
/*
这种写法缺点就是:
内容写死, 更新时需要对源码经行修改。 所以一般不这么写
*/
public void getConnect5() throws Exception {
//1. 读取配置
InputStream is= ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password= pros.getProperty("password");
String url = pros.getProperty("url");
String DriverClass = pros.getProperty("driverClass");
//加载驱动
Class.forName(DriverClass);
}
//配置文件名为:jdbc.properties
/*
user=root
password=123456
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.cj.jdbc.Driver
这里的就比较好, 如果换数据库了 也不需要修改源码, 内容都可以通过修改配置文件来修改
*/
创建Connection对象
//建立与给定数据库URL的连接。
Conection conn= DriverManager.getConnection(url, user, password);
// 连接数据库
创建Statement 对象
Statement
- 用于执行静态 SQL 语句并返回它所生成结果的对象。
public void testLogin() {
Scanner scan = new Scanner(System.in);
System.out.print("用户名:");
String userName = scan.nextLine();
System.out.print("密 码:");
String password = scan.nextLine();
// SELECT user,password FROM user_table WHERE USER = '1' or ' AND PASSWORD =
'='1' or '1' = '1';
String sql = "SELECT user,password FROM user_table WHERE USER = '" + userName
+ "' AND PASSWORD = '" + password
+ "'";
User user = get(sql, User.class);
if (user != null) {
System.out.println("登陆成功!");
} else {
System.out.println("用户名或密码错误!");
}
}
缺点:
- 存在被sql注入的风险
- 需要经行拼串
- 因为是静态语句所以无法传输Blob 的数据
PrepatedStatement
- SQL 语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句。
优点
- 大大减小被sql注入的风险
- 通过?(问号) 实现, 占位
/*
此代码运行不了
*/
Connection conn = null;
PreparedStatement ps = null;
//1.获取数据库的连接
conn = JDBCUtils.getConnection();
//2.获取PreparedStatement的实例 (或:预编译sql语句)
// 这里通过? 来占位
String sql = "select * from test where id =?";
ps = conn.prepareStatement(sql);
// sql起始位置是1, id =10
ps.setInt(1, 10);
// 通用 什么类型的都可
ps. setoject(1, 10);
执行SQL语句
// 执行executeQuery(),得到结果集:ResultSet
ResultSet rs = ps.executeQuery();
// 如果执行的是增删改. 可执行这条命令
ps.execute()
ResultSet
- 查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
- ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商提供实现
- ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面。
- ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有效,该方法返回 true,且指针下移。
- 相当于Iterator对象的 hasNext() 和 next() 方法的结合体。当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。
关闭连接
先关闭 ResultSet -> PreparedStatement->Connection
rs.close();
ps.close();
//Connection 对象
con.close();