JDBC的一般步骤
第一步:下载数据库的驱动包;( mysql-connector-java-5.1.13-bin.jar)
第二步:导入驱动包到工程中;
第三步:使用驱动管理器加载驱动;
第四步:与数据库建立连接;
第五步:编写SQL命令,使用Statement对象封装起来;
第六步:执行sql命令,并处理结果集数据;
ResultSet executeQuery(String sql):执行查询操作,该方法返回一个结果集对象;
int executeUpdate(String sql):执行更新操作,该方法返回更新操作所影响的行数;
第七步:关闭资源;
资源的关闭原则:先开后关,后开先关。(ResultSet > Statement > Connection)
public class Demo01 {
public static void main(String[] args) {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 与数据库建立连接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/0707java", // 数据库的url地址
"root", // 用户名
"root"); // 密码
// 编写sql,使用Statement对象封装起来
stat = conn.createStatement();
// 调用executeXxx方法把sql发送给数据库执行
rs = stat.executeQuery("select * from emp");
// 遍历结果集,把结果集中的数据取出来
while (rs.next()) {
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
int mgrno = rs.getInt(4);
Date hiredate = rs.getDate(5);
double sal = rs.getDouble(6);
int deptno = rs.getInt(7);
System.out.println("empno = " + empno + ", ename = " + ename
+ ", job = " + job + ", mgr = " + mgrno + ", hiredate = "
+ hiredate + ", sal = " + sal + ", deptno = " + deptno);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭资源(关闭顺序:先开后关,后开先关)
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
ResultSet提供获取结果集数据的方法:
next():把指针移动到结果集的下一行,如果该行有数据则返回true,否则返回false;
getXxx(int columnIndex):根据列的索引获取某一列数据。索引从1开始。
getXxx(int columnName):根据列名获取某一列的数据。
JDK7新特性-自动资源释放
JDK1.7新特性:自动资源释放。只有资源类实现了AutoClosable接口,那么只要在try后面的小括号中定义该资源,当资源使用过完毕后,jvm会自动释放该资源,不需要我们手动释放。
try (
定义要释放的资源
) {
..
} catch(异常类型 异常变量) {
...
}
如果有多个需要释放资源的代码,多个资源之间使用英文分号隔开。
示例代码:
public class Demo012 {
public static void main(String[] args) {
try (
// 与数据库建立连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/0707java", // 数据库的url地址
"root", // 用户名
"root"); // 密码
// 编写sql,使用Statement对象封装起来
Statement stat = conn.createStatement();
// 调用executeXxx方法把sql发送给数据库执行
ResultSet rs = stat.executeQuery("select * from emp");
) {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 遍历结果集,把结果集中的数据取出来
while (rs.next()) {
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
int mgrno = rs.getInt(4);
Date hiredate = rs.getDate(5);
double sal = rs.getDouble(6);
int deptno = rs.getInt(7);
System.out.println("empno = " + empno + ", ename = " + ename
+ ", job = " + job + ", mgr = " + mgrno + ", hiredate = "
+ hiredate + ", sal = " + sal + ", deptno = " + deptno);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
PreparedStatement对象
sql注入:用户输入的数据作为sql语句的一部分执行。
使用PreparedStatement对象的好处:1)防止sql注入;2)提高sql语句的执行效率;
如何使用PreparedStatement对象?
第一步:通过Connection对象的prepareStatement方法获取预编译对象,该方法需要传入一个sql语句;
第二步:如果sql语句有参数,那么可以调用预编译对象的setXxx方法设置参数;
第三步:通过预编译对象的executeXxx方法执行数据库操作;
实战练习
创建DbUtils工具类
package demo20191025;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
* JDBC连接工具类
* */
public class DbUtil {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/class",
"root",
"123");
return conn;
}
}
package demo20191025;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/*
* 定义一个类,使用JDBC操作数据库。具体要求如下:
1)通过代码获得 Statement 对象并执行一条创表语句:创建一张学生表(id,姓名,性别)
execute(String sql)
executeQuery
executeUpdate
2)向学生表中添加 3 条记录。因为主键是自动增长,所以只需指定姓名和性别字段。
3)将 id 为 2 的用户,姓名更新为"猪八戒"
4)编写方法,查询学生表所有的学生,封装成 List<Student>返回
5)删除id为2的记录
* */
public class Demo01 {
private static ArrayList arrayList;
public static void main(String[] args) throws Exception {
// creatTable();
// insertUser();
// updateName();
// selectAll();
// deleteID();
}
//删除id为2的记录
private static void deleteID() {
Connection conn = null;
PreparedStatement ps = null;
String sql = "delete from user where id=2";
try {
conn = DemoDbUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.execute();
System.out.println("删除成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查询学生表所有的学生,封装成 List<Student>返回
public static void selectAll() throws Exception {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
new ArrayList<Object>();
String sql = "select * from user";
try {
conn = DemoDbUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
ArrayList<Student> list = new ArrayList<Student>();
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String sex = rs.getString("sex");
list.add(new Student(id, name, sex));
System.out.println();
}
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
//将 id 为 2 的用户,姓名更新为"猪八戒"
public static void updateName() {
Connection conn = null;
PreparedStatement ps = null;
String sql = "update user set name = '猪八戒' where id=2";
try {
conn = DemoDbUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.execute();
System.out.println("更改成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//向学生表中添加 3 条记录
public static void insertUser() {
Connection conn = null;
PreparedStatement ps = null;
String sql = "insert User(name,sex) values ('春娇', '女')";
String sql2 = "insert User(name,sex) values ('志明', '男')";
String sql3 = "insert User(name) values ('跟住')";
try {
conn = DemoDbUtil.getConnection();
ps = conn.prepareStatement(sql3);
ps.executeUpdate();
System.out.println("添加成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建学生表
public static void creatTable() {
Connection conn = null;
PreparedStatement ps = null;
String sql = "create table user(id int primary key auto_increment, name varchar(10), sex char(2) default '男')";
try {
conn = DemoDbUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.execute();
System.out.println("创建成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Student{
int id;
String name;
String sex;
public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "学生id:" + id + ", 姓名:" + name + ", 性别:" + sex;
}
}