使用java程序发送sql语句到数据库服务器端执行,这就叫jdbc技术
注意:jdbc是Oracle-Sun公司设计的一套专门用于java程序操作数据库的接口。
需要知道以下几点:数据库主机,端口,数据库用户名,数据库密码,所要连接的数据库名字
1、Driver接口:数据库的驱动程序接口,所有具体数据库厂商需要的驱动程序都要实现此接口
主要方法:
Connectionconnect(String url, Properties info) 用于获取数据库连接
2、Connection接口:与具体的数据库连接对象有关
主要方法:
Statement createStatement() 创建一个静态sql语句对象
PreparedStatementprepareStatement(String sql) 创建预编译的sql语句对象
CallableStatementprepareCall(String sql) 创建存储过程的sql语句对象
3、Statement接口:用于执行静态SQL语句
主要方法:
int executeUpdate(String sql) 执行更新操作的sql语句(create/alter/drop)DDL语句 (insert/update/delete)DML语句
ResultSet executeQuery(String sql) 执行查询操作的sql语句(select)(DQL查询语句)
(1)PreparedStatement接口:用于执行预编译的 SQL 语句(是Statement的子接口)
主要方法:
int executeUpdate() 执行更新操作的sql语句
ResultSet executeQuery() 执行查询操作的sql语句
Statement和PreparedStatement的区别:
1、语法结构不同
1)Statment执行静态sql语句,且sql可以拼接。
2)PreparedStatement可以先执行预编译的sql语句,在预编译sql语句中使用?进行参数占位,后面 在进行参数赋值
2、原理不同
1)Statement不能进行sql缓存
2)而PreparedStatement可以进行sql缓存,执行效率会比Statement快!!!
3、安全性不同
1)Statement存在sql注入的风险(使用登录注册讲解sql注入)
2)而PreparedStatement可以有效防止用户注入。
解析:
SELECT * FROM USER WHERE NAME='james' ANDPASSWORD='123456';
-- 查询全部表,基于肯定条件
SELECT * FROM USER WHERE 1=1;
-- 查询全张表给予否定条件
SELECT * FROM USER WHERE 1<>1;
-- 查询表(sql注入)
-- 当执行下面这条SQL语句的时候,明显用户名正确但是密码不正确,但是数据库却可以查询出数据,也就是说登录的时候可以登录
SELECT * FROM USER WHERE NAME='james' OR1=1-- ' AND PASSWORD='123456';
(2)CallableStatement接口:用于执行 SQL 存储过程的接口(是PreparedStatement的子接口)
主要方法:
ResultSet executeQuery() 执行存储过程的sql语句
4、 ResultSet接口:结果集对象,存储所有数据库查询的结果,用该对象进行数据遍历主要方法:
boolean next() :把光标移动到下一行。如果下一行有数据,返回true,如果没有下一行数据,返回false。
getXXX(列索引|列字段名称): 获取字段的数据代码:
package com.jdbc.a.driver; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.util.Properties; public class DriverMethod { private static String url="jdbc:mysql://localhost:3306/day20"; //jdbc协议:mysql协议://主机地址:端口号/需要连接的数据库 private static String user="root"; private static String password="jiang"; public static void main(String[] args) throws Exception { //第一种方式:直连,直接调用driver的connect方法 //testjebc2(); //第二种方式:使用驱动管理类DriverManager //test3jebc3(); //第三种方式:使用for.name让驱动自动注册,一般使用这种方式 testjdbc(); } private static void test3jebc3() throws Exception { //使用驱动管理类,连接我们管理的驱动程序,并获取连接 //DriverManage:管理一组 JDBC 驱动程序的基本服务 //1、注册驱动 Driver driver = new com.mysql.jdbc.Driver(); DriverManager.registerDriver(driver); //获取驱动 //public static Connection getConnection(String url,String user,String password)throws SQLException Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } private static void testjebc2() throws Exception { //创建一个驱动类对象Driver Driver driver = new com.mysql.jdbc.Driver(); //获取Java连接数据库的连接 //Connection connect(String url,Properties info)throws SQLException //url - 要连接到的数据库的 URL //info - 做为连接参数的任意字符串标记/值对的列表。通常至少应该包括 "user" 和 "password" 属性。 //创建properties Properties prop = new Properties(); prop.setProperty("user", user); prop.setProperty("password", password); Connection connect = driver.connect(url, prop); //打印这个连接对象,如果对象不为空,就说明年我们连接到这个的对象了 System.out.println(connect); } private static void testjdbc() throws Exception { //1、加载数据库驱动程序 Class.forName("com.mysql.jdbc.Driver"); //2、获取Java连接数据库的对象 Connection conn = DriverManager.getConnection(url, user, password); /*三个参数分别为: 第一个参数:MySQL数据库的数据地址端口号,需要连接的数据库 第二个参数:用户名 第三个参数是:密码*/ //3、打印这个连接对象 System.out.println(conn); } }使用statement对象对SQL操作:
创建表:
package com.jdbc.b.createment; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Demo { //为了让main方法调用方便定义这三个静态成员变量 private static String url="jdbc:mysql://localhost:3306/day20"; private static String user="root"; private static String password="jiang"; public static void main(String[] args) { //因为无法确定出现异常的位置,为防止在程序刚开始时就出现异常,无法实现对Connection和statement的正常关闭,从而导致出现程序问题 //所以要将Connection和statement赋予初始值,并利用finally无论在什么情况下都会执行的特性,判断:当connection和statement不为空的时候进行关闭 //具体的数据库的连接对象 Connection conn = null; //用于执行静态SQL语句 Statement stmt = null; try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据路连接对象 conn= DriverManager.getConnection(url, user, password); //创建语句执行者 //Statement createStatement()throws SQLException //创建一个 Statement 对象来将 SQL 语句发送到数据库 //注意创建的是静态的sql语句,容易造成注入风险 stmt = conn.createStatement(); //创建一个SQL语句 String sql = "CREATE TABLE employee("+ "id INT PRIMARY KEY AUTO_INCREMENT,"+ "NAME VARCHAR(20),"+ "gender VARCHAR(2),"+ "age INT,"+ "POSITION VARCHAR(20),"+ "email VARCHAR(20),"+ "phone INT"+ ");"; //int executeUpdate(String sql)throws SQLException //执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句 int update = stmt.executeUpdate(sql); //(1) 对于 SQL 数据操作语言 (DML) 语句(INSERT、UPDATE 或 DELETE 语句),返回行计数 //(2) 对于什么都不返回的 SQL 语句(DDL语句)(creata),返回 0 // 1:数据定义语言(DDL) // 用于创建、修改、和删除数据库内的数据结构,如: // (1)创建和删除数据库(CREATE DATABASE || DROP DATABASE); // (2)创建、修改、重命名、删除表(CREATE TABLE || ALTER TABLE|| RENAME TABLE||DROP TABLE); // (3)创建和删除索引(CREATEINDEX || DROP INDEX) // 2:数据查询语言(DQL) // 从数据库中的一个或多个表中查询数据(SELECT) // 3:数据操作语言(DML) // 修改数据库中的数据,包括插入(INSERT)、更新(UPDATE)和删除(DELETE) // 4:数据控制语言(DCL) // 用于对数据库的访问,如:1:给用户授予访问权限(GRANT);2:取消用户访问权限(REMOKE) System.out.println(update); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (stmt!=null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } 插入修改删除数据: package com.jdbc.b.createment; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Demo2 { private static String url="jdbc:mysql://localhost:3306/day20"; private static String user="root"; private static String password="jiang"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //创建数据库的连接对象 conn = DriverManager.getConnection(url, user, password); //创建执行SQL语句的对象 stmt = conn.createStatement(); //创建SQL语句 //插入语句 //String sql = "INSERT INTO employee(NAME,gender,age,POSITION,email,phone) VALUES('张三','男',20,'实习生','224243535@163.com',1830293232);"; //修改语句 //String sql = "UPDATE employee SET NAME='李四' WHERE id=1;"; //删除语句 String sql = "TRUNCATE TABLE employee;"; //执行SQL语句 int update = stmt.executeUpdate(sql); System.out.println(update); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (stmt!=null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } 查询数据: package com.jdbc.b.createment; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Demo3 { private static String url="jdbc:mysql://localhost:3306/day20"; private static String user="root"; private static String password="jiang"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; //当使用查询语句的时候要查看返回值,所以要使用:结果集对象ResultSet ResultSet rs = null; try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //创建数据库连接对象 conn = DriverManager.getConnection(url, user, password); //创建sql语句操作对象 stmt = conn.createStatement(); //创建sql语句 //查询语句 String sql="SELECT * FROM employee;"; //执行语句 //ResultSet executeQuery(String sql)throws SQLException执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 rs = stmt.executeQuery(sql); //移动光标到下一行 //rs.next(); /* * 注意: * 1)如果光标在第一行之前,使用rs.getXX()获取列值,报错:Before start of result set * 2)如果光标在最后一行之后,使用rs.getXX()获取列值,报错:After end of result set */ //获取列值 /*if(rs.next()){ //使用列索引 int id = rs.getInt(1); String name = rs.getString(2); String gender = rs.getString(3); int age = rs.getInt(4); String position = rs.getString(5); String email = rs.getString(6); int phone = rs.getInt(7); //使用列名称 int id = rs.getInt("id"); String name = rs.getString("name"); String gender = rs.getString("gender"); int age = rs.getInt("age"); String position = rs.getString("position"); String email = rs.getString("email"); int phone = rs.getInt("phone"); System.out.println(id+"\t"+name+"\t"+gender+"\t"+age+"\t"+position+"\t"+email+"\t"+phone); }*/ //迭代结果集 while(rs.next()){ //使用列索引 /* int id = rs.getInt(1); String name = rs.getString(2); String gender = rs.getString(3); int age = rs.getInt(4); String position = rs.getString(5); String email = rs.getString(6); int phone = rs.getInt(7);*/ //使用列名称 int id = rs.getInt("id"); String name = rs.getString("name"); String gender = rs.getString("gender"); int age = rs.getInt("age"); String position = rs.getString("position"); String email = rs.getString("email"); int phone = rs.getInt("phone"); System.out.println(id+"\t"+name+"\t"+gender+"\t"+age+"\t"+position+"\t"+email+"\t"+phone); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (stmt!=null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } 抽取工具类: package com.jdbc.c.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 创建jdbc工具类 * */ public class JdbcUtil { private static String url="jdbc:mysql://localhost:3306/day20"; private static String user="root"; private static String password="jiang"; private static String classname="com.mysql.jdbc.Driver"; //因为只需要注册驱动,所以直接使用静态代码块 //注册驱动 static{ try { Class.forName(classname); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //获取连接 public static Connection getConnection(){ try { Connection conn = DriverManager.getConnection(url, user, password); return conn; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(); } } //释放资源 public static void close(Connection conn,Statement stmt,ResultSet rs){ if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (stmt!=null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 使用PreparedStatement对象执行SQL操作:插入数据:
package com.jdbc.d.preparedstatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.jdbc.c.util.JdbcUtil; /** * 使用PreparedStatement执行sql语句 * 一、插入数据 */ public class Demo { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //注册驱动,并创建连接 conn = JdbcUtil.getConnection(); //创建sql语句 //预编译sql使用?代替参数值,一个?代表一个参数值 String sql="INSERT INTO employee(NAME,gender,age,POSITION,email,phone) VALUES(?,?,?,?,?,?);"; //创建预编译对象 ps = conn.prepareStatement(sql); //设置参数 /** * 参数一:参数位置,从1开始 * 参数二:参数实际值 * 注意:所有参数必须要赋值,类型也必须和数据库中一致 */ ps.setString(1, "李四"); ps.setString(2, "男"); ps.setInt(3, 20); ps.setString(4, "软件开发"); ps.setString(5, "211414242@163.com"); ps.setInt(6,1132323); int i = ps.executeUpdate(); System.out.println(i); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JdbcUtil.close(conn, ps, null); } } } 删除修改数据: package com.jdbc.d.preparedstatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.jdbc.c.util.JdbcUtil; /** * 使用PreparedStatement执行sql语句 * 二、修改数据 * 三、删除数据 */ public class Demo2 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; // String name="李四"; // int id = 1; try { //注册驱动,并创建连接 conn = JdbcUtil.getConnection(); //创建sql语句 //预编译sql使用?代替参数值,一个?代表一个参数值 //String sql="UPDATE employee SET NAME=? WHERE id=?;"; String sql = "DELETE FROM employee WHERE id=?;"; //创建预编译对象 ps = conn.prepareStatement(sql); //设置参数 /*ps.setString(1, "李四"); ps.setInt(2, 1);*/ ps.setInt(1, 1); int i = ps.executeUpdate(); System.out.println(i); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JdbcUtil.close(conn, ps, null); } } } 查询数据: package com.jdbc.d.preparedstatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.jdbc.c.util.JdbcUtil; /** * 使用PreparedStatement执行sql语句 * 查询语句 */ public class Demo3 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //注册驱动,并创建连接 conn = JdbcUtil.getConnection(); //创建sql语句 //预编译sql使用?代替参数值,一个?代表一个参数值 String sql = "SELECT * FROM employee WHERE NAME LIKE ?;"; //创建预编译对象 ps = conn.prepareStatement(sql); //设置参数 ps.setString(1, "张%"); //执行语句,返回结果集 rs = ps.executeQuery(); //遍历结果集 while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); String gender = rs.getString(3); int age = rs.getInt(4); String position = rs.getString(5); String email = rs.getString(6); int phone = rs.getInt(7); System.out.println(id+" "+name+" "+gender+" "+age+" "+position+" "+email+" "+phone); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JdbcUtil.close(conn, ps, rs); } } } 使用CallableStatement对象执行存储过程执行带输入参数的存储过程:
package com.jdbc.f.callablestatement; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import com.jdbc.c.util.JdbcUtil; /** * 执行带有输入参数存储过程 * */ public class Demo { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; ResultSet rs = null; try { //注册驱动 conn = JdbcUtil.getConnection(); //创建CallableStatement对象 //创建sql语句 String sql = "CALL pet_getId(?);"; cs = conn.prepareCall(sql); //设置参数 cs.setInt(1, 3); //发送参数,执行sql。返回结果集 //注意:执行存储过程必须使用exeuteQuery rs = cs.executeQuery(); //遍历结果集 while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); String gender = rs.getString(3); int age = rs.getInt(4); String position = rs.getString(5); String email = rs.getString(6); int phone = rs.getInt(7); System.out.println(id+" "+name+" "+gender+" "+age+" "+position+" "+email+" "+phone); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JdbcUtil.close(conn, cs, rs); } } } 执行带有输出参数的存储过程: package com.jdbc.f.callablestatement; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import com.jdbc.c.util.JdbcUtil; /** * 执行带有输出参数存储过程 * */ public class Demo2 { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; ResultSet rs = null; try { //注册驱动 conn = JdbcUtil.getConnection(); //创建CallableStatement对象 //创建sql语句 String sql = "CALL pro_getName(?,?);"; cs = conn.prepareCall(sql); //设置参数 cs.setInt(1, 3); //注册一个输出参数 /** * 参数一、参数位置 * 参数二、表示存储过程中的out参数的数据类型 */ cs.registerOutParameter(2, java.sql.Types.VARCHAR); //发送参数。执行存储过程 rs = cs.executeQuery(); //获取存储工程的返回值:out参数值,使用getXXX方法 String name = cs.getString(2); System.out.println(name); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JdbcUtil.close(conn, cs, rs); } } }