1.jdbc快速入门
且导入mysql包时一定要 Add as Library选择
package com.itheima;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接 如果是本地数据库且端口号为3306 则可以省略
//String url="jdbc:mysql://127.0.0.1:3306/dbl";
String url="jdbc:mysql:///dbl?useSSL=false";
String username="root";
String pssward="1234";
Connection conn= DriverManager.getConnection(url,username,pssward);
//3.定义SQL
String sql1="update emp set salary=7000 where id=1001";
String sql2="update emp set salary=6000 where id=1002";
//4.获取执行sql对象的对象Statement
Statement stmt= conn.createStatement();
//5.执行sql
try {
//开启事务
conn.setAutoCommit(false);
int count1= stmt.executeUpdate(sql1);
System.out.println(count1);
int w=3/0;
int count2= stmt.executeUpdate(sql2);
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception throwables) {
//回滚事务
conn.rollback();
}
//6.处理结果
//7.关闭资源
stmt.close();
conn.close();
}
}
2.JDBC API详解
1.DriverManager
- 1.MySQL 5之后的驱动包,可以省略注册驱动的步骤--------Class.forName(“com.mysql.jdbc.Driver”);
-
url : 连接路径
-
user :用户名
-
poassword :密码
2.Connection
Connection(数据库连接对象)作用:
- 获取执行 SQL 的对象 ------------------------- Statement stmt= conn.createStatement();
- 管理事务----- //开启事务conn.setAutoCommit(false);----提交事务conn.commit();–回滚事务conn.rollback();
3.Statement
Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。
- 执行DDL、DML语句
- 执行DQL语句
4.ResultSet
封装了SQL查询语句的结果。
而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:
那么我们就需要从 ResultSet
对象中获取我们想要的数据。ResultSet
对象提供了操作查询结果数据的方法,如下:
package com.itheima;
import com.itheima.pojo.Account;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Result_demo1 {
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接 如果是本地数据库且端口号为3306 则可以省略
//String url="jdbc:mysql://127.0.0.1:3306/dbl";
String url="jdbc:mysql:///dbl?useSSL=false";
String username="root";
String pssward="1234";
Connection conn= DriverManager.getConnection(url,username,pssward);
//3.定义SQL
String sql1="select * from account";
Statement stm = conn.createStatement();
ResultSet res = stm.executeQuery(sql1);
Account ac=new Account();
List<Account> list=new ArrayList<>();
while(res.next()){
int i=res.getInt(1);
String name =res.getString(2);
Double monkey =res.getDouble(3);
ac.setId(i);
ac.setMonkey(monkey);
ac.setName(name);
list.add(ac);
}
System.out.println(list);
res.close();
stm.close();
conn.close();
}
}
5.PreparedStatement
SQL注入问题’ or ‘1’ ='1
PreparedStatement对象.
上面的sql语句中参数使用 ? 进行占位,在之前之前肯定要设置这些 ? 的值。
执行SQL语句
package com.itheima;
import com.itheima.pojo.Account;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Result_demo1 {
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接 如果是本地数据库且端口号为3306 则可以省略
//String url="jdbc:mysql://127.0.0.1:3306/dbl";
String url="jdbc:mysql:///dbl?useSSL=false";
String username="root";
String pssward="1234";
Connection conn= DriverManager.getConnection(url,username,pssward);
//3.定义SQL
String sql1="select * from emp where id=? and job_id=?";
int id=1001;
int job_id=4;
PreparedStatement pstm = conn.prepareStatement(sql1);
pstm.setInt(1,id);
pstm.setInt(2,job_id);
ResultSet rs = pstm.executeQuery();
while(rs.next()){
String is=rs.getString(2);
int id1=rs.getInt(1);
int id2=rs.getInt(3);
System.out.println(is);
System.out.println(id1);
System.out.println(id2);
}
rs.close();
pstm.close();
conn.close();
}
}
PreparedStatement原理:
1.PreparedStatement 好处:
- 预编译SQL,性能更高
- 防止SQL注入:将敏感字符进行转义
- 开启预编译功能
在代码中编写url时需要加上以下参数。而我们之前根本就没有开启预编译功能,只是解决了SQL注入漏洞.
3.数据库连池
1.数据库连接池介绍
数据库连接池是一个容器,不需要创建连接对象,直接从连接池中进行取,用完之后进行归还。
1.好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏 ------当有人一直占用后就会进行取回
2.常见的数据库连接池:
- DBCP
- C3P0
- Druid
我们现在使用更多的是Druid,它的性能比其他两个会好一些。
3.Druid(德鲁伊):
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一