第一步:下载数据库的驱动包;( 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):根据列名获取某一列的数据。
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(); } } }
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; } }
