## 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(占位符索引,占位符的值)