JDBC:使用JAVA语言操作关系型数据库的API。是一套标准的接口。
步骤
1.创建工程,导入驱动jar包
2.注册驱动:Class.forName("com.mysql.jdbc.Driver");
3.获取连接:Connection conn=DriverManager.getConnection(url,username,password);
4.定义SQL:String SQL=" ";
5.获取执行SQL对象:Statement stmt=conn.createStatement();
6.执行SQL:stmt.executeUpdate(sql);
7.处理返回结果
8.释放资源
怎么下载驱动jar包?
JDBC连接数据库报错
错误:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
翻译:加载类 'com.mysql.jdbc.Driver'.这已弃用。新的驱动程序类是“com.mysql.cj.jdbc.Driver”。驱动程序通过 SPI 自动注册,通常不需要手动加载驱动程序类。
原因:驱动名错误
解决方法:将'com.mysql.jdbc.Driver'替换为:com.mysql.cj.jdbc.Driver
代码:
package com.demo.jdbdDemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class jdbcDemo {
public static void main(String[] args) throws Exception {
//注册驱动
//驱动版本为8.x:"com.mysql.cj.jdbc.Driver"
//驱动版本为5.x:"com.mysql.jdbc.Driver"
Class.forName("com.mysql.jc.jdbc.Driver");
//获取连接
//url:需要连接的数据库url
//username:用户名
//password:密码
Connection conn= DriverManager.getConnection(url,username,password);
//定义SQL
String sql="select * from student s where s.stuname='张三'";
//获取执行SQL对象
Statement stmt=conn.createStatement();
//判断是否查询成功
if(stmt.execute(sql)){
System.out.println("查询成功");
}else {
System.out.println("没查询到数据");
}
//释放资源
stmt.close();
conn.close();
}
}
DriverManager
- 驱动管理类(工具类)
- 注册驱动
- 获取数据库连接
- 语法:jdbc:mysql://ip或者域名:端口号/数据库名称?参数键值对1&参数键值对2...
- 如果连接的是本机mysql服务器,并且端口为:3306,url可以简写为:jdbc:mysql:///数据库名称?键值对
- 配置useSSL=false参数,禁用安全连接方式,可以解决警告提示。jdbc:mysql://ip:3306/数据库名称?useSSL=false
Connection
数据库连接对象
1.获取执行SQL的对象
- 普通执行SQL对象:Statement createStatement();
- 预编译SQL的执行SQL对象,防止SQL注入:PreparedStatement prepareStatement(sql);
- 执行存储过程对象:CallableStatement prepareCall(sql)
2.管理事务
- a.mySQL事务管理
- 开启事务:begin,start transaction
- 提交事务:commit
- 回滚事务:rollback
b.JDBC事务管理
- 开启事务:setAutoCommit(boolean autoCommit);true-自动提交事务,false-手动提交事务,即开启事务
- 提交事务:commit();
- 回滚事务:rollback();
代码:
public class jdbc_Connection_Demo {
//Connection对象管理事务
public static void main(String[] args) throws Exception {
Connection conn= DriverManager.getConnection("jdbc:mysql://ip:3306/zl_db","用户名","密码");
//获取执行SQL对象
Statement stat= conn.createStatement();
try {
conn.setAutoCommit(false);//开启事务
String SQL="insert into student(id,stuname,stusex) values(4,'李四','男')";
stat.executeUpdate(SQL);
//int a=2/0;
conn.commit();
}catch (Exception e)
{
conn.rollback();//回滚事务
System.out.println("回滚事务");
e.printStackTrace();
}
}
}
Statement
- 用于执行SQL语句
- int executeUpdate(sql);//执行DML、DDL语句,insert、update、delete
- 返回值:DML返回受影响的行数,DDL语句执行后执行成功也可能返回0
- ResultSet executeQuery(sql);执行DQL语句
- 返回值:ResultSet结果集对象
ResultSet
1.封装DQL查询语句的结果
2.获取查询结果
- boolean next();//将光标从当前位置向前移动一行。判断当前行是否为有效行
- 返回值:true-有效行,当前行又数据。false-无效行,当前行没有数据
- xxx getXxx(参数):获取数据
- xxx:数据类型。如:int getInt(参数)...
- 参数:int:列的编号,从开始。String:列的名称
代码:
public class jdbc_Result_to_ArrayList {
//将Result对象封装成ArrayList对象
public static void main(String[] args) throws Exception {
Connection conn= DriverManager.getConnection("jdbc:mysql://ip3306/zl_db","用户名","密码");
//获取执行SQL对象
Statement stat= conn.createStatement();
String SQL="select * from student";
ResultSet resultSet=stat.executeQuery(SQL);
List<Student> list=new ArrayList<>();
//处理返回的结果,将结果值封装成ArrayList
while (resultSet.next()){//判断当前行是否为有效行
//创建集合对象
Student student=new Student();
student.setId(resultSet.getInt("id"));//id:数据库列名
student.setStuname(resultSet.getString("stuname"));
student.setStusex(resultSet.getString("stusex"));
list.add(student);
// 输出查询到的结果
// System.out.println(resultSet.getInt("id")+","
// +resultSet.getString("stuname")+","
// +resultSet.getString("stusex"));
// System.out.println("-------------");
}
//输出结果
System.out.println("编号\t姓名\t性别");
for (Student s:list
) {
System.out.println(s.getId()+","+s.getStuname()+","+s.getStusex());
}
}
}
PreparedStatement
- 继承Statement
- 预编译SQL语句并执行(性能高):预防SQL注入问题(会将敏感字符进行转义)
- SQL注入:通过操作输入来修改实现定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
1.获取PreparedStatement对象
- //SQL中的参数值使用问号:?占位符代替
String sql = "SELECT * FROM STUDENT S WHERE S.USERNAME=? and S.USERPASSWOR=?";
- //通过Connection对象获取,并传入对应的SQL语句:
PreparedStatement pstat=conn.prepareStatement(sql);
2.设置参数值
- PrepareStatement对象:setxxx(参数1,参数2):给?赋值
- xxx:数据类型;如setInt(参数1,参数2)
- 参数1:?的位置编号,从1开始
- 参数2:?的值
//设置?的参数
pstat.setString(1,username);
pstat.setString(2,userpassword);
3.执行SQL
- executeUpdate();/executeQuery();//不需要传递sql
4.原理
1.在获取PrepareStatement对象时,将sql语句发送给mysql服务器进行检查,编译(耗时)
2.执行时就不用再进行这些步骤,速度更快
3.如果sql模板一样,则只需要进行一次检查编译
PrepareStatement预编译功能开启:userServicePrepStmes=true(添加至连接url的参数列表)。预编译功能默认是关闭的
配置mysql执行日志(重启mysql服务后生效)。如何添加?mysql配置文件在哪
内容如下:
log-output=FILE
general-log=1
general_log_file=""//日志文件
slow_query-log=1
slow_query_log_file=""
long_query_time=2
数据库连接池
Druid的使用,步骤
1.导入jar包
2.定义配置文件
内容:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://ip:3306/zl_db?useSSL=false&userServerPrepStmts=true
username=用户名
password=密码
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
3.加载配置文件
4.获取连接对象
5.连接对象
代码:
public static void main(String[] args) throws Exception {
// System.out.println(System.getProperty("user.dir"));//查看文件所在的目录
//
try{
//获取连接对象
Properties prop=new Properties();
//加载配置文件
prop.load(new FileInputStream("src/Druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接Connection
Connection conn=dataSource.getConnection();
System.out.println("hhhh"+conn);
}catch (Exception e){
e.printStackTrace();
}
}
【报错信息】
com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited