JDBC入门--如何10分钟内学会用Java操作数据库

1、概念:Java DataBase Connectivity Java语言操作数据库

JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则(接口)。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

2、快速入门:

JDBC的使用:

//        1、导入驱动jar包
//        2、注册驱动
          Class.forName("com.mysql.jdbc.Driver");
//        3、获取数据库链接对象 Connection
        Connection conn=
        DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
//		  这里的后两个参数分别为你的MySql账户和密码
//        4、定义sql
        String sql="update emp set Salary=10000 where ename='孙悟空'";
//        5、获取执行SQL语句的对象 Statement
        Statement stat = conn.createStatement();
//        6、执行sql,接收返回结果
        int count = stat.executeUpdate(sql);
//        7、处理结果
        System.out.println(count);
//        8、释放资源
        stat.close();
        conn.close();

3、详解各个对象:

1. DriverManager:驱动管理对象
  • 作用:该对象可以创建连接,它本身就是一个创建Connection的工厂对象(Factory)

  • 功能:
    a.注册驱动:告诉程序该使用哪一个数据库jar包
    static void registerDriver(Driver driver):注册与给定的驱动程序:DriverManager
    写代码使用:Class.forName(“com.mysql.jdbc.Driver”);

    通过查看源码发现:在com.mysql.jdbc.Driver类中存在以下静态代码块:

    static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    	```
    //注意:mysql5之后可省略注册驱动的步骤
    

b.获取数据库连接:

  • 方法:static Connection getConnection(String url,String user,String password);
  • 参数:
    • url:指定连接的路径
    • 语法:jdbc:mysql://IP地址(域名):端口号/数据库名称
    • 细节:如果连接的是本机mysql服务器,并且端口号为3306,则可以省略IP地址和端口号。
    • user:用户名
    • password:密码
2、Connection:数据库连接对象

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

3、Statement:执行sql的对象

1、执行sql:
- boolean execute(String sql):可以执行任意的sql
2、int executeUpdate(String sql):可以执行DML(insert、update、delete)语句和DDL(create、alter、drop)语句
- 返回值:影响的行数,可以通过这个值判断DML是否执行
3、ResultSet executeQuery(String sql):执行 DQL(select)对象

4、ResultSet:结果集对象,封装查询结果
  • boolean next():游标向下移动一行,判断当前行是否为最后一行末尾(是否有数据),如果false就没有数据
  • getXxx(参数):获取数据
    1、Xxx:代表数据类型 如:int getInt()等
    2、参数:
    - int:代表列编号,从1开始
    - String:代表列名称。
  • 注意:
    使用步骤:
    1、游标向下移动一行
    2、判断是否有数据
    3、获取数据
5、PreparedStatement:执行sql的对象**

1、SQL注入问题:在拼接sql的特殊关键字参与字符串的拼接
- 输入用户随便,输入密码:a’ or ‘a’ = 'a
- SQL:select * from user where user=‘随便’ and password=‘a’ or ‘a’=‘a’;
2、解决sql注入问题:使用PreparedStatement对象来解决
3、预编译的SQL:参数使用?作为占位符
4、步骤:
a.使用占位符?,select * from user where user=? and password=?;
b.获取执行SQL语句的对象 PreparedStatement
Connection.prepareStatment(String sql)
c.给?赋值
- 方法:setXxx(参数1,参数2)
- 参数1:?的位置编号,从1开始
- 参数2:?的值
d.执行sql,接收返回结果,不需要传递sql语句

4、JDBC控制事务:

1、事务:一个包含多个步骤的业务操作如果被事务管理,则要么同时成功,要么同时失败。
2、操作:

  1. 开启事务
  2. 提交事务
  3. 回滚事务

3、使用Connection对象来管理事务

  1. 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置为false,即开启事务,在执行sql之前开启事务
  2. 提交事务:commit()
    当所有sql都执行完提交事务
  3. 回滚事务:rollback()
    在catch中回滚事务

6.数据库连接池:

1、概念:一个存放数据库连接的容器
当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器。
2、好处

  1. 节约系统资源
  2. 用户访问高效

3、实现:

  1. 标准接口:DataSource javax.sql包
    1. 方法:
      获取连接:getConnection()
      归还连接:如果连接对象Connection是从连接池中获取的,直接调用close就好,会归还到连接池中
    2. 一般我们不去实现它,由数据库厂商来实现
      1. C3P0:数据库连接池技术
      2. Druid:数据库连接池实现技术,由阿里巴巴提供的

4、C3P0
步骤:

  1. 导入jar包(两个)
  2. 定义配置文件:
    名称:c3p0.properties或者c3p0-config.xml
    路x径:直接将文件放在src目录下即可
  3. 创建核心对象 数据库连接池对象 ComboPoolDataSource
  4. 获取连接:getConnection

5、Druid
1、步骤:

  1. 导入jar包
  2. 定义配置文件:
    是properties形式的
    可以叫任意名称,可以放在任意目录下
  3. 加载配置文件(使用类加载器)
  4. 获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
  5. 获取连接:getConnection

2、定义工具类

  1. 定义一个类 JDBCUtils
  2. 提供静态代码块加载配置文件,初始化连接池对象

3.提供方法

  1. 获取连接方法:通过数据库连接池获取连接
  2. 释放资源
  3. 获取连接池的方法

7.spring JDBC:JDBC Template

  1. 概念:spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

  2. 步骤:

    1. 导入jar包
    2. 创建JDBCTemplate对象,依赖于数据源DataSource
    3. 调用方法来JDBCTemplate的方法来完成CRUD的操作
  • update():执行DML语句。增、删、改语句

  • queryForMap():查询结果将结果记封装为map集
    注意:这个方法查询的结果集长度只能是1

  • queryForList():查询结果将结果集封装为List集合
    注意:将每一条记录封装成一个Map集合,再将Map集合装载到List集合中

  • query():查询结果,把结果封装为JavaBean对象
    query的参数:RowMapper
    一般我们使用BeanPropertiesRowRapper实现类,可以完成数据到JavaBean的自动封装
    new BeanPropertyRowMapper<类型>(类型.class)

  • queryForObject():查询结果,将结果封装为对象
    一般用于聚合函数的查询

8.面试问题

  1. JDBC是如何实现Java程序和JDBC驱动的松耦合?
    JDBC API使用Java的反射机制来实现Java程序和JDBC驱动的松耦合,看看JDBC的使用过程,可以发现所有操作都是通过JDBC接口完成的,而驱动只有在通过Class.forName反射机制来加载的时候才会出现。

    这是Java核心库里反射机制的最佳实践之一,它使得应用程序和驱动程序之间进行了隔离,让迁移数据库的工作变得更简单。

  2. Statement和PrepareStatement的区别

  • 关系:PreparedStatement继承于Statement,两者都是接口
  • 区别:PrepareStatement可以使用占位符,而且是预编译的,批处理比Statement效率高
  • 预编译
    创建时:
Statement s=conn.createStatement();
PreparedStatement ps=conn.prepareStatement(sql);

执行时:

Result rSet=s.executeQuery(sql);
Result pSet=ps.executeQuery();

由上可看出,PreparedStatement有预编译的过程,已经绑定了sql语句,无论执行多少次,都不会再去进行编译,而Statement如果执行多次,就要编译多少次。从这点看,前者的效率是要高过后者的。另外,采用预编译的方式,PreparedStatement可以有效地防止SQL注入等问题。

  • 占位符:
    PreparedStatement可以替换变量在SQL语句中可以包含?,可以用?来替换变量,而Statement只能用字符串拼接(容易出现SQL注入问题)
  1. JDBC的ResultSet
  • 在查询数据后会返回一个ResultSet,它就像是查询结果集的一张数据表。
  • ResultSet对象维护了一个游标,指向当前的数据行,开始时它指向第一行,如果调用了ResultSet的next方法,游标会下移一行,如果没有更多的数据,next方法会返回false,可以在for循环中用它来遍历数据集。
  • 默认的ResultSet是不能更新的,游标也只能往下移,你可以自己创建可以回滚或者可更新的ResultSet。
  • 当生成ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。
  • 可以通过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据
  • 根据创建Statement的时候输入不同的参数,会对应不同类型的ResultSet。ResultSet对象有3种类型:
    TYPE_FORWARD_ONLY/TYPE_SCROLL_INSENSITIVE/TYPE_SCROLL_SENSITIVE

你可能感兴趣的:(Java学习,JavaSE)