问题:实际开发中,不可能用工具或者命令行操作数据库,数据库表中的数据最终要使用Java程序来操作,那么Java中如何操作数据库中的数据呢?
答 : 在Java语言中,有一个专门连接数据库的规范(JDBC),专门负责连接数据库进行数据操作的规范
JDBC只是SUN编写的一堆接口(规范的体现),SUN公司自己并没有实现
问题 : 为什么SUN只定义一个JDBC规范,而不实现呢?
答 : 因为市面上的数据库很多,每个数据库内部接口不会向外暴露,而且即便是暴露让SUN去实现,市面上很多数据库全部要SUN来实现不现实
实际中哪个数据库需要支持JAVA语言,就需要自己实现Java的JDBC规范,因为实现了JDBC很多接口,那么就会有很多实现类,而很多实现类在java中会使用一个专门的包封装起来,叫做jar包(在JDBC中叫做驱动包),各大数据库产商实现JDBC规范以后都会把他们jar包放在官网上以供开发者下载使用
JDBC(Java DataBase Connectivity):
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基
JDBC规范对应的api包
以连接mysql为例
准备:
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 }
在其他操作之间先要把数据库表要创建出来
/贾琏欲执事
创建一张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 }
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 }
结果集的列的位置
1.使用 rs.next() 偏移光标,循环指定具体的某一行
获取数据的具体方法
getObject(int columnIndex) |
|
getObject(String 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 }
问题 : 我们有了Statment对象可以执行SQL,为什么还要使用PreparedStatment?
优势
Statement: 表示静态SQL语句对象. PreparedStatement:Statement的子接口,表示预编译SQL语句对象. 通过占位符(?)来拼SQL. |
创建语句对象 Statment
createStatement() |
创建预编译语句对象PreparedStatement
prepareStatement(String sql) |
||
原文:https://www.cnblogs.com/qq308015824/p/10887586.html