JDBC
JDBC简介
●JDBC就是使用Java语言操作关系型数据库的一套API
●全称:(Java DataBase Connectivity)Java数据库连接
JDBC本质:
●官方定义的一套操作所有关系型数据库的规则,即接口
●各个数据库厂商取去实现整个接口,提供数据库驱动jar包
●我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC好处:
●各个数据厂商使用相同的接口,Java代码不需要针对不同的数据库分别开发
●可随时替换底层数据库,访问数据库的Java代码基本不变
操作JDBC步骤
0.创建工程,导入驱动jar包
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
Connection conn=DiverManager.getConection(url,username,password);
3.定义SQL语句
String sql="update...";
4.获取执行SQL对象
Statement stmt=conn.creatStatement();
5.执行SQL
stmt.executeUpdate(sql);
6.处理返回结果
7.释放资源
示例代码
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动,在mysql5以上的jar包可以不用写
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://127.0.0.1:3306/itnie";
String usename="root";
String password="qwe456qwe";
Connection conn = DriverManager.getConnection(url, usename, password);
//3.定义sql
String sql="update account set money =3000 where id=1";
//4.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
//5.执行sql
int count=stmt.executeUpdate(sql);//受影响的行数
//6.处理结果
System.out.println(count);
//释放资源
stmt.close();
conn.close();
}
}
JDBC API详解
DriverManager
●DriverManager(驱动管理类)作用:
1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
Driver源码:
MySQL 5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/service/java.sql.Driver文件中的驱动类
2.获取数据库连接
DriverManager.getConnection(String url,String usename,String password)
参数:
1.url:连接路径
2.user:用户名
3.password:密码
Connection
●Connection(数据库连接对象)作用:
1.获取执行SQL对象
●普通执行SQL对象
Statement creatStatement()
●预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
●执行存储过程的对象
CallableStatement prepareCall(sql)
2.管理事务
●MySQL事务管理
●JDBC事务管理:Connection接口中定义了3个对应的方法
示例代码
public class JDBCDemoConnection {
public static void main(String[] args) throws Exception {
//获取连接
String url="jdbc:mysql://127.0.0.1:3306/itnie";
String usename="root";
String password="qwe456qwe";
Connection conn = DriverManager.getConnection(url, usename, password);
Statement stmt= conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);
//定义sql
String sql1="update account set money =2000 where id=1";
String sql2="update account set money =3000 where id=2";
//获取执行sql的对象Statement
stmt = conn.createStatement();
//执行sql
int count1=stmt.executeUpdate(sql1);
//处理结果
System.out.println(count1);
int count2=stmt.executeUpdate(sql2);
//处理结果
System.out.println(count2);
//未出现异常提交事务
conn.commit();
} catch (Exception e) {
//出现异常回滚事务
conn.rollback();
e.printStackTrace();
}
//释放资源
stmt.close();
conn.close();
}
Statement
●Statement作用:
1.执行SQL语句
ResultSet(结果集对象)作用:
封装了DQL查询语句的结果
●获取查询结果
示例代码:
public class JDBCDemo_ResultSet {
@Test
public void testResultSet() throws Exception {
//获取连接
String url="jdbc:mysql://127.0.0.1:3306/itnie";
String usename="root";
String password="qwe456qwe";
Connection conn = DriverManager.getConnection(url, usename, password);
//定义sql
String sql="select * from account";
//获取Statement对象
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//遍历rs中所有数据
while (rs.next()){
//获取数据
int id = rs.getInt("id");
String name = rs.getString("name");
double money = rs.getDouble("money");
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-------------");
}
//释放资源
rs.close();
stmt.close();
conn.close();
}
}
ResultSet案例
需求:查询account账户表数据,封装为Account对象中,并且存储到ArraysList集合中
代码实现:
/**
* 查询account账户表数据,封装为Account对象中,并且存储到ArraysList集合中
*1.定义实体类Account
*2.查询数据,封装到Account对象中
*3.将Account对象存入ArrayList集合中
*/
@Test
public void resultSet() throws Exception {
//获取连接
String url="jdbc:mysql://127.0.0.1:3306/itnie";
String usename="root";
String password="qwe456qwe";
Connection conn = DriverManager.getConnection(url, usename, password);
//定义sql
String sql="select * from account";
//获取Statement对象
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//创建集合
List<Account> list=new ArrayList<>();
while (rs.next()){
Account account=new Account();
//获取数据
int id = rs.getInt("id");
String name = rs.getString("name");
double money = rs.getDouble("money");
//赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
}
System.out.println(list);
//释放资源
rs.close();
stmt.close();
conn.close();
}
PreparedStatement
●PreparedStatement作用:
预编译SQL语句并执行:预防SQL注入问题
●SQL注入
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
代码实现:
public class JDBCDemo_Preparestatement {
@Test
public void login() throws Exception {
//获取连接
String url="jdbc:mysql://127.0.0.1:3306/itnie";
String usename="root";
String password="qwe456qwe";
Connection conn = DriverManager.getConnection(url, usename, password);
//接收用户输入的用户名和密码
String name="22FES2";
String pwd="aDWFA";
//定义sql
String sql="select * from tb_user where username= ? and password= ?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置 ?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs = pstmt.executeQuery();
//判断是否成功
if (rs.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
//释放资源
rs.close();
pstmt.close();
conn.close();
}
}
PreparedStatement原理
●PreparedStatement好处:
1.预编译SQL:性能更高
2.防止SQL注入:将敏感字符进行转义
①PreparedStatement预编译功能开启:useServerPrepstms=true
示例代码
String url="jdbc:mysql://127.0.0.1:3306/itnie?useServerPrepstms=true";
②配置MySQL执行日志(重启MySQL服务后生效)
PreparedStatement原理:
1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查、编译(这些步骤很耗时)
2.执行时就不用再进行这些步骤了,速度更快
3.如果sql模板一样,则只需要进行一次检查、编译