首页 > 数据库技术 > 详细

JDBC

时间:2019-05-18 23:54:44      阅读:215      评论:0      收藏:0      [点我收藏+]

1.jdbc概述

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

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

 

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

 

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

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

 

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

 

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

 JDBC规范对应的api

 技术分享图片

2. 入门案例

1)连接数据库

 

案例使用JDBC操作MySQL数据库

 

2)创建普通java项目

 

3)在项目下面新建一个lib目录

技术分享图片

技术分享图片

4) MySQL驱动包拷贝到项目中并添加依赖

 技术分享图片

技术分享图片

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 
 3 public static void main(String[] args) throws Exception {
 4 
 5  
 6 
 7 //1.加载注册驱动 : 把当前类对应的字节码加载到JVM中
 8 
 9 Class.forName("com.mysql.jdbc.Driver");
10 
11 //2.获取数据库连接
12 
13 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
14 
15 System.out.println(conn);
16 
17  
18 
19 }
20 
21 }

3.创建表-DDL操作

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

创建一张t_student:

id:

name:

age:

 

 1 /*
 2 
 3  *
 4 
 5  * 创建表操作
 6 
 7  * SQL : create table t_student (id int primary key auto_increment,name varchar(50),age int)
 8 
 9  */
10 
11  
12 
13 public static void main(String[] args) throws Exception {
14 
15 String sql = "create table t_student (id int primary key auto_increment,name varchar(50),age int)";
16 
17 //贾琏欲执事
18 
19 //1,加载注册驱动
20 
21 Class.forName("com.mysql.jdbc.Driver");
22 
23 //2,获取数据库连接
24 
25 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
26 
27 //3,创建语句对象(用于执行SQL语句的对象)
28 
29 Statement st = conn.createStatement();
30 
31 //4, 执行SQL语句
32 
33 //int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
34 
35 //ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
36 
37 st.executeUpdate(sql);
38 
39 //5,释放资源(先开后关)
40 
41 st.close();
42 
43 conn.close();
44 
45 }

 

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

  1 //DML : 对表数据的增删改操作
  2 
  3 public class DMLDemo {
  4 
  5  
  6 
  7 /*
  8 
  9  * 向 t_student表中插入一条数据
 10 
 11  * sql : insert into t_student(name,age) values (‘乔峰‘,30)
 12 
 13  */
 14 
 15 @Test
 16 
 17 public void testInsert() throws Exception {
 18 
 19 String sql = "insert into t_student(name,age) values (‘乔峰‘,30)";
 20 
 21  
 22 
 23 // 1.加载注册驱动
 24 
 25 Class.forName("com.mysql.jdbc.Driver");
 26 
 27  
 28 
 29 // 2.获取数据库连接对象
 30 
 31 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 32 
 33 // 3.创建语句对象
 34 
 35 Statement st = conn.createStatement();
 36 
 37  
 38 
 39 // 4.执行SQL语句
 40 
 41 // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
 42 
 43 // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
 44 
 45 int rows = st.executeUpdate(sql);
 46 
 47 System.out.println(rows);
 48 
 49 //5.释放资源(先开后关)
 50 
 51 st.close();
 52 
 53 conn.close();
 54 
 55  
 56 
 57 }
 58 
 59 /*
 60 
 61  * 删除操作: 删除t_student表中的某一条数据
 62 
 63  * SQL :delete from t_student where id = 2
 64 
 65  */
 66 
 67 @Test
 68 
 69 public void testDelete() throws Exception {
 70 
 71 String sql = "delete from t_student where id = 2";
 72 
 73  
 74 
 75 // 1.加载注册驱动
 76 
 77 Class.forName("com.mysql.jdbc.Driver");
 78 
 79  
 80 
 81 // 2.获取数据库连接对象
 82 
 83 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 84 
 85 // 3.创建语句对象
 86 
 87 Statement st = conn.createStatement();
 88 
 89  
 90 
 91 // 4.执行SQL语句
 92 
 93 // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
 94 
 95 // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
 96 
 97 int rows = st.executeUpdate(sql);
 98 
 99 System.out.println(rows);
100 
101 //5.释放资源(先开后关)
102 
103 st.close();
104 
105 conn.close();
106 
107 }
108 
109 /*
110 
111  * 修改操作 : 修改t_student表中的某一条数据
112 
113  * SQL : update t_student set name = ‘虚竹‘,age = 50 where id = 3
114 
115  */
116 
117 @Test
118 
119 public void testUpdate() throws Exception {
120 
121 String sql = "update t_student set name = ‘虚竹‘,age = 50 where id = 3";
122 
123  
124 
125 // 1.加载注册驱动
126 
127 Class.forName("com.mysql.jdbc.Driver");
128 
129  
130 
131 // 2.获取数据库连接对象
132 
133 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
134 
135 // 3.创建语句对象
136 
137 Statement st = conn.createStatement();
138 
139  
140 
141 // 4.执行SQL语句
142 
143 // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
144 
145 // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
146 
147 int rows = st.executeUpdate(sql);
148 
149 System.out.println(rows);
150 
151 //5.释放资源(先开后关)
152 
153 st.close();
154 
155 conn.close();
156 
157 }
158 
159 }

 5.DQL操作-查询操作

1) 查询操作的分析

技术分享图片

2)查询具体操作

结果集的列的位置

 技术分享图片

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

获取数据的具体方法

 Object

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

 Object

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

 

  1 package cn.sxt.jdbc._01connection;
  2 
  3  
  4 
  5  
  6 
  7 import java.sql.Connection;
  8 
  9 import java.sql.DriverManager;
 10 
 11 import java.sql.ResultSet;
 12 
 13 import java.sql.Statement;
 14 
 15 import java.util.ArrayList;
 16 
 17 import java.util.List;
 18 
 19  
 20 
 21 import org.junit.Test;
 22 
 23  
 24 
 25 //DQL :查询操作
 26 
 27 public class D_DQLDemo {
 28 
 29  
 30 
 31 /*
 32 
 33  * 多行查询 :查询t_student表中的所有数据
 34 
 35  * SQL : select * from t_student
 36 
 37  */
 38 
 39 @Test
 40 
 41 public void testList() throws Exception {
 42 
 43 String sql = "select * from t_student";
 44 
 45  
 46 
 47 // 1.加载注册驱动
 48 
 49 Class.forName("com.mysql.jdbc.Driver");
 50 
 51  
 52 
 53 // 2.获取数据库连接对象
 54 
 55 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 56 
 57 // 3.创建语句对象
 58 
 59 Statement st = conn.createStatement();
 60 
 61  
 62 
 63 // 4.执行SQL语句
 64 
 65 // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
 66 
 67 // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
 68 
 69 ResultSet rs = st.executeQuery(sql);
 70 
 71  
 72 
 73  
 74 
 75 //创建list集合用于封装Student对象
 76 
 77 List<Student> stus = new ArrayList<>();
 78 
 79  
 80 
 81 while(rs.next()) {
 82 
 83 //1.通过结果集的位置获取对应的数
 84 
 85 /*Object id = rs.getObject(1);
 86 
 87 Object name = rs.getObject(2);
 88 
 89 Object age = rs.getObject(3);*/
 90 
 91  
 92 
 93 //2.通过结果集的 列名获取对应的数据
 94 
 95 /*Object id = rs.getObject("id");
 96 
 97 Object name = rs.getObject("name");
 98 
 99 Object age = rs.getObject("age");*/
100 
101 //3.通过数据库数据和Java对应的数据类型获取对应的只
102 
103 int id = rs.getInt("id");
104 
105 String name = rs.getString("name");
106 
107 int age = rs.getInt("age");
108 
109 //System.out.println(id+","+name+","+age);
110 
111  
112 
113 //将获取的数据封装成对应的Student对象
114 
115 Student stu = new  Student(id, name, age);
116 
117  
118 
119 //将一个个Student对象添加到list集合中
120 
121 stus.add(stu);
122 
123 }
124 
125  
126 
127 for (Student student : stus) {
128 
129 System.out.println(student);
130 
131 }
132 
133 //5.释放资源(先开后关)
134 
135 rs.close();
136 
137 st.close();
138 
139 conn.close();
140 
141 }
142 
143  
144 
145  
146 
147 /*
148 
149  * 单行查询: 查询出t_student 指定id的信息
150 
151  * SQL : select * from t_student where id = 1;
152 
153  */
154 
155 @Test
156 
157 public void testGetOne() throws Exception {
158 
159 String sql = "select * from t_student where id = 2";
160 
161  
162 
163 // 1.加载注册驱动
164 
165 Class.forName("com.mysql.jdbc.Driver");
166 
167  
168 
169 // 2.获取数据库连接对象
170 
171 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
172 
173 // 3.创建语句对象
174 
175 Statement st = conn.createStatement();
176 
177  
178 
179 // 4.执行SQL语句
180 
181 // int rows = st.executeUpdate(String sql);执行DDL和DML语句,放回的是受影响的行数
182 
183 // ResultSet res = st.executeQuery(String sql);执行DQL查询语句,返回的结果集对象
184 
185 ResultSet rs = st.executeQuery(sql);
186 
187  
188 
189 if(rs.next()) {
190 
191 //1.通过结果集的位置获取对应的数
192 
193 /*Object id = rs.getObject(1);
194 
195 Object name = rs.getObject(2);
196 
197 Object age = rs.getObject(3);*/
198 
199  
200 
201 //2.通过结果集的 列名获取对应的数据
202 
203 /*Object id = rs.getObject("id");
204 
205 Object name = rs.getObject("name");
206 
207 Object age = rs.getObject("age");*/
208 
209 //3.通过数据库数据和Java对应的数据类型获取对应的只
210 
211 int id = rs.getInt("id");
212 
213 String name = rs.getString("name");
214 
215 int age = rs.getInt("age");
216 
217 //System.out.println(id+","+name+","+age);
218 
219  
220 
221 //将获取的数据封装成对应的Student对象
222 
223 Student stu = new  Student(id, name, age);
224 
225 System.out.println(stu);
226 
227 }
228 
229 //5.释放资源(先开后关)
230 
231 rs.close();
232 
233 st.close();
234 
235 conn.close();
236 
237 }
238 
239 }

 

6.预编译语句对象PreparedStatment

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

优势

1. SQL语句结构清晰,参数的设置和SQL语句分离

2. 性能更高

3. 防止SQL注入

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

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

1) 创建PreparedStatement

创建语句对象 Statment

 Statement

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

 

创建预编译语句对象PreparedStatement

 PreparedStatement

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

 技术分享图片

2)执行SQL语句的方法

[1] Statment

在执行SQL语句的时候回带上SQL语句

 ResultSet

executeQuery(String sql) 
          执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

 int

executeUpdate(String sql) 
          执行给定 SQL 语句,该语句可能为 INSERTUPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。

[2]PreparedStatement 

在执行SQL语句的方法中不需要设置SQL语句

 ResultSet

executeQuery() 
          在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。

 int

executeUpdate() 
          在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERTUPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。

3) 设置站位参数的值

void  setXxx(int parameterIndex,Xxx value):用于设置占位符参数,

       parameterIndex:第几个问号. 注意:1开始.

       value:设置的真实值.

Xxx:表示数据类型.String/int/long/Double

 

4)代码

  1 package cn.sxt.jdbc._01connection;
  2 
  3  
  4 
  5 import static org.junit.Assert.*;
  6 
  7  
  8 
  9 import java.sql.Connection;
 10 
 11 import java.sql.DriverManager;
 12 
 13 import java.sql.PreparedStatement;
 14 
 15  
 16 
 17 import org.junit.Test;
 18 
 19  
 20 
 21 //DML : 对表数据的增删改操作,使用预编译语句对象
 22 
 23 public class E_DMLByPreparedStatmentDemo {
 24 
 25  
 26 
 27 /*
 28 
 29  * 向 t_student表中插入一条数据
 30 
 31  * sql : insert into t_student(name,age) values (‘乔峰‘,30)
 32 
 33  */
 34 
 35 @Test
 36 
 37 public void testInsert() throws Exception {
 38 
 39 String sql = "insert into t_student(name,age) values (?,?)";
 40 
 41  
 42 
 43 // 1.加载注册驱动
 44 
 45 Class.forName("com.mysql.jdbc.Driver");
 46 
 47  
 48 
 49 // 2.获取数据库连接对象
 50 
 51 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
 52 
 53 // 3.创建预编译语句对象
 54 
 55 PreparedStatement ps = conn.prepareStatement(sql);
 56 
 57 //3.1设置占位符参数
 58 
 59 ps.setString(1, "东方姑娘");
 60 
 61 ps.setInt(2, 18);
 62 
 63  
 64 
 65 // 4.执行SQL语句:注意不要带SQL参数
 66 
 67 ps.executeUpdate();
 68 
 69 //5.释放资源(先开后关)
 70 
 71 ps.close();
 72 
 73 conn.close();
 74 
 75  
 76 
 77 }
 78 
 79 /*
 80 
 81  * 删除操作: 删除t_student表中的某一条数据
 82 
 83  * SQL :delete from t_student where id = 2
 84 
 85  */
 86 
 87 @Test
 88 
 89 public void testDelete() throws Exception {
 90 
 91 String sql = "delete from t_student where id = ?";
 92 
 93  
 94 
 95 // 1.加载注册驱动
 96 
 97 Class.forName("com.mysql.jdbc.Driver");
 98 
 99  
100 
101 // 2.获取数据库连接对象
102 
103 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
104 
105 // 3.创建预编译语句对象
106 
107 PreparedStatement ps = conn.prepareStatement(sql);
108 
109 //3.1设置占位符对应的参数值
110 
111 ps.setInt(1, 1);
112 
113  
114 
115 // 4.执行SQL语句
116 
117 int rows = ps.executeUpdate();
118 
119 System.out.println(rows);
120 
121 //5.释放资源(先开后关)
122 
123 ps.close();
124 
125 conn.close();
126 
127 }
128 
129 /*
130 
131  * 修改操作 : 修改t_student表中的某一条数据
132 
133  * SQL : update t_student set name = ‘虚竹‘,age = 50 where id = 3
134 
135  */
136 
137 @Test
138 
139 public void testUpdate() throws Exception {
140 
141 String sql = "update t_student set name = ?,age = ? where id = ?";
142 
143  
144 
145 // 1.加载注册驱动
146 
147 Class.forName("com.mysql.jdbc.Driver");
148 
149  
150 
151 // 2.获取数据库连接对象
152 
153 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");
154 
155 // 3.创建预编译语句对象
156 
157 PreparedStatement ps = conn.prepareStatement(sql);
158 
159 //3.1设置占位符参数对应的值
160 
161 ps.setString(1, "西方失败");
162 
163 ps.setInt(2, 40);
164 
165 ps.setInt(3, 4);
166 
167 // 4.执行SQL语句
168 
169 int rows = ps.executeUpdate();
170 
171 System.out.println(rows);
172 
173 //5.释放资源(先开后关)
174 
175 ps.close();
176 
177 conn.close();
178 
179 }
180 
181 }
182 
183  

 

 

 

JDBC

原文:https://www.cnblogs.com/qq2267711589/p/10887536.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!