目录
概念
JDBC示例
JDBC API
1.DriverManager
2.Connection
3.Statement
4.ResultSet
5.PreparedStatement
数据库连接池
DataSource
Druid
JDBC全称Java DataBase Connectivity (java数据库连接),是一套操作关系型数据库的javaAPI。
数据库驱动jar包:JDBC接口的实现类,由数据库厂商实现。
意义:
面向接口编程,java代码不需要针对不同的数据库分别开发。
在更换底层数据库时,也不需要大量更改代码。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
//2.获取连接
//String url="jdbc:mysql://127.0.0.1:3306/mybase";
//本机的mysql且端口为默认3306,可简写
String url="jdbc:mysql:///mybase";
String username="root";
String password="111111";
Connection conn=DriverManager.getConnection(url,username,password);
//3.定义SQL
String sql="update student set age=18 where name='wj'";
//4.获取执行sql的对象 Statement
Statement stmt=conn.createStatement();
//5.执行sql
int count=stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();//先
conn.close();//后
}
}
驱动管理类 工具类,全是静态方法
作用:
1.注册驱动
static void registDriver(Driver driver)
#Driver类中静态代码块中调用了该方法。
2.获取数据库连接
static Connection getConnection(String url,String user,String password)
String url="jdbc:mysql://127.0.0.1:3306/mybase";
url: jdbc:mysql://ip地址或域名:端口号/数据库名称?参数键值对1&参数键值对2...
连接本机mysql服务器,并且服务器默认端口3306,可简写。
与特定的数据库连接,执行SQL语句并在连接的上下文返回结果
作用:
1.获取执行SQL的对象
i.普通执行SQL对象 Statement createStatement()
ii.预编译SQL的执行SQL对象:防止SQL注入 PreparedStatement preparedStatement(sql)
iii.执行存储过程的对象 CallableStatement prepareCall(sql)
2.管理事务
i.开启事务 setAutoCommit(boolean autoCommit);//true为自动提交,false手动
ii.提交事务 commit();
iii.回滚事务 rollback()
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class connection {
public static void main(String[] args) throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
//2.获取连接
//String url="jdbc:mysql://127.0.0.1:3306/mybase";
//本机的mysql且端口为默认3306,可简写
String url="jdbc:mysql:///mybase";
String username="root";
String password="111111";
Connection conn= DriverManager.getConnection(url,username,password);
//3.定义SQL
String sql1="update student set age=20 where name='wj'";//check约束,0--100
String sql2="update student set sex='男' where name='wj'";//有check约束,只能说男/女
//4.获取执行sql的对象 Statement
Statement stmt=conn.createStatement();
//5.执行sql
//6.处理结果
try {
conn.setAutoCommit(false);
int count1=stmt.executeUpdate(sql1);
System.out.println(count1);
int count2=stmt.executeUpdate(sql2);
System.out.println(count2);
conn.commit();
} catch (SQLException e) {
conn.rollback();
throw new RuntimeException(e);
}
//7.释放资源
stmt.close();//先
conn.close();//后
}
}
作用:执行SQL语句
执行DML和DDL语句 int executeUpdate(sql);
//DML语句返回影响的行数,DDL执行成功有可能返回0
执行DQL语句 ResultSet executeQuery(sql);//返回ResultSet结果集对象
结果集对象 封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql);//返回ResultSet结果集对象
获取查询结果
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class resultset {
public static void main(String[] args) throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
//2.获取连接
//String url="jdbc:mysql://127.0.0.1:3306/mybase";
//本机的mysql且端口为默认3306,可简写
String url="jdbc:mysql:///mybase";
String username="root";
String password="111111";
Connection conn= DriverManager.getConnection(url,username,password);
//3.定义SQL
String sql="select * from student";
//4.获取执行sql的对象 Statement
Statement stmt=conn.createStatement();
//5.执行sql
ResultSet rs=stmt.executeQuery(sql);
//6.处理结果
//6.1光标向下移动
while(rs.next()){
//6.2 获取数据 getXxx()
int id=rs.getInt(1);
String name=rs.getString(2);
int age=rs.getInt(3);
String sex=rs.getString(4);
String address=rs.getString(5);
System.out.println(id);
System.out.println(name);
System.out.println(age);
System.out.println(sex);
System.out.println(address);
System.out.println("-------------");
}
//7.释放资源
stmt.close();//先
conn.close();//后
}
}
继承自Statement
作用:预编译SQL语句并执行:预防SQL注入
SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
String name="' or '1'='1";
System.out.println(name);
//3.定义SQL
String sql="update student set age=18 where name='"+name+"'";
通过操作name,使得where语句恒为true
PreparedStatement的使用:
1.sql语句中的参数值用占位符?替代 where name = ?
2.获取PreparedStatement对象 PreparedStatement pstmt=conn.preparedStatement(sql);
3.设置参数 pstmt.setXxx(参数1,参数2);//给?赋值。
Xxx为数据类型,参数1为?的位置从1开始,参数2为?的值
4.执行SQL pstmt.executeUpdate();或executeQuery(); 不需要传参
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class preparedStatement {
public static void main(String[] args) throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
//2.获取连接
//String url="jdbc:mysql://127.0.0.1:3306/mybase";
//本机的mysql且端口为默认3306,可简写
String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";
String username="root";
String password="111111";
Connection conn= DriverManager.getConnection(url,username,password);
//3.定义SQL
String sql="update student set age=8 where name=?";
//4.获取执行sql的对象
PreparedStatement pstmt=conn.prepareStatement(sql);
//给?赋值
pstmt.setString(1,"wj");
//5.执行sql
int count=pstmt.executeUpdate();
//6.处理结果
System.out.println(count);
//7.释放资源
pstmt.close();//先
conn.close();//后
}
}
String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";
uesServerPrepStmts=true开启预编译功能
预编译,性能更高
相同模板的sql,只需要进行一次检查和编译
一个容器,负责分配、管理数据库连接
应用程序从连接池里面取出现有的数据库连接,不需要重新建立一个(资源再用,提高速度)
还会释放空闲时间过长的连接,避免遗漏
数据库连接池接口,由厂商实现
德鲁伊数据库连接池
配置文件
#druid???? driverClassName = com.mysql.jdbc.Driver #url url=jdbc:mysql://127.0.0.1:3306/mybase?&uesServerPrepStmts=true username=root password=111111 #初始化连接数 initialSize = 5 #最大连接数 maxActive = 10 #最大等待时间 maxWait = 3000
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class druid {
public static void main(String[] args) throws Exception{
//1.导入jar包druid
//2.定义配置文件druid.properties
//3.加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("src/druid.properties"));
//4.获取连接池对象
DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接
Connection conn= dataSource.getConnection();
System.out.println(conn);
//System.out.println(System.getProperty("user.dir"));
}
}