JDBC-用Java语句操作数据库

Posted qq308015824

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC-用Java语句操作数据库相关的知识,希望对你有一定的参考价值。

JDBC

1. Jdbc概述

问题:实际开发中,不可能用工具或者命令行操作数据库,数据库表中的数据最终要使用Java程序来操作,那么Java中如何操作数据库中的数据呢?

Java语言中,有一个专门连接数据库的规范(JDBC),专门负责连接数据库进行数据操作的规范

 

JDBC只是SUN编写的一堆接口(规范的体现),SUN公司自己并没有实现

 

问题 为什么SUN只定义一个JDBC规范,而不实现呢?

因为市面上的数据库很多,每个数据库内部接口不会向外暴露,而且即便是暴露让SUN去实现,市面上很多数据库全部要SUN来实现不现实

 

实际中哪个数据库需要支持JAVA语言,就需要自己实现JavaJDBC规范,因为实现了JDBC很多接口,那么就会有很多实现类,而很多实现类在java中会使用一个专门的包封装起来,叫做jar(在JDBC中叫做驱动包),各大数据库产商实现JDBC规范以后都会把他们jar包放在官网上以供开发者下载使用

 

1.1. JDBC

JDBC(Java DataBase Connectivity):

是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基

JDBC规范对应的api

技术图片

2.java连接数据库

以连接mysql为例

2.1. 创建普通java项目

2.2. 在项目下面新建一个lib目录

 

技术图片

技术图片

 

2.3. MySQL驱动包拷贝到项目中并添加依赖

技术图片

 

技术图片

2.5 获取数据库连接对象

准备:

1.拷贝MySQL的驱动包到项目中去:mysql-connector-java-5.1.x-bin.jar

2.build path,告速项目去哪里去找字节码文件.

--------------------------------------------------------------------------------

操作JDBC的第一步,获取JDBC的连接对象.:Connection.

 

步骤:

  1.加载注册驱动.

    就是把驱动中的Driver字节码加载到JVM.

   Class.forName("com.mysql.jdbc.Driver");

   为什么这句话就可以加载注册驱动?

   第一步:com.mysql.jdbc.Driver.class这份字节码加载到JVM.

   第二步:当一份字节码被加载进JVM,马上就会执行该字节码中的静态代码块.

    第三步:该静态代码中,就在完成,先创建驱动对象,再注册.

  2.通过DriverManager获取连接对象.

    public static Connection getConnection(String url,String user,String password)

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbName","root","admin");

 

jdbc:mysql://localhost:3306/dbName

jdbc:mysql:// :连接MySQL数据库的协议,不同数据库协议不一样

localhost:3306 :数据库软件的主机和端口

dbName  具体要连接数据库

    若数据库安装在本机,并且端口是默认的3306,则可以简写:

    Connection conn = DriverManager.getConnection("jdbc:mysql:///dbName","root","admin");

 

验证已经获取连接:可以在MySQL控制台,使用命令:show processlist; 查看MySQL运行进程.

 

技术图片

 

 1 public class GetConnectionDemo {
 2     public static void main(String[] args) throws Exception {
 3         
 4         //1.加载注册驱动 : 把当前类对应的字节码加载到JVM中
 5         Class.forName("com.mysql.jdbc.Driver");
 6         //2.获取数据库连接
 7         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 8         System.out.println(conn);
 9         
10     }
11 }

 

3. 创建表-DDL操作

在其他操作之间先要把数据库表要创建出来

/贾琏欲执事

创建一张t_student表:

id:

name:

age:

 

 

 1 //DML : 对表数据的增删改操作
 2 public class DMLDemo {
 3 
 4     /*
 5      * 向 t_student表中插入一条数据 
 6      * sql : insert into t_student(name,age) values (‘乔峰‘,30)
 7      */
 8     @Test
 9     public void testInsert() throws Exception {
10         String sql = "insert into t_student(name,age) values (‘乔峰‘,30)";
11         
12         // 1.加载注册驱动
13         Class.forName("com.mysql.jdbc.Driver");
14 
15         // 2.获取数据库连接对象
16         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
17         // 3.创建语句对象
18         Statement st = conn.createStatement();
19         
20         // 4.执行SQL语句
21         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
22         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
23         int rows = st.executeUpdate(sql);
24         System.out.println(rows);
25         //5.释放资源(先开后关)
26         st.close();
27         conn.close();
28 
29     }
30     /*
31      * 删除操作: 删除t_student表中的某一条数据
32      * SQL :delete from t_student where id = 2
33      */
34     @Test
35     public void testDelete() throws Exception {
36         String sql = "delete from t_student where id = 2";
37         
38         // 1.加载注册驱动
39         Class.forName("com.mysql.jdbc.Driver");
40 
41         // 2.获取数据库连接对象
42         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
43         // 3.创建语句对象
44         Statement st = conn.createStatement();
45         
46         // 4.执行SQL语句
47         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
48         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
49         int rows = st.executeUpdate(sql);
50         System.out.println(rows);
51         //5.释放资源(先开后关)
52         st.close();
53         conn.close();
54     }
55     /*
56      * 修改操作 : 修改t_student表中的某一条数据
57      * SQL : update t_student set name = ‘虚竹‘,age = 50 where id = 3
58      */
59     @Test
60     public void testUpdate() throws Exception {
61         String sql = "update t_student set name = ‘虚竹‘,age = 50 where id = 3";
62         
63         // 1.加载注册驱动
64         Class.forName("com.mysql.jdbc.Driver");
65 
66         // 2.获取数据库连接对象
67         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
68         // 3.创建语句对象
69         Statement st = conn.createStatement();
70         
71         // 4.执行SQL语句
72         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
73         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
74         int rows = st.executeUpdate(sql);
75         System.out.println(rows);
76         //5.释放资源(先开后关)
77         st.close();
78         conn.close();
79     }
80 }

 

4.DML操作-表数据的增删改

 

 1 //DML : 对表数据的增删改操作
 2 public class DMLDemo {
 3 
 4     /*
 5      * 向 t_student表中插入一条数据 
 6      * sql : insert into t_student(name,age) values (‘乔峰‘,30)
 7      */
 8     @Test
 9     public void testInsert() throws Exception {
10         String sql = "insert into t_student(name,age) values (‘乔峰‘,30)";
11         
12         // 1.加载注册驱动
13         Class.forName("com.mysql.jdbc.Driver");
14 
15         // 2.获取数据库连接对象
16         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
17         // 3.创建语句对象
18         Statement st = conn.createStatement();
19         
20         // 4.执行SQL语句
21         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
22         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
23         int rows = st.executeUpdate(sql);
24         System.out.println(rows);
25         //5.释放资源(先开后关)
26         st.close();
27         conn.close();
28 
29     }
30     /*
31      * 删除操作: 删除t_student表中的某一条数据
32      * SQL :delete from t_student where id = 2
33      */
34     @Test
35     public void testDelete() throws Exception {
36         String sql = "delete from t_student where id = 2";
37         
38         // 1.加载注册驱动
39         Class.forName("com.mysql.jdbc.Driver");
40 
41         // 2.获取数据库连接对象
42         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
43         // 3.创建语句对象
44         Statement st = conn.createStatement();
45         
46         // 4.执行SQL语句
47         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
48         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
49         int rows = st.executeUpdate(sql);
50         System.out.println(rows);
51         //5.释放资源(先开后关)
52         st.close();
53         conn.close();
54     }
55     /*
56      * 修改操作 : 修改t_student表中的某一条数据
57      * SQL : update t_student set name = ‘虚竹‘,age = 50 where id = 3
58      */
59     @Test
60     public void testUpdate() throws Exception {
61         String sql = "update t_student set name = ‘虚竹‘,age = 50 where id = 3";
62         
63         // 1.加载注册驱动
64         Class.forName("com.mysql.jdbc.Driver");
65 
66         // 2.获取数据库连接对象
67         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
68         // 3.创建语句对象
69         Statement st = conn.createStatement();
70         
71         // 4.执行SQL语句
72         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
73         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
74         int rows = st.executeUpdate(sql);
75         System.out.println(rows);
76         //5.释放资源(先开后关)
77         st.close();
78         conn.close();
79     }
80 }

5. DQL操作-查询操作

 

5.1. 查询操作的分析

技术图片

 

 

5.2 查询具体操作

 

结果集的列的位置

技术图片

 

 

1.使用 rs.next() 偏移光标,循环指定具体的某一行

获取数据的具体方法

 Object

getObject(int columnIndex) 
 columnIndex : 通过结果集的位置(1开始)获取对应的数据

 Object

getObject(String columnLabel) 
columnLabel : 通过结果集的 列名获取对应的数据

 

 

 

  1 package cn.sxt.jdbc._01connection;
  2 
  3 
  4 import java.sql.Connection;
  5 import java.sql.DriverManager;
  6 import java.sql.ResultSet;
  7 import java.sql.Statement;
  8 import java.util.ArrayList;
  9 import java.util.List;
 10 
 11 import org.junit.Test;
 12 
 13 //DQL :查询操作
 14 public class D_DQLDemo {
 15     
 16     /*
 17      * 多行查询 :查询t_student表中的所有数据
 18      * SQL : select * from t_student
 19      */
 20     @Test
 21     public void testList() throws Exception {
 22         String sql = "select * from t_student";
 23         
 24         // 1.加载注册驱动
 25         Class.forName("com.mysql.jdbc.Driver");
 26 
 27         // 2.获取数据库连接对象
 28         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 29         // 3.创建语句对象
 30         Statement st = conn.createStatement();
 31         
 32         // 4.执行SQL语句
 33         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
 34         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
 35         ResultSet rs = st.executeQuery(sql);
 36         
 37         
 38         //创建list集合用于封装Student对象
 39         List<Student> stus = new ArrayList<>();
 40         
 41         while(rs.next()) {
 42             //1.通过结果集的位置获取对应的数
 43             /*Object id = rs.getObject(1);
 44             Object name = rs.getObject(2);
 45             Object age = rs.getObject(3);*/
 46             
 47             //2.通过结果集的 列名获取对应的数据
 48             /*Object id = rs.getObject("id");
 49             Object name = rs.getObject("name");
 50             Object age = rs.getObject("age");*/
 51             //3.通过数据库数据和Java对应的数据类型获取对应的只
 52             int id = rs.getInt("id");
 53             String name = rs.getString("name");
 54             int age = rs.getInt("age");
 55             //System.out.println(id+","+name+","+age);
 56             
 57             //将获取的数据封装成对应的Student对象
 58             Student stu = new  Student(id, name, age);
 59             
 60             //将一个个Student对象添加到list集合中
 61             stus.add(stu);
 62         }
 63         
 64         for (Student student : stus) {
 65             System.out.println(student);
 66         }
 67         //5.释放资源(先开后关)
 68         rs.close();
 69         st.close();
 70         conn.close();
 71     }
 72     
 73     
 74     /*
 75      * 单行查询: 查询出t_student 指定id的信息
 76      * SQL : select * from t_student where id = 1;
 77      */
 78     @Test
 79     public void testGetOne() throws Exception {
 80         String sql = "select * from t_student where id = 2";
 81         
 82         // 1.加载注册驱动
 83         Class.forName("com.mysql.jdbc.Driver");
 84 
 85         // 2.获取数据库连接对象
 86         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 87         // 3.创建语句对象
 88         Statement st = conn.createStatement();
 89         
 90         // 4.执行SQL语句
 91         // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
 92         // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
 93         ResultSet rs = st.executeQuery(sql);
 94         
 95         if(rs.next()) {
 96             //1.通过结果集的位置获取对应的数
 97             /*Object id = rs.getObject(1);
 98             Object name = rs.getObject(2);
 99             Object age = rs.getObject(3);*/
100             
101             //2.通过结果集的 列名获取对应的数据
102             /*Object id = rs.getObject("id");
103             Object name = rs.getObject("name");
104             Object age = rs.getObject("age");*/
105             //3.通过数据库数据和Java对应的数据类型获取对应的只
106             int id = rs.getInt("id");
107             String name = rs.getString("name");
108             int age = rs.getInt("age");
109             //System.out.println(id+","+name+","+age);
110             
111             //将获取的数据封装成对应的Student对象
112             Student stu = new  Student(id, name, age);
113             System.out.println(stu);
114         }
115         //5.释放资源(先开后关)
116         rs.close();
117         st.close();
118         conn.close();    
119     }
120 }

 

6. 预编译语句对象PreparedStatment

问题 我们有了Statment对象可以执行SQL,为什么还要使用PreparedStatment

 

优势

  1. SQL语句结构清晰,参数的设置和SQL语句分离
  2. 性能更高
  3. 防止SQL注入

 

Statement: 表示静态SQL语句对象.

PreparedStatement:Statement的子接口,表示预编译SQL语句对象. 通过占位符(?)来拼SQL.  

6.1 创建PreparedStatement

创建语句对象 Statment

 Statement

createStatement() 
创建一个 Statement 对象来将 SQL 语句发送到数据库。

 

创建预编译语句对象PreparedStatement

 

 PreparedStatement

prepareStatement(String sql) 
创建预编译语句对象,SQL是带有占位符的SQL模板.

 

以上是关于JDBC-用Java语句操作数据库的主要内容,如果未能解决你的问题,请参考以下文章

Jdbc语法

JDBC'

JDBC回顾

day11-JDBC

JDBC入门

Jdbc