JDBC 初步认识

目录

JDBC

JDBC是什么?

  1. 是一个独立于特定数据库管理系统,通用的SQL数据库存取和操作的公共接口(API)。

    • 为什么要提供固定的接口呢?

      • 答: 操作方便提高效率。 不同的数据库都可以通过这套接口来编程。 经行了分层,程序员只需要通过接口进行编程--- 接口编程
        JDBC 初步认识
  2. 其他的数据库需要通过这套接口来编写自己家数据库的方法即 驱动。 这里的话需要用到的第三方库, 厂商提供的jar包

    • 如何下载呢? 问得好
      • 答: 请百度下载对应的接口即可
  3. JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。

  4. JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。

JDBC体系结构

JDBC体系结构有些什么?

  • 面向应用的API: 程序员使用。
  • 面向数据库的API: 开放商所写驱动使用。

JDBC程序如何编写

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

  1. 用于执行静态 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("用户名或密码错误!");
}
}
缺点:
  1. 存在被sql注入的风险
  2. 需要经行拼串
  3. 因为是静态语句所以无法传输Blob 的数据

PrepatedStatement

  1. SQL 语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句。
优点
  1. 大大减小被sql注入的风险
  2. 通过?(问号) 实现, 占位
/*
	此代码运行不了
*/
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
  1. 查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
  2. ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商提供实现
  3. ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面。
  4. ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有效,该方法返回 true,且指针下移。
  5. 相当于Iterator对象的 hasNext() 和 next() 方法的结合体。当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。

关闭连接

先关闭 ResultSet -> PreparedStatement->Connection
rs.close();
ps.close();
//Connection 对象
con.close();
上一篇:私人工具集1——自定义配置类(Config)


下一篇:JavaWeb学习--MyBatis框架介绍与快速入门