JDBC概述
1.JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。
2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
3.JDBC的基本原理
JDBC带来的好处
1.JDBC带来的好处示意图
2.说明,JDBC是Java提供一套用于数据库操作的接口API,JAVA程序员只需要面向这套接口编程即可
,不同的数据库厂商需要针对这套接口,提供不同实现
JDBC程序编写步骤
1.注册驱动-加载Driver类
2.获取连接-得到Conection
3.执行增删改查-发送SQL给mysql执行
4.释放资源-关闭相关连接
package com.hspedu.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author 山河与you皆无恙
* 这是第一个jdbc程序完成简单的操作
*/
public class Jdbc01 {
public static void main(String[] args) throws SQLException {
//1.注册驱动
Driver driver = new Driver();
//2.得到连接
//1.说明:jdbc:mysql:// 规定好表示协议,通过jdbc的方式连接mysql
//2.localhost 主机,可以是ip地址,
//3.3306 表示mysql监听的端口
//4.db02 连接到 mysql dbms 的哪个数据库
//5.mysql的连接本质就是前面学过的socket连接
String url = "jdbc:mysql://localhost:3306/db02";
//将用户名和密码放到properties
Properties properties = new Properties();
properties.setProperty("user","root");//用户
properties.setProperty("password","root");//密码
Connection connect = driver.connect(url, properties);
//3.执行sql
//String sql = "insert into actor values(null,'刘德华','男','1970-11-11','110')";
//String sql ="update actor set name='周星驰' where id =1";
String sql ="delete from actor where id =1";
//
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql);//如果是dml语句,返回的就是影响行数
System.out.println(rows>0? "成功":"失败");
//4.关闭连接资源
statement.close();
connect.close();
}
}
获取数据库连接5种方式
-
提示:
1.mysql驱动5.1.6可以无需Class.forName(“com.mysql.jdbc.Driver”)
2.从jdk1.5以后使用了jdbc4,不再需要显示调用Class.forName()注册驱动而是自动调用驱动jar包下的META-INFservicejava.sql.Driver文本类中的类名称去注册
3.建议还是写上Class.forName(com.mysql.jdbc.Driver),更加明确。
package com.hspedu.jdbc;
import com.mysql.jdbc.Driver;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/**
* @author 山河与you皆无恙
* 分析java的五种方式
*/
public class JdbcConn {
//方式1
@Test
public void connect01() throws SQLException {
//1.注册驱动
Driver driver = new Driver();
String url = "jdbc:mysql://localhost:3306/db02";
//将用户名和密码放到properties
Properties properties = new Properties();
properties.setProperty("user","root");//用户
properties.setProperty("password","root");//密码
Connection connect = driver.connect(url, properties);
System.out.println(connect);
}
//方式2
@Test
public void connect02() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
//使用反射创建Driver类 动态加载更加灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/db02";
//将用户名和密码放到properties
Properties properties = new Properties();
properties.setProperty("user","root");//用户
properties.setProperty("password","root");//密码
Connection connect = driver.connect(url, properties);
System.out.println("方式2="+connect);
}
//方式3 使用 DriverManager 替代driver
@Test
public void connect03() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
//使用反射创建Driver类 动态加载更加灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/db02";
String user = "root";
String password = "root";
DriverManager.registerDriver(driver);//注册driver驱动
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式3="+connection);
}
//方法4:使用Class.forName 自动完成注册驱动,简化代码
//这种方式获取连接是使用的最多的,推荐使用
@Test
public void connect04() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
//使用反射创建Driver类 动态加载更加灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
/*
1.静态代码块,在类加载时,会执行一次
2.DriverManager.registerDriver(new Driver()
2.因此注册driver的工作已经完成
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
*/
Driver driver = (Driver) aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/db02";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式4="+connection);
}
//方式5,在方式4的基础上改进,增加配置文件,让连接mysql更加灵活
@Test
public void connect05() throws SQLException, ClassNotFoundException, IOException {
Properties properties = new Properties();
properties.load(new FileInputStream("src\mysql.properties"));
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
Connection connection = DriverManager.getConnection(url, user, password);
Class.forName(driver);
System.out.println("方式5="+connection);
}
}
ResultSet
1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
2.ResultSet对象保持一个光标指向当前的数据行。最初,光标位于第一行之前
3.next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集
package com.hspedu.jdbc.resultset_;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* @author 山河与you皆无恙
*/
@SuppressWarnings({"all"})
public class ResultSet_ {
public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
//通过properties对象获取配置文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("D:/idea_workspace/chapter25/src/mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
//1.注册驱动
Class.forName(driver);
//2.得到连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到statement
Statement statement = connection.createStatement();
//4.组织sql
String sql = "select id, name,sex,borndate from actor";
ResultSet resultSet = statement.executeQuery(sql);
//5.使用while取出数据
while (resultSet.next()){
String id = resultSet.getString(1);
String name = resultSet.getString(2);
String sex = resultSet.getString(3);
String date = resultSet.getString(4);
System.out.println("id"+"t"+name+"t"+sex+"t"+date+"t");
}
//6.关闭连接
resultSet.close();
statement.close();
connection.close();
System.out.println("方式5="+connection);
}
@Test
public void m1() throws IOException, ClassNotFoundException, SQLException {
//通过properties对象获取配置文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
//1.注册驱动u
Class.forName(driver);
//2.得到连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到statement
Statement statement = connection.createStatement();
//4.组织sql
String sql = "select id, name,sex,borndate from actor";
ResultSet resultSet = statement.executeQuery(sql);
//5.使用while取出数据
while (resultSet.next()){
String id = resultSet.getString(1);
String name = resultSet.getString(2);
String sex = resultSet.getString(3);
String date = resultSet.getString(4);
System.out.println("id"+"t"+name+"t"+sex+"t"+date+"t");
}
//6.关闭连接
resultSet.close();
statement.close();
connection.close();
System.out.println("方式5="+connection);
}
}
Statement
1.Statement对象用于执行静态SQL语句并返回其生成结果的对象
2.在连接建立后,需要对数据库进行访问,执行命令或是SQL语句,可以通过
-
Statement[存在SQL注入问题] -
PreparedStatement[预处理] -
CableStatement[存储过程]
3.Statement对象执行SQL语句存在SQL注入风险
4.SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库
5.要防范SQL注入,只要用PreparedStatement取代Statement就可以了
PreparedStatement
1.PreparedStatement执行SQL语句中的参数用(?)表示,调用PreparedStatement对象的setXXX()方法来设置这些参数,setXXX()方法有两个参数,第一个参数是要设置的SQL语句中的索引(从1开始),第二个是设置的SQL语句中参数的值
2.调用executeQuery(),返回ResultSet对象
3.调用executeUpdate():执行更新,包括增、删、修改
package com.hspedu.jdbc.preparedstatement_;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import java.util.Scanner;
/**
* @author 山河与you皆无恙
*/
@SuppressWarnings({"all"})
public class PreparedStatement_ {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
//让用户输入管理员名和密码
System.out.println("请输入管理员的名字");//next():当接收到空格或者'表示结束
String admin_name =scanner.nextLine();//如果需要看到SQL注入,这里需要用nextLine
System.out.println("请输入管理员的密码");
String admin_password =scanner.nextLine();
//通过properties对象获取配置文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("D:/idea_workspace/chapter25/src/mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
//1.注册驱动
Class.forName(driver);
//2.得到连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到statement
//3.1.组织sql Sql语句的?就相当于占位符
String sql = "select name,pwd from admin where name =? and pwd =?";
//3.3preparedStatement对象实现了PreparedStatement接口的实现类的对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//3.3给?赋值
preparedStatement.setString(1,admin_name);
preparedStatement.setString(2,admin_password);
//这里执行 executeQuery(),不要再写sql
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()){//如果查询到一条记录,则说明该管理存在
System.out.println("恭喜,登录成功");
}else {
System.out.println("对不起,登录失败");
}
//关闭连接
resultSet.close();
preparedStatement.close();
connection.close();
}
}
package com.hspedu.jdbc.preparedstatement_;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;
import java.util.Scanner;
/**
* @author 山河与you皆无恙
*/
@SuppressWarnings({"all"})
public class PreparedStatementDML_ {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
//让用户输入管理员名和密码
System.out.println("请输入管理员的名字");//next():当接收到空格或者'表示结束
String admin_name =scanner.nextLine();//如果需要看到SQL注入,这里需要用nextLine
System.out.println("请输入管理员的密码");
String admin_password =scanner.nextLine();
//通过properties对象获取配置文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("D:/idea_workspace/chapter25/src/mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
//1.注册驱动
Class.forName(driver);
//2.得到连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到statement
//3.1.组织sql Sql语句的?就相当于占位符
//添加记录
String sql = "insert into admin values (?,?)";
//String sql = "update admin set pwd=? where name =?";
//String sql = "delete from admin where name =?";
//String sql = "select name,pwd from admin where name =? and pwd =?";
//3.3preparedStatement对象实现了PreparedStatement接口的实现类的对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//3.3给?赋值
// preparedStatement.setString(1,admin_password);
preparedStatement.setString(1,admin_name);
//执行 dml语句使用 executeUpdate()
int rows = preparedStatement.executeUpdate();
System.out.println(rows>0?"执行成功":"执行失败");
//关闭连接
preparedStatement.close();
connection.close();
}
}
预处理好处
1.不再使用+拼接sql语句,减少语法错误
2.有效解决了SQL注入问题
3.大大减少了编译次数,效率较高
视频链接:
https://www.bilibili.com/video/BV1zv41157NC?spm_id_from=333.999.0.0
原文始发于微信公众号(itmkyuan):Java基础之JDBC
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/39541.html