JDBC连接的基本操作
1、在idea的pom.xml文件中加入Maven依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
添加完依赖后,点击鼠标右键->选择Maven->选择Reload Project
2、JDBC连接步骤
- 1)加载驱动
- 2)创建一个连接
- 3)创建Statement或PreparedStatement的对象
- 4)通过创建对象调用方法执行SQL语句
- 调用执行DQL(select)操作时,使用executeQuery方法,就会返回单个ResultSet对象
- 调用执行DML(insert,update,delete)操作时,使用executeUpdate方法,返回的是受影响的记录的条数
- 调用其他操作使用execute方法,返回的是布尔类型,表示执行的SQL语句有无返回值,true表示执行的SQL语句有返回值即有ResultSet对象,false表示执行的SQL语句没有返回值
- 5)如果是使用executeQuery方法,就会返回单个ResultSet对象,获得结果集,然后通过遍历ResultSet获取返回的记录
- 6)关闭连接
Statement示例代码
package MySQlJDBC;
import java.sql.*;
public class MySQLJDBCDemo {
public static void main(String[] args) throws Exception {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、创建连接
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/db1?useSSL=false", "root", "123456");
//3、创建Statement
Statement st = conn.createStatement();
//4、通过Statement执行SQL
ResultSet rs = st.executeQuery("select *from student limit 10");
//5、遍历ResultSet获取返回的记录
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
String clazz = rs.getString("clazz");
System.out.println(id + "," + name + "," + age + "," + gender + "," + clazz);
}
//6、关闭连接
st.close();
conn.close();
}
}
3、JDBC执行SQL的两种方式(Statement与PreparedStatement)
- 使用Statement对象
使用范围:当执行相似SQL(结构相同,具体值不同)语句的次数比较少
优点:语法简单
缺点:采用硬编码效率低,安全性较差。直接使用变量拼接SQL会造成SQL注入问题
原理:硬编码,每次执行时相似SQL都会进行编译 - 预编译PreparedStatement
使用范围:当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作…)语句一样,只是具体的值不一样,被称为动态SQL
优点:语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
缺点: 执行非相似SQL语句时,速度较慢。
原理:相似SQL只编译一次,减少编译次数
PreparedStatement示例代码
package MySQlJDBC;
import java.sql.*;
public class MySQLJDBCDemo {
public static void main(String[] args) throws Exception {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、创建连接
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/db1?useSSL=false", "root", "123456");
String clz="文科二班";
int age1=23;
//3、使用PreporeStatement避免SQL注入问题
PreparedStatement ps = conn.prepareStatement("select *from student where clazz=? and age>?");
//4、通过PreporeStatement执行SQL
//先设置参数,'?'从1开始编号
ps.setString(1,clz);
ps.setInt(2,age1);
//再执行sql
ResultSet rs = ps.executeQ