JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。访问MySQL数据库需要用到第三方的jar包(mysql-connector-java-5.1.6.jar)。
JDBC的使用比较简单。
public class Demo {
public static void main(String[] args) throws Exception{
//加载驱动 该方法并没有返回值,只是使用反射将驱动类加载到JVM中。
Class.forName("com.mysql.jdbc.Driver");
//通过DriverManager获取Connection 数据库需存在
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysqldemo?charset=utf8", "账号", "密码");
//定义SQL语句
String sql = "create table user("
+ "id int primary key auto_increment,"
+ "name varchar(10) not null,"
+ "age int not null)";
//执行SQL语句
Statement statement = connection.createStatement();
statement.execute(sql);
//记得释放资源
statement.close();
connection.close();
}
}
在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点。所以Statement在实际过程中使用的非常的少,一般都是使用PreparedStatement来执行SQL语句。PreparedStatement对于Statement的主要区别在于预处理,SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。
//定义SQL语句
String sql = "insert into user(name,age) values(?,?)";
//执行SQL语句
PreparedStatement prepareStatement = connection.prepareStatement(sql);
//设置参数,第一个int值表示sql语句中的第几个占位符 ? ,后面接参数值
prepareStatement.setString(1, "胡");
prepareStatement.setInt(2,22);
//executeUpdate方法返回影响行数
int count = prepareStatement.executeUpdate();
System.out.println("该操作影响了" + count + "行!");
在 PreparedStatement
对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。一些预处理过的语句返回多个结果,使用execute
方法处理这些复杂的语句,executeQuery
和 executeUpdate
处理形式更简单的语句。
executeUpdate
一般用于处理增、删、改语句,该方法会返回执行语句后影响的行数。若需要执行需要返回结果的查询语句,则需要使用execute
方法或executeQuery
方法。
//执行SQL语句
// Statement statement = connection.createStatement();
// boolean execute = statement.execute(sql);
// if(execute) {
// ResultSet resultSet = statement.getResultSet();
// while(resultSet.next()) {
// int id = resultSet.getInt("id");
// String name = resultSet.getString("name");
// int age = resultSet.getInt("age");
// System.out.println("id:" + id + " name:" + name + " age:" + age);
// }
// }
PreparedStatement prepareStatement = connection.prepareStatement(sql);
ResultSet resultSet = prepareStatement.executeQuery();
while(resultSet.next()) {
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
int age = resultSet.getInt(3);
System.out.println("id:" + id + " name:" + name + " age:" + age);
}

execute
方法返回一个 boolean
值,指示第一个结果的形式。如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false。必须调用 getResultSet
或 getUpdateCount
方法获取该结果,必须调用 getMoreResults
获取任何后续结果。
executeQuery
方法会返回一个resultSet对象,查询的结果集会封装在该对象中。
总结
Statement和PreparedStatement的异同及优缺点
同:两者都是用来执SQL语句的
异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。
PreparedStatement的优点:
1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
2、其具有预编译机制,性能比statement更快。
3、其能够有效防止SQL注入攻击。
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。