定义:用java语言操纵关系型数据库的一套API
(用同一套java代码,操作不同的关系型数据库)
好处:
1)各个数据库厂商使用相同的接口,java代码不需要针对不同的数据库分别开发。
2)可随时替换底层数据库,访问数据库的java代码可以基本不变。
过程:
java代码——>jdbc(一套标准接口)——>MySql和Oracle实现类(驱动)
sun公司定义一套操作所有关系型数据库的规则,即接口。
各个数据商厂商取实现这套接口,提供数据库驱动jar包。
我们可以使用这套接口(jdbc)编程,真正执行的代码时驱动jar包的实现类。
{
//1.注册驱动
//导入jar包到dictionary
Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
String url="jdbc:mysql://127.0.0.1:3306/qq";
String username="root";
String password="123456";
Connection comm=DriverManager.getConnection(url,username,password);
//3.定义sql
String sql="updata cname=1 where cid=1";
//4.获取执行sql的对象
Statement stmt= comm.createStatement();
//5.执行sql
int count=stmt.executeUpdate(sql);//受影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
comm.close();
}
JDBC的API详解
DriverManger驱动管理类
注册驱动+获取数据库连接
注册驱动:
Mysql 5之后的驱动包可以不写注册驱动
Class.forName("com.mysql.jdbc.Driver");
//底层实现
static{
try{
DriverManager.registerDriver(new Driver());
}catch(SQLException var1)
throw new RuntimeException("Cannot register driver!");
}
获取连接:
DriverManger.getConnection(url,user,password);
url:
(1)语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2
jdbc:mysql://127.0.0.1:3306/db1
(2)细节:如果连接的是本机的mysql服务器,并且mysql的服务默认端口是3306.则url可以写成:jdbc:mysql:///数据库名称?参数键值对
(3)配置useSSL=false的安全参数,禁用安全连接方式,解决警告提示。
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
String url="jdbc:mysql:///qq?useSSL=false";
String username="root";
String password="123456";
Connection comm= DriverManager.getConnection(url,username,password);
Connection
数据库连接对象
1.获取执行SQL的对象
Statement createStatement();
//普通执行sql对象
PreparedStatement prepareStatement(sql);
//预编译SQL的执行SQL对象:放置SQL注入
CallableStatement prepareCall(sql);
//执行存储过程的对象
2.事务管理
//开始事务
setAutoCommit(boolean autoCommit):
true是自动提交事务 false是手动提交事务,也就是开启事务
//提交事务
commit();
//回滚事务
rollback();
{
//获取链接
String url="jdbc:mysql://127.0.0.1:3306/qq";
String username="root";
String password="123456";
Connection comm=DriverManager.getConnection(url,username,password);
String sql="updata cname=1 where cid=1";
Statement stmt= comm.createStatement();
try{
//开启事务
comm.setAutoCommit(false);
int count=stmt.executeUpdate(sql);//受影响的行数
System.out.println(count);
//提交事务
comm.commit();
}catch(Exception throwables){
//回滚事务
comm,rollback();
}
//7.释放资源
stmt.close();
comm.close();
}
Statement
执行sql语句
executeUpdate(sql):执行DDL和DML语句
返回值分别是0和DML语句影响的行数
ResultSet executeQuery(sql):执行DQL语句
返回值是ResultSet结果集对象
ResultSet
结果集对象(封装了DQL查询语句的结果)
ResultSet stmt.executeQueue(sql):执行完sql语句会返回ResultSet对象
获取查询结果:
boolean next():
1)将光标从当前位置往下移动一行
2)判断是否为有效行
返回值:1)true:有效行(当前行有数据)
2)flase:无效行(当前行没数据)
数据类型 getxxx(参数):获取数据
参数:
1)列的编号,从1开始
2)String:列的名称
//循环判断游标是否在最后一行
//光标向下移动一行并且判断改行是否有数据
while(re.next()){
//获取数据
rs.getxxx(参数);
}
案例:
查询account账户表的数据,封装为account对象,并且存储到Arraylist集合中。
PreparedStatement
预编译SQL语句并且执行,预防SQL注入问题。
SQL注入
通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
select *from user where username='name'and password='';
//输入' or '1'='1
select *from user where username='name'and password='' or '1'='1';
//通过拼接字符串修改
PreparedStatement作用
预编译SQL并且执行SQL语句
(1)获取PreparedStatement对象
//sql语句的参数值用?代替
String sql="select *from user where username=?and password=?;
//会产生转义现象
//通过connection对象获取,并且传入相应的sql语句
PreparedStatement ps=conn.preparedStatement(sql);
(2) 设置参数值
PreparedStatement对象:set数据类型(参数1,参数2):给?赋值
ps.setString(1,name);
ps.setString(2,id);
(3)执行sql对象
executeUpdate();//不需要再传递sql语句
好处
(预编译SQL,性能更高++防止SQL注入,转义敏感字符)
当使用java代码写出SQL语句之后发送到Mysql中,会检查Sql语法,编译Sql(转化为可执行的函数),执行Sql
1)PreparedStatement的预编译开启:useServerPrepStmts=true
2)配置MySql的执行目录,在重启服务器之后生效
原理
1.在获取对象的时候,将sql语句发送给mysql服务器进行检查编译
2.执行的时候不用再进行这些步骤,速度快
3.如果sql模板一样,则只需要进行一次检查,编译
数据库连接池
1)数据库连接池是个容器,负责分配和管理数据库连接(Connection)
2) 它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个
3) 释放空闲时间超过最大空闲时间的数据库来避免没有释放数据库连接引起的数据库连接泄漏问题。
好处:资源重用+提升系统的响应速度+避免数据库连接泄漏
标准接口:DataSource
sun公司提供的数据库连接池标准接口,由第三方组织实现这个接口
Connection getConnection();//获取连接
德鲁伊Druid连接池功能强大是java最好的数据库连接池之一。
//导入jar包
//定义配置文件
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream(""));
//获取连接池对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
//获取对应数据库连接
Connection connection=dataSource.getConnection();