JDBC快速入门(学习笔记)

JDBC(java DataBase Connectivity)


  1. JDBC本质:其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

  2. 快速入门

    1. 导入驱动jar包
      1. 赋值jar包到项目的目录下
      2. 右键 --> add as library
    2. 注册驱动
      Class.forName(“com.mysql.jdbc.Driver”);
    3. 获取数据库的连接对象 Connection
      Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/db1”,“root”,“6598258”);
    4. 定义sql语句
      String sql = “update student set age = 20 where id = 01”;
    5. 获取执行sql语句的对象 Statement
      Statement stmt = conn.createStatement();
    6. 执行sql,接收返回结果
      int count = stmt.executeUpdate(sql);
    7. 处理结果
    8. 释放资源
      stmt.close();
      conn.close();
  3. 详解各个对象

    1. DriverManager:驱动管理对象

       功能:
      
       1.注册驱动: 告诉程序该用哪一个数据库驱动jar
       	static void registerDriver(Driver driver):注册给定的驱动程序 DriverManager	
       	写代码使用Class.forName("com.mysql.jdbc.Driver")
       	通过查看源码发现,Driver类中存在静态代码块
       	
       注意: mysql5之后的驱动jar包可以省略注册驱动的步骤。
      
       2.获取数据库连接:
       	static Connection getConnection(String url,String user,String password);
       	参数:
       		url:指定连接的路径   (jdbc:mysql://ip地址(域名):端口号/数据库名)
       			> 细节:如果连接的是本地mysql服务器,并且mysql服务默认端口是3306,则URl可以简写为jdbc:mysql:///数据
       			> 库名称
       		user:用户名
       		password:密码
      
    2. Connection: 数据库连接对象

       功能:
       
       1. 获取执行sql的对象 
       	> Statement createStatement()
       	> PreparedStatement prepareStatement(String sql)
       2. 管理事务:
       	> 开启事务: void setAutoCommit(boolean autoCommit) 调用该方法设置参数为false,即开启事务
       	> 提交事务: void commit()
       	> 回滚事务:  rollback()
      
    3. Statement: 执行sql的对象

       功能:
      
       1. 执行sql
       	> boolean execute(String sql) 可以执行任意的sql,了解即可
       	> int executeUpdate(String sql) 执行DML语句、DDL语句
       		> 返回值:影响的行数,可以通过影响的行数判断DML语句是否执行成功,若返回值大于0则执行成功,否则失败。
       	> ResultSet executeQuery(String sql) 执行DQL语句
       2. 练习
       	> 1. account表 添加一条记录
       	> 2. account表 修改记录
       	> 3. account表 删除一条记录
      
    4. ResultSet:结果集对象,封装查询结果

      1. next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是则返回false,不是则返回true
      2. getxxx():xxx表示数据类型 如:getInt() 返回int值 getString() 返回String值

        参数:

        1. int:代表编号 如:getString(1) 从1开始
        2. String:代表列名称 如:getDouble(“balance”)
      3. 使用步骤:

        1.游标向下移动一行
        2.判断是否有数据
        3.获取数据

    5. PerparedStatement: 执行sql的对象

      1. SQL注入问题: 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
        1. 随便输入用户名,输入密码: a’ or ‘a’ = 'a(恒等式)
        2. sql: select * from user where username = ‘fasjkfjk’ and password = ‘a’ or ‘a’ = ‘a’
      2. 解决sql注入问题:使用PreparedStatement对象来解决
      3. 预编译的sql:参数使用?作为占位符
      4. 步骤:
        1. 导入jar驱动包
        2. 注册驱动
        3. 获取数据库连接对象Connection
        4. 定义sql
          1. 注意:sql的参数使用?作为占位符。例如:select * from user where username = ? and password = ?;
        5. 获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
        6. 给?赋值:
          1. 方法:setxxx(参数1,参数2) 参数1:?的位置编号从1开始。参数2:?的值
        7. 执行sql,接收返回结果,不需要传递sql语句
        8. 处理结果
        9. 释放资源
      5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
        1. 可以防止sql注入
        2. 效率更高

###抽取JDBC工具类 JDBCUtils

目的:简化书写
分析:
	1. 注册驱动也抽取
	2. 抽取一个方法获取连接对象
		1. 需求:不想传递参数(麻烦),还得保证工具类的通用性
		2. 解决方法:配置文件
			1. jdbc.properties
				1. url = 
				2. user = 
				3. password =  
	3. 抽取一个方法释放资源

练习

需求:
	1. 通过键盘录入用户名和密码
	2. 判断用户是否登录成功
		1. select * from user where username = '' and password = '' 查的出来则登录成功,查不出来就登录失败
步骤:
	1. 创建数据库表User
			create table user(
			id int primary key auto_increment,
			username varchar(32),
			password varchar(32)
		    );

###JDBC控制事务

  1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
  2. 操作:
    1. 开启事务
    2. 提交事务
    3. 回滚事务
  3. 使用Connection对象来管理事务
    1. 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
      1. 在执行sql之前开启事务
    2. 提交事务:commit()
      1. 当所有sql都执行完之后提交事务
    3. 回滚事务:rollback()
      1. 在catch中回滚事务

###数据库连接池

  1. 概念: 其实就是一个容器(集合),存放数据库连接的容器
    1. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将
    2. 对象归还给容器。
  2. 好处:
    1. 节约资源
    2. 用户访问高效
  3. 实现:
    1. 标准接口:DataSource javax.sql包下
      1. 方法:获取连接:getConnection()
      2. 归还连接:如果连接对象Connection是从连接池中获取的,那么调用**Connection.close()**方法,则不会再关闭连接,而是归还
    2. 一般我们不去实现它,由数据库厂商来实现
      1. C3P0:数据库连接池实现技术
      2. Druid:数据库连接池实现技术,由阿里巴巴提供

你可能感兴趣的:(数据库)