本文知识点(目录):
1、什么是jdbc
2、jdbc接口的核心API
3、使用JDBC技术连接MySQL数据库的方法
4、使用Statement执行sql语句(DDL、DML、DQL)
5、使用PreparedStatement执行sql语句
6、使用callablestaement执行sql语句,调用存储过程
1、什么是jdbc
简单的讲就是:使用java代码(程序)发送sql语句的技术,称为jdbc技术。
2、jdbc接口的核心API
1 |-Driver 接口:表示java驱动程序接口。所有的具体的数据库厂商要实现的接口. 2 |-connect(String url, Properties info):连接数据库的方法 3 Url:连接数据库的URL 4 URL语法:jdbc协议:数据库子协议://主机:端口/数据库名 5 User:数据库的用户名 6 Password:数据的用户密码 7 |-DriverManager 类:驱动管理器类,用于管理所有的注册的驱动程序 8 |-registerDriver(Driver driver):注册驱动类对象 9 |-getConnection(String url, String user, String password):获取连接对象 10 |-Connection 接口:表示java程序和数据库的连接对象 11 |-createStatement() 12 |-prepareStatement(String sql):创建PreparedStatement对象 13 |-prepareCall(String sql):创建CallableStatement对象 14 |-statement 接口:用于执行静态的sql语句 15 |-executeUpdate(String sql): 执行静态的sql语句(DDL、DML) 16 |-executeQuery(String sql) :静态的查询sql语句(DQL) 17 |-PreparedStatement 接口:用于执行预编译sql语句 18 |-executeUpdate(String sql):执行静态的sql语句(DDL、DML) 19 |-executeQuery(String sql):静态的查询sql语句(DQL) 20 |-CallableStatement 接口:用于执行存储过程的sql语句(call xxx) 21 |-ResultSet 接口:用于封装查询出来的数据 22 |-next():将光标移到下一行 23 |-getxxx(int columnIndex):获取列的值(有getInt()、getString()、getArray()、getURL() 等等)
24 |-getRow():获取当前行编号。
3、使用JDBC技术连接MySQL数据库的方法
1 package com.shore.a_jdbc; 2 3 import java.sql.Connection; 4 import java.sql.Driver; 5 import java.sql.DriverManager; 6 import java.util.Properties; 7 8 /** 9 * @author DSHORE/2019-3-23 10 * 11 */ 12 //连接MySQL数据库的几种方法 13 public class connJDBC { 14 // jdbc协议:数据库的子协议:主机:端口/要连接的数据库名称 15 private String url = "jdbc:mysql://localhost:3306/school";//连接数据库的URL链接 16 private String user = "root";//用户名 17 private String password = "123456";//密码 18 /* 19 * 第一种方法: 20 * */ 21 public void test1() throws Exception{ 22 //1.创建驱动程序类对象 23 Driver driver = new com.mysql.jdbc.Driver(); 24 //Driver driver = new org.gjt.mm.mysql.Driver();//旧版本的创建方法 25 //设置用户名密码 26 Properties props = new Properties(); 27 props.setProperty("user",user); 28 props.setProperty("password",password); 29 //2.连接数据库,返回连接对象 30 Connection conn = driver.connect(url, props); 31 System.out.println(conn);//返回值:com.mysql.jdbc.JDBC4Connection@29c56c60,表示已连接成功 32 } 33 /* 34 * 第二种方法:使用驱动管理器类连接数据库 35 * */ 36 public void test2()throws Exception{ 37 //1.创建驱动程序类对象 38 Driver driver = new com.mysql.jdbc.Driver();//MySQL数据库 39 //Driver driver2 = new com.oracle.jdbc.Driver();//Oracle数据库 40 //注册驱动程序(可以注册多个驱动) 41 DriverManager.registerDriver(driver); 42 //DriverManager.registerDriver(driver2); 43 //2.连接数据库 44 Connection conn=DriverManager.getConnection(url, user, password); 45 System.out.println(conn); 46 } 47 /* 48 * 第三种方法:使用加载驱动程序类 来注册 驱动程序。(推荐使用这种方式连接数据库) 49 * */ 50 public void test3() throws Exception{ 51 //通过得到字节码对象的方式加载静态代码块,从而注册驱动 52 Class.forName("com.mysql.jdbc.Driver"); 53 //2.连接数据库 54 Connection conn = DriverManager.getConnection(url, user, password); 55 System.out.println(conn); 56 } 57 }
4、使用Statement执行sql语句
4.1、执行DDL语句
1 package com.shore.b_statement; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import org.junit.Test; 9 /* 10 *使用statement对象执行静态sql语句(创建表) 11 **/ 12 public class Demo1 { 13 //连接数据库的URL 14 private String url="jdbc:mysql://localhost:3306/school"; 15 //jdbc协议:数据库的子协议:主机:端口/连接的数据库 16 private String user="root";//用户名 17 private String password="123456";//密码 18 19 //执行DDL语句 20 @Test 21 public void test1(){ 22 Statement statement = null; 23 Connection connection = null; 24 try { 25 //1.注册驱动 26 Class.forName("com.mysql.jdbc.Driver"); 27 //2.获取连接对象 28 connection = DriverManager.getConnection(url, user, password); 29 //3.创建statement 30 statement = connection.createStatement(); 31 //4.准备sql语句 32 String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(32),sex VARCHAR(2));";//创建表 33 int count = statement.executeUpdate(sql); 34 System.out.println("影响行数:"+count+"行!"); 35 } catch (ClassNotFoundException e) { 36 e.printStackTrace(); 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 }finally{ 40 //5.关闭连接(顺序:后代开的先关闭) 41 try { 42 if(statement != null) statement.close(); 43 if(connection != null) connection.close(); 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 }
4.2、执行DML语句
封装工具类(JdbcUtil.java) 文件。(由于连接数据库和关闭资源的那部分代码是不变的,所以将他们封装起来,用到时 就直接调用即可)
1 package com.shore.util; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.ResultSet; 9 import java.sql.SQLException; 10 import java.sql.Statement; 11 import java.util.Properties; 12 13 public class JdbcUtil { //把固定不变的那部分代码封装起来 14 //动态连接数据 15 private static String url = null; 16 private static String user = null;//用户名 17 private static String password = null;//密码 18 private static String driverClass = null; 19 //静态代码块中(只加载一次) 20 static{ 21 //读取db.properties 22 Properties props = new Properties(); 23 try { 24 FileInputStream fis = new FileInputStream("./src/db.properties"); 25 //加载文件 26 props.load(fis); 27 url = props.getProperty("url"); 28 user = props.getProperty("user"); 29 password = props.getProperty("password"); 30 driverClass = props.getProperty("driverClass"); 31 //注册驱动 32 Class.forName(driverClass); 33 } catch (FileNotFoundException e) { 34 e.printStackTrace(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } catch (ClassNotFoundException e) { 38 e.printStackTrace(); 39 System.out.println("注册驱动失败"); 40 } 41 } 42 //获取连接 43 public static Connection getConnection(){ 44 try { 45 Connection conn = DriverManager.getConnection(url, user, password); 46 return conn; 47 } catch (SQLException e) { 48 e.printStackTrace(); 49 throw new RuntimeException(); 50 } 51 } 52 //释放资源 53 public static void close(Connection conn,Statement stmt,ResultSet rs){ 54 try { 55 if(stmt != null) stmt.close(); 56 if(conn != null) conn.close(); 57 if(rs != null) rs.close(); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 } 61 } 62 }
db.properties配置文件(存储数据库链接、用户及密码等)
1 url = jdbc:mysql://localhost:3306/school //把数据库的链接入口配置在一个文件中,方便以后操作(更改账号密码等等) 2 user = root 3 password = 123456 4 driverClass = com.mysql.jdbc.Driver
执行DML语句 正文
1 package com.shore.b_statement; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import org.junit.Test; 9 10 import com.bw.util.JdbcUtil; 11 12 /** 13 * 使用statement执行DML语句(添加、删除、修改数据) 14 * 15 */ 16 public class Demo2 { 17 /* 18 * 向student表中添加数据 19 * */ 20 @Test 21 public void testInsert(){ 22 ResultSet rs = null; 23 Connection conn = null; 24 Statement stmt = null; 25 //通过工具类获取;连接对象 26 conn = JdbcUtil.getConnection(); 27 //常见statement对象 28 try { 29 stmt=conn.createStatement(); 30 } catch (SQLException e) { 31 e.printStackTrace(); 32 } 33 String sql = "INSERT INTO student(NAME,sex) VALUES('张三','女');"; 34 try { 35 int count = stmt.executeUpdate(sql); 36 System.out.println(count); 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 } 40 JdbcUtil.close(conn,stmt,rs); 41 } 42 /* 43 * 修改student表中的数据 44 * */ 45 @Test 46 public void testUpdate(){ 47 ResultSet rs = null; 48 Connection conn =null; 49 Statement stmt = null; 50 //通过工具类获取;连接对象 51 conn = JdbcUtil.getConnection(); 52 //常见statement对象 53 try { 54 stmt = conn.createStatement(); 55 } catch (SQLException e) { 56 e.printStackTrace(); 57 } 58 String sql = "UPDATE student SET NAME = '王五' WHERE id = 1;"; 59 try { 60 int count=stmt.executeUpdate(sql); 61 System.out.println(count); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 } 65 JdbcUtil.close(conn,stmt,rs); 66 } 67 /* 68 * 删除student表中的数据 69 * */ 70 @Test 71 public void testDelete(){ 72 ResultSet rs = null; 73 Connection conn = null; 74 Statement stmt = null; 75 //通过工具类获取;连接对象 76 conn = JdbcUtil.getConnection(); 77 //常见statement对象 78 try { 79 stmt = conn.createStatement(); 80 } catch (SQLException e) { 81 e.printStackTrace(); 82 } 83 String sql = "DELETE FROM student WHERE id = 3;"; 84 try { 85 int count = stmt.executeUpdate(sql); 86 System.out.println(count); 87 } catch (SQLException e) { 88 e.printStackTrace(); 89 } 90 JdbcUtil.close(conn,stmt,rs); 91 } 92 }
4.3、执行DQL语句
1 package com.shore.b_statement; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import org.junit.Test; 9 10 import com.bw.util.JdbcUtil; 11 12 /* 13 * 使用statement执行sql语句(查询操作语句) 14 * */ 15 public class Demo3 { 16 @Test 17 public void test1(){ 18 ResultSet rs = null; 19 Connection conn = null; 20 Statement stmt = null; 21 //获取连接 22 conn = JdbcUtil.getConnection(); 23 //创建statement 24 try { 25 stmt = conn.createStatement(); 26 } catch (SQLException e) { 27 e.printStackTrace(); 28 } 29 //准备sql语句 30 String sql = "SELECT * FROM student;";//查询表中所有数据 31 try { 32 rs=stmt.executeQuery(sql); 33 /*//移动光标 34 boolean flag=rs.next(); 35 if(flag){ 36 //取出值 37 //索引 38 int id=rs.getInt(1); 39 String name=rs.getString(2); 40 String sex=rs.getString(3); 41 System.out.println(id+","+name+","+sex); 42 }*/ 43 //遍历结果 44 while(rs.next()){ 45 int id=rs.getInt("id"); 46 String name=rs.getString("name"); 47 String sex=rs.getString("sex"); 48 System.out.println(id+","+name+","+sex); 49 } 50 } catch (SQLException e) { 51 e.printStackTrace(); 52 }finally{ 53 JdbcUtil.close(conn, stmt, rs); 54 } 55 } 56 }
5、使用PreparedStatement执行sql语句
1 package com.shore.c_prepared; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import org.junit.Test; 9 10 import com.bw.util.JdbcUtil; 11 12 /* 13 * preparedStatement执行sql语句(有效防止sql注入的问题) 14 * */ 15 public class Demo1 { 16 //增加 17 @Test 18 public void testInsert(){ 19 Connection conn = null; 20 PreparedStatement stmt = null; 21 ResultSet rs = null; 22 //1.获取连接 23 conn = JdbcUtil.getConnection(); 24 //2准备预编译的sql 25 String sql = "INSERT INTO student(NAME,sex) VALUES(?,?);";//?表示一个参数的占位符 26 try { 27 //3执行预编译的sql语句(检查语法) 28 stmt = conn.prepareStatement(sql); 29 //4.设置参数 30 stmt.setString(1,"赵六"); //可用name作为参数代表“赵六” 从页面传值来此 31 stmt.setString(2,"女"); 32 //5.发送参数,执行sql 33 int count = stmt.executeUpdate(); 34 System.out.println("影响了"+count+"行"); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 }finally{ 38 JdbcUtil.close(conn, stmt, rs); 39 } 40 } 41 }
6、使用callablestaement执行sql语句,调用存储过程
MySQL存储过程 相关知识点:https://www.cnblogs.com/dshore123/p/10559182.html
1 -- 1.带有输入参数的存储过程 2 DELIMITER $ 3 CREATE PROCEDURE pro_test(IN sid INT) 4 BEGIN 5 SELECT * FROM student WHERE id=sid; 6 END $ 7 8 CALL pro_test(2);
1 -- 2.执行带有输出参数的存储过程 2 DELIMITER $ 3 CREATE PROCEDURE pro_test(IN sid INT,OUT sname VARCHAR(32)) 4 BEGIN 5 SELECT NAME INTO sname FROM student WHERE id=sid; 6 END $ 7 8 CALL pro_test(2,@sname); 9 SELECT @sname;
正文代码
1 package com.shore.d_callable; 2 3 import java.sql.CallableStatement; 4 import java.sql.Connection; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import org.junit.Test; 9 10 import com.bw.util.JdbcUtil; 11 12 /** 13 * 使用CallableSatement调用存储过程 14 * @author lx 15 * 16 */ 17 public class Demo1 { 18 19 /* 20 * 1.带有输入参数的存储过程 21 * CALL pro_test(2) 22 * */ 23 @Test 24 public void test1(){ 25 Connection conn = null; 26 ResultSet rs = null; 27 CallableStatement stmt = null; 28 //获取连接 29 conn = JdbcUtil.getConnection(); 30 //准备sql 31 String sql = "CALL pro_test(?);"; //可以执行预编译的sql 32 try { 33 //预编译 34 stmt = conn.prepareCall(sql); 35 //设置参数 36 stmt.setInt(1, 2); 37 //注意:所有的存储过程的sql语句都是使用executeQuery 38 rs = stmt.executeQuery(); 39 //遍历起结果 40 while(rs.next()){ 41 int id = rs.getInt("id"); 42 String name = rs.getString("name"); 43 String sex = rs.getString("sex"); 44 System.out.println(id+","+name+","+sex); 45 } 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 }finally{ 49 JdbcUtil.close(conn, stmt, rs); 50 } 51 } 52 /* 53 * 54 * 2.执行带有输出参数的存储过程 55 * */ 56 @Test 57 public void test2(){ 58 Connection conn = null; 59 ResultSet rs = null; 60 CallableStatement stmt = null; 61 //获取连接 62 conn = JdbcUtil.getConnection(); 63 //准备sql 64 String sql = "CALL pro_test(?,?);"; //第一个?是输入参数,第二个?是输出参数 65 try { 66 //预编译 67 stmt = conn.prepareCall(sql); 68 //设置参数 69 stmt.setInt(1, 2); 70 //设置输出参数 71 /* 72 *参数 一:参数的位置 73 *参数二:存储过程中输出参数的jdbc类型 varchar(32) 74 * */ 75 stmt.registerOutParameter(2,java.sql.Types.VARCHAR); 76 //发送参数,执行 77 stmt.executeQuery(); 78 /* //得到输出参数的值 79 * 索引值:预编译sql中的输出参数的位置 80 * */ 81 String result = stmt.getString(2);//getxxx方法专门用于获取存储过程中的输出参数 82 System.out.println(result); 83 } catch (SQLException e) { 84 e.printStackTrace(); 85 }finally{ 86 JdbcUtil.close(conn, stmt, rs); 87 } 88 } 89 }
附录
创建表:contact
1 create contact( 2 id varchar(32) primary key, 3 name varchar(32), 4 sxe varchar(32), 5 age int, 6 phone varchar(32), 7 email varchar(32), 8 qq varchar(32) 9 );
使用“增删改查(CRUD)”操作,连接数据库
1 package com.shore.dao.impl; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.util.ArrayList; 8 import java.util.List; 9 import java.util.UUID; 10 11 import com.shore.dao.ContactDAO; 12 import com.shore.entity.Contact; 13 import com.shore.util.JdbcUtil; 14 15 public class ContactDAOMySqlImpl implements ContactDAO{ 16 17 //添加数据 18 public void addContact(Contact contact) { 19 Connection conn; 20 PreparedStatement stmt = null; 21 ResultSet rs = null; 22 conn = JdbcUtil.getConnection(); 23 String sql = "insert into contact(id,name,sex,age,phone,email,qq) values(?,?,?,?,?,?,?)"; 24 try { 25 //执行预编译的sql语句(检查语法) 26 stmt = conn.prepareStatement(sql); 27 String id = UUID.randomUUID().toString().replace("-",""); 28 stmt.setString(1, id); 29 stmt.setString(2, contact.getName()); 30 stmt.setString(3, contact.getSex()); 31 stmt.setInt(4, contact.getAge()); 32 stmt.setString(5, contact.getPhone()); 33 stmt.setString(6, contact.getEmail()); 34 stmt.setString(7, contact.getQq()); 35 stmt.executeUpdate(); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 }finally{ 39 JdbcUtil.close(conn, stmt, rs); 40 } 41 } 42 43 //查询所有数据 44 public List<Contact> finAll() { 45 Connection conn; 46 PreparedStatement stmt = null; 47 ResultSet rs = null; 48 //获取连接 49 conn = JdbcUtil.getConnection(); 50 String sql = "select * from contact"; 51 try { 52 //执行预编译的sql语句(检查语法) 53 stmt = conn.prepareStatement(sql); 54 //执行sql; 55 rs = stmt.executeQuery(); 56 List<Contact> list = new ArrayList<Contact>(); 57 while(rs.next()){ 58 //创建Contact对象 59 Contact c = new Contact(); 60 c.setId(rs.getString("id")); 61 c.setName(rs.getString("name")); 62 c.setSex(rs.getString("sex")); 63 c.setAge(rs.getInt("age")); 64 c.setPhone(rs.getString("phone")); 65 c.setEmail(rs.getString("email")); 66 c.setQq(rs.getString("qq")); 67 list.add(c); 68 } 69 return list; 70 } catch (SQLException e) { 71 e.printStackTrace(); 72 throw new RuntimeException(); 73 }finally{ 74 JdbcUtil.close(conn, stmt, rs); 75 } 76 } 77 78 //根据id删除数据 79 public void delContact(String id) { 80 Connection conn; 81 PreparedStatement stmt = null; 82 ResultSet rs = null; 83 conn = JdbcUtil.getConnection(); 84 String sql = "delete from contact where id=?"; 85 try { 86 //执行预编译的sql语句(检查语法) 87 stmt = conn.prepareStatement(sql); 88 stmt.setString(1,id) 89 //发送参数,执行sql; 90 stmt.executeUpdate(); 91 } catch (SQLException e) { 92 e.printStackTrace(); 93 }finally{//关闭资源 94 JdbcUtil.close(conn, stmt, rs); 95 } 96 } 97 98 //修改数据 99 public void updateContact(Contact contact) { 100 Connection conn; 101 PreparedStatement stmt = null; 102 ResultSet rs = null; 103 conn = JdbcUtil.getConnection(); 104 String sql = "update contact set name=?,sex=?,age=?,phone=?,email=?,qq=? where id=?"; 105 try { 106 //执行预编译的sql语句(检查语法) 107 stmt=conn.prepareStatement(sql); 108 stmt.setString(1, contact.getName()); 109 stmt.setString(2, contact.getSex()); 110 stmt.setInt(3, contact.getAge()); 111 stmt.setString(4, contact.getPhone()); 112 stmt.setString(5, contact.getEmail()); 113 stmt.setString(6, contact.getQq()); 114 stmt.setString(7, contact.getId()); 115 stmt.executeUpdate(); 116 } catch (SQLException e) { 117 e.printStackTrace(); 118 }finally{ 119 JdbcUtil.close(conn, stmt, rs); 120 } 121 } 122 123 //根据id查询数据(作用于修改数据的时候) 124 public Contact findById(String id) { 125 Connection conn; 126 PreparedStatement stmt = null; 127 ResultSet rs = null; 128 //获取连接 129 conn = JdbcUtil.getConnection(); 130 String sql = "select * from contact where id=?"; 131 try { 132 //执行预编译的sql语句(检查语法) 133 stmt = conn.prepareStatement(sql); 134 stmt.setString(1, id); 135 rs = stmt.executeQuery(); 136 Contact c = null; 137 while(rs.next()){ 138 //创建Contact对象 139 c = new Contact(); 140 c.setId(rs.getString("id")); 141 c.setName(rs.getString("name")); 142 c.setSex(rs.getString("sex")); 143 c.setAge(rs.getInt("age")); 144 c.setPhone(rs.getString("phone")); 145 c.setEmail(rs.getString("email")); 146 c.setQq(rs.getString("qq")); 147 } 148 return c; 149 } catch (SQLException e) { 150 e.printStackTrace(); 151 throw new RuntimeException(); 152 }finally{ 153 JdbcUtil.close(conn, stmt, rs); 154 } 155 } 156 157 //判断账号昵称是否重复,若重复,页面端显示此账号已存在,请重新取名 158 public boolean checkContact(String name) { 159 Connection conn; 160 PreparedStatement stmt = null; 161 ResultSet rs = null; 162 //获取数据库的连接 163 conn = JdbcUtil.getConnection(); 164 //准备sql 165 String sql = "select * from contact where name = ?"; 166 try { 167 //执行预编译的sql语句(检查语法) 168 stmt = conn.prepareStatement(sql); 169 //设置参数 170 stmt.setString(1, name); 171 //发送参数,执行sql 172 rs = stmt.executeQuery(); 173 if(rs.next()){ 174 return true; 175 }else{ 176 return false; 177 } 178 } catch (SQLException e) { 179 e.printStackTrace(); 180 throw new RuntimeException(); 181 }finally{//关闭资源 182 JdbcUtil.close(conn, stmt, rs); 183 } 184 } 185 }
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/10582283.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |