一、什么是JDBC
- JDBC(Java Database Connection)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。
- 它是java程序与数据库系统通信的标准API,JDBC API使得开发人员可以使用纯java的方式来连接数据库,并执行操作。
二、JDBC的访问数据流程
- 驱动管理器 :加载JDBC驱动程序
Class.forName(“com.mysql.jdbc.Driver”);
- 连接数据库:建立数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "root", "密码");
- SQL语句:发送SQL查询
//编写SQL语句
String sql = "selectp.pid,pname,cname,city,birthday,height,weight,position,body,shoot,control from players as p inner join clubs as c on p.cid=c.cid inner join abilities as a on p.pid=a.pid";
//预编译指令
Statement st = con.createStatement();
- 结果集:得到查询结果
//返回结果集
ResultSet rs = st.executeQuery(sql);
//对结果进行遍历输出
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4)+ "\t" + rs.getDate(5) + "\t" + rs.getInt(6) + "\t" + rs.getInt(7) + "\t" + rs.getString(8)+ "\t" + rs.getInt(9) + "\t" + rs.getInt(10) + "\t" + rs.getInt(11));}
- 关闭:关闭结果集,关闭编译指令,关闭数据库连接
rs.close();//关闭结果集
st.close();//关闭编译指令
con.close();//关闭数据库连接
三、DriverManager 类
- DriverManager 是JDBC的管理层,作用于用户和驱动程序之间。
- DriverManager 跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。
四、Connection接口
- Connection与特定数据库的连接(会话),在连接上下文中执行SQL语句并且返回结果。
- DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上。
五、Statement接口
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:
- Statement 由createStatement创建,用于发送简单的SQL语句。(不带参数的)
- PreparedStatement 继承自Statement接口,由prepareStatement创建,用于发送含有一个或者多个数据参数的sql语句。
- PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般使用PreparedStatement。
- CallableStatement 继承自PreparedStatement。由方法prepareCall创建,用于调用存储过程。
- 常用的Statement方法
- execute():运行语句,返回是否有结果集
- executeQuery():运行select语句,返回ResultSet结果集
- executeUpdate():运行insert/update/delete 操作,返回更新的行数。
- useUnicode=true&characterEncoding=utf8加上这个防止中文乱码。
使用Statement的缺点 参数必须以字符串拼接。 SQL注入的危险。
为避免SQL注入,我们可以使用PreparedStatements.
//sql注入
//String id = “5 or 1=1”;
String sql1= “delete from user where id=”+id; stmt.execute(sql);
六、ResultSet
ResultSet rs = ps.executeQuery();
Statement 执行Sql语句时返回ResultSet结果集
ResultSet提供的检索不同类型字段的方法,常用的有:
- getString():获得在数据库里是varchar,char等数据类型的对象。
- getFloat():获得在数据库里是Float类型的对象。
- getDate():获得……Date类型对象
- getBoolean():获得……Boolean类型的对象。
依次关闭使用之对象及连接 – Result -> Statement -> Connection
七、JDBC综合练习,实现对数据库的增改删查动作
import java.sql.*;
/**
* @author lss
* JDBC练习1
*/
public class Demo1 {
public static void main(String[] args) {
findAll();
findId(4);
insert("insert into bank(name,money) values('梁三岁','6000')");
select();
}
private static void findAll(){
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.连接数据库
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/nbadb","root","root");
System.out.println(connection);
//3.SQL语句
String sql = "select * from players";
PreparedStatement pst = connection.prepareStatement(sql);
//4.返回结果集
ResultSet rs = pst.executeQuery();
//对结果集进行遍历
while (rs.next()){
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getDate(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getString(6)+"\t"+rs.getInt(7));
}
rs.close();
pst.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
private static void findId(int n){
try {
//1.加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立数据库连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/nbadb","root","root");
//3.编写SQl语句
String sql = "select * from players where pid=?";
//预编译指令
PreparedStatement pst = con.prepareStatement(sql);
pst.setInt(1,n);
//4.返回结果集
ResultSet rs = pst.executeQuery();
//对结果集进行遍历
while (rs.next()){
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getDate(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getString(6)+"\t"+rs.getInt(7));
}
rs.close();
pst.close();
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
private static void insert(String s){
try {
//1.加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立数据库连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
//3.编写SQL语句
String sql = s;
//预编译指令
PreparedStatement pst = con.prepareStatement(sql);
//4.执行预编译指令,得到返回值
int i = pst.executeUpdate();
System.out.println(i>0?"插入成功":"插入失败");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 使用内连接查询表
*/
private static void select(){
try {
//1.加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立数据库连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/nbadb","root","root");
//3.编写SQL语句
String sql = "select p.pid,pname,cname,city,birthday,height,weight,position,body,shoot,control from players as p inner join clubs as c on p.cid=c.cid inner join abilities as a on p.pid=a.pid";
//预编译指令
Statement st = con.createStatement();
//4.返回结果集
ResultSet rs = st.executeQuery(sql);
//对结果进行遍历输出
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t" + rs.getString(4)
+ "\t" + rs.getDate(5) + "\t" + rs.getInt(6) + "\t" + rs.getInt(7) + "\t" + rs.getString(8)
+ "\t" + rs.getInt(9) + "\t" + rs.getInt(10) + "\t" + rs.getInt(11));
}
rs.close();
st.close();
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
总结:
版权声明:本文为weixin_71107289原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。