JDBC连接数据库

mac2025-12-15  8

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;     } }

 

最新回复(0)