- 什么是jdbc:java程序连接数据库的标准方案,全称是java database connectivity
- 使用jdbc的步骤:导入jar包,注册驱动,获取数据库的连接,获取传输器
- SQL攻击:原因是SQL中出现了特殊符号#(注释符号)改变了SQL的语义
解决方案:使用新的传输器PreparedStatement - 执行SQL:先执行SQL骨架,然后再给SQL设置参数
executeUpdate():用来执行增删改的SQL语句,而却返回了影响行数
executeQuery()用来执行查的SQL语句,而且返回了结果集ResultSet
1.JDBC
1.1 概述
全称是java database connectivity,专门用来完成java程序和数据库的连接技术
1.2 使用步骤
1.导入jar包(使用jdbc提供了丰富的工具类)
2.提供连接数据库的参数(用户名root 密码root 端口号3306)
3.在java程序中,发起SQL语句操作数据库
4.如果数据库有查到的结果,返回给java程序
练习1.1:获取数据库的连接
package cn.tedu.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
public class JdbcUtils {
//获取数据库的连接(注册驱动+获取连接)
/**
* 获取数据库的连接
* 静态:只加载一次,节省资源
* 节省new对象的时间
* 公开,方便别人调用
* @return 数据库的连接对象Connection
*/
public static Connection getConnection() throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取和数据库的连接
String url1="jdbc:mysql://localhost:3306/day03?";
String url="jdbc:mysql:///day03?characterEncoding=utf8";
Connection conn= DriverManager.getConnection(url,"root","root");
return conn;
}
}
练习1.2 jdbc巩固练习
package cn.tedu.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 打印部门表中所有的数据
*/
public class Test05 {
public static void main(String[] args) throws Exception{
//method1();
method2();
}
private static void method1(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//1.注册驱动,连接数据库
conn = JdbcUtils.getConnection();
//2.sql语句
System.out.println("请输入ID值");
Integer id = new Scanner(System.in).nextInt();
String sql = "select * from dept where deptno <= ?";
//3.传输器
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
//4.执行SQL
rs = ps.executeQuery();
//5.结果集
while (rs.next()) {
for (int i = 1; i <= 3; i++) {
System.out.print(rs.getString(i) + " ");
}
System.out.println();
}
}catch (Exception e){
e.printStackTrace();
}finally {
//6.关闭资源
try {//资源的释放一定要执行
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//向dept表中添加数据
private static void method2(){
Connection conn =null;
PreparedStatement ps=null;
ResultSet rs =null;
try{
//1.注册驱动,连接
conn = JdbcUtils.getConnection();
//2.sql语句
System.out.println("请输入相关内容:");
Integer id=new Scanner(System.in).nextInt();
String name=new Scanner(System.in).nextLine();
String loc=new Scanner(System.in).nextLine();
String sql="insert into dept values(?,?,?)";
//3.传输器
ps = conn.prepareStatement(sql);
ps.setObject(1,id);
ps.setObject(2,name);
ps.setObject(3,loc);
//4.执行SQL
int rows=ps.executeUpdate();
System.out.println("影响的行数为:"+rows);
}catch(Exception e){
e.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
出现空指针异常,加if判断,解决此问题
package cn.tedu.jdbc2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
//1.2注册驱动,建立数据库连接
conn = JdbcConnection.jdbcConn();
// 输入用户名和密码
System.out.println("请输入用户名:");
String user=new Scanner(System.in).nextLine();
System.out.println("请输入密码:");
String pass=new Scanner(System.in).nextLine();
String sql="select * from user where name=? and password=?";
//3.获取传输器,执行SQL
ps = conn.prepareStatement(sql);
ps.setString(1,user);
ps.setString(2,pass);
//4.执行SQL
rs = ps.executeQuery();
//5.解析结果集
if(rs.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}catch (Exception e){
e.printStackTrace();
}finally {
//6.释放资源
if (rs != null) {//避免了空指针异常
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}