百度百科介绍:JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。各种不同类型的数据库都有相应的实现

JDBC编程步骤

1.装载相应的数据库的JDBC驱动并进行初始化

  • 导入专用的jar包(不同的数据可需要的jar包不同)
  • 初始化驱动
Class.forName("com.mysql.jdbc.Driver");
Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
jdbc4之后,可以自动加载驱动,不需要再使用Class.forName("com.mysql.cj.jdbc.Driver");的方式加载。只要直接抒写"连接数据"的语句即可

2.建立JDBC和数据库之间的Connection连接

这里需要提供:数据库所处于的ip:127.0.0.1 (这里是本机,如果连接其他电脑上的数据库,请改变该ip)
数据库的端口号: 3306 (mysql专用端口号)
数据库名称 exam(根据你自己数据库中的名称填写)
编码方式 UTF-8
账号 root
密码 admin(如果你在创建数据库的时候没有使用默认的账号和密码,请填写自己设置的账号和密码)
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/exam?characterEncoding=UTF-8","root","admin");

Connection是与特定数据库连接回话的接口,使用的时候需要导包,而且必须在程序结束的时候将其关闭。getConnection方法也需要捕获SQLException异常。


3.创建Statement或者PreparedStatement接口,执行SQL语句

  • 使用Statement接口
Statement接口创建之后,可以执行SQL语句,完成对数据库的增删改查。其中 ,增删改只需要改变SQL语句的内容就能完成,然而查询略显复杂。在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点,具体在下文中的对比中介绍。所以Statement在实际过程中使用的非常的少,所以具体的我们放道PreparedStatement那里给出详细代码。
字符串拼接方式的SQL语句是非常繁琐的,中间有很多的单引号和双引号的混用,极易出错。

Statement s = conn.createStatement();
// 准备sql语句
// 注意: 字符串要用单引号'
String sql = "insert into student values(null,"+"'小明')";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题
s.execute(sql);
System.out.println("执行插入语句成功");

  • 使用PreparedStatement接口
与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。

String sql = "insert into t_course(course_name) values(?)";//【增删改查自己根据需求写】
PreparedStatement  pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName); //给占位符赋值
pstmt.executeUpdate(); //执行
使用PreparedStatement时,他的SQL语句不再采用字符串拼接的方式,而是采用占位符的方式。“?”在这里就起到占位符的作用。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,数据库就不会再次编译,这样能够显著提高性能。
String sql = "update t_course set course_name =? where course_id=?";
后面需要用到PreparedStatement接口创建的pstmt的set方法给占位符进行赋值。注意一点,这里的参数索引是从1开始的。


下面看稍麻烦一点的一个查询操作:
/**
* 查询课程
*/
public List<Course> findCourseList(){
String sql = "select * from t_course order by course_id";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//自己创建一个集合对象用来存放查询到的数据
List<Course> courseList = new ArrayList<>();
try {
conn = DbUtil.getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
rs = (ResultSet) pstmt.executeQuery();
while (rs.next()){
int courseId = rs.getInt("course_id");
String courseName = rs.getString("course_name");
//每个记录对应一个对象
Course course = new Course();
course.setCourseId(courseId);
course.setCourseName(courseName);
//将对象放到集合中
courseList.add(course);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
///DbUtil这是自己写的一个工具类
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);        //必须关闭
}
return courseList;
}



4.处理和显示结果

执行查询语句,并把结果集返回给集合ResultSet【ResultSet有多种属性和方法,详情参考网上资料

ResultSet rs = s.executeQuery(sql);
利用While(ResultSet.next()){…}循环将集合ResultSet中的结果遍历出来。

ResultSet.getXX();     这里的get方法的括号里面可以填属性值,如下图代码中的course_id,还可以填该属性在数据表中的列号,从1开始编码,例如:course_id在我的t-courses数据表中位于第一列,所以执行get方法的时候,我除了代码段中写法外,还可以这样写int courseId = rs.getInt(1);但是不推荐使用列号的这种方式,因为一段数据表中个属性值得顺序发生变化,就会导致这里出错,而使用属性名则不会出现这样的问题。


5.释放资源

在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕之后是一定要进行关闭的。关闭的过程中遵循从里到外的原则。在增删改查的操作中都要用到这样的关闭操作。



另外,Statement和PreparedStatement的异同,execute和executeUpdate的区别等内容,这里做一些介绍。


Statement和PreparedStatement的异同及优缺点
同:两者都是用来执SQL语句的

异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。

PreparedStatement的优点:

1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。

2、其具有预编译机制,性能比statement更快。

3、其能够有效防止SQL注入攻击。
什么是sql注入:例如传参时id=1,而传入则刻意传入id=1 or 1=1,当使用拼接sql时就会发生问题。
具体解决方法:1、严格检查输入变量的类型和格式。2、过滤和转义特殊字符。3、利用预编译机制。具体参考网上资料

execute和executeUpdate和executeQuery的区别
相同点:二者都能够执行增加、删除、修改等操作。

不同点:

1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。

2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。

关于ResultSet executeQuery(String sql):

执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。



参考文章:https://blog.csdn.net/jungle_rao/article/details/81274720