JDBC学习笔记

## JDBC的学习

概述:JDBC可以连接任何提供JDBC驱动程序的数据库系统,完成对数据库的各种操作。

原理:java提供许多个接口,由不同的厂商如(MySQL、Oracle、db2)实现java提供的接口(MySQL实现接口,Oracle实现接口,db2实现接口。本质是类),由这些类来操作数据库。这些类存放在jar包中。做项目的时候需要将这个jar包引进项目中才能实现java操作数据库。

1、JDBC程序的编写步骤

①注册驱动---加载Driver类

②获取连接---得到Connection

③执行增删改查---发送SQL给mysql执行

④释放资源---关闭相关连接

2、第一个JDBC程序

```java
package com.yanyu.JDBC;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBC {
    public static void main(String[] args) throws SQLException {
        //1、注册驱动
        Driver driver = new Driver();
        //2、得到连接
        //(1)jdbc:mysql://  规定好表示协议
        //(2)localhost  主机,也可以是ip地址
        //(3)3306 表示mysql的监听接口
        //(4)mysql连接到mysql dbms的哪个数据库
        //(5)mysql的连接本质是socket的连接
        String url="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8";
        //将用户名和密码封装到Properties对象
        Properties properties=new Properties();
        properties.setProperty("user","root");//用户名
        properties.setProperty("password","577520");//密码
        Connection connect=driver.connect(url,properties);
        //3、执行sql
        String sql="insert into users values('1','烟雨红尘续残梦','577520','1097524253@qq.com','2001-05-07') ";
        //statement用于执行静态SQL语句并返回其生成的结果的对象
        Statement statement = connect.createStatement();
        int rows=statement.executeUpdate(sql);//如果是dml语句,返回的就是影响的行数
        System.out.println(rows>0 ? "成功" : "失败");
        //4、关闭连接资源
        statement.close();
        connect.close();
    }
}
```

3、获取数据库连接的方式

方式1:

```java
Driver driver=new com.mysql.jdbc.Driver();//这个Driver是第三方的,属于第三方加载
String url="jdbc:mysql//localhost:3306/数据库名";
Properties properties=new Properties();//创建properties对象
properties.setProperties=("user","数据库账号");
properties.setProperties=("password","数据库密码");
Connection connect=driver.connect(url,properties);
```

方式2:

```java
Class class=Class.forName("com.mysql.jdbc.Driver");
Driver driver=(Driver)class.newInstance();
String url="jdbc:mysql://localhost:3306/mysql";
Properties properties=new Properties();//创建properties对象
properties.setProperties=("user","数据库账号");
properties.setProperties=("password","数据库密码");
Connection connect=driver.connect(url,properties);

```

方式3:

```java
package com.yanyu.JDBC;
//连接方式3:使用DriverManager替代Driver进行统一管理
import com.mysql.jdbc.Driver;
import org.testng.annotations.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

@Test
public class JDBCConnector {
    public void connect03() throws InstantiationException, IllegalAccessException, SQLException, ClassNotFoundException {
        //使用反射加载Driver
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver =(Driver) aClass.newInstance();
        //创建url和user和password
        String url="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8";
        String user="root";
        String password="577520";
        //注册Driver驱动
        DriverManager.registerDriver(driver);
        Connection connection=DriverManager.getConnection(url,user,password);

    }
}
```

方式4:使用Class.forName自动完成注册驱动

```java
package com.yanyu.JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JJDBC {
    public void connect04() throws ClassNotFoundException, SQLException {
        //反射加载Driver
        Class.forName("com.mysql.jdbc.Driver");
        //创建url,user,password
        String url="jdbc:mysql://localhost:3306/mysql";
        String user="root";
        String password="577520";
        Connection connection= DriverManager.getConnection(url,user,password);
        
    }
}
```

这种方式是个人感觉最简单的,非常推荐使用第四种方式来连接mysql。

方式5

```java
package com.yanyu;
//方式5
import org.testng.annotations.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCConn {
    @Test
    public void JDBC() throws IOException, ClassNotFoundException, SQLException {
        //方式5,在方式4的基础上改进,增加配置文件,连接Mysql更加灵活
        Properties properties=new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");
        String driver=properties.getProperty("driver");
        String url=properties.getProperty("url");
        Class.forName("com.mysql.jdbc.Driver");
        DriverManager.getConnection(url,user,password);
        Connection connection=DriverManager.getConnection(url,user,password);
        System.out.println("方式5"+connection);


    }
}
```

**ResultSet**

ResultSet对象保持一个光标指向其当前的数据行,最初位于第一行。next方法是将光标移动到下一行,由于在ResultSet对象中没有更多行,next方法会在ResultSet里面判断下面是否还存在数据,不存在则返回false。因此可以在while循环中使用循环来遍历结果集。

常用API:

next():向下移动一行,没有下一行则返回false

previous():向上移动一行,没有上一行则返回false

getXxx(列的索引|列名):返回对应列的值,接收类型是Xxx

getObject(列的索引|列名):返回对应列的值,接收类型为Object

3.1使用ResultSet遍历表

```java
package com.yanyu.JDBC.resultset;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class Result_Set {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Properties properties=new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");
        String driver=properties.getProperty("driver");
        String url=properties.getProperty("url");
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        DriverManager.getConnection(url,user,password);
        //得到连接
        Connection connection=DriverManager.getConnection(url,user,password);
        //得到Statement
        Statement statement=connection.createStatement();
        //组织mysql
        String sql="select id,name,password,email,birthday from users";
        //执行mysql,该语句返回单个ResultSet对象
        ResultSet resultSet=statement.executeQuery(sql);
        //使用while取出数据
        while(resultSet.next()){//让光标向下移动,没有行则返回false
            int id=resultSet.getInt(1);//获取改变的第一列
            String name=resultSet.getString(2);
            String Password=resultSet.getString(3);
            String email=resultSet.getString(4);
            Date birthday=resultSet.getDate(5);
            System.out.println(id+"\t"+name+"\t"+Password+"\t"+birthday);

        }

        //关闭连接
        resultSet.close();
        statement.close();
        connection.close();


    }
}
```

**4、Statement (存在SQL注入问题)**

用于执行静态SQL语句并返回其生成的结果的对象

SQL注入:它是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据时注入非法的SQL语句段和命令,防范SQL注入只要用PrepareStatement取代Statement即可。

**5、PrepareStatement**

PrepareStatement执行的SQL语句中的参数用?表示,调用PrepareStatement对象的setXxx()方法来设置参数,setXxx()方法有两个参数,第一个是SQL语句中参数的索引,第二个是设置SQL语句中的参数的值。

例:String sql="SELECT COUNT(*) FROM admin WHERE username=? AND PASSWORD=?;"

常用API

executeQuery():返回ResultSet对象

executeUpdate():执行更新,包括增删改查

execute():执行任意sql,返回布尔值

setXxx(占位符索引,占位符的值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值