数据库—mysql—sql
JDBC:java中用于控制(操作)sql语句的驱动—-都是接口

Java中面向接口编程,给定相关的接口,我们调用接口来说实现相应的功能
比如:jdbc就是给定了java访问数据库的接口—是由各个数据库的厂商提供的驱动来处理的

数据库的驱动:实际上就是一个jar包

这个jar包(数据库驱动)是由各个数据库的厂商自己提供的,用于给java访问自己的数据库
比如:
java要去访问mysql数据库,就使用mysql厂商提供的数据库驱动
java要去访问oracle数据库,就使用oracle厂商提供的数据库驱动

综上所诉:jdbc的作用就是java利用数据库厂商提供的驱动来访问数据库

JDBC的使用

步骤:

  1. 注册驱动
  2. 获取连接
  3. 获取语句执行平台
  4. 获取sql语句
  5. 处理结果
  6. 释放资源

mysql-connector-java-5.1.37-bin.jar

  1. package cn.ant.Day18;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import org.junit.Test;
  7. public class Demo {
  8. @Test
  9. public void test() throws Exception{
  10. /*
  11. * 1、注册驱动--用到的是反射机制
  12. * 将mysql的数据库驱动导入--大小写敏感,一个字都不能错
  13. * jdbc的所有api都是在java.sql下的
  14. * */
  15. Class.forName("com.mysql.jdbc.Driver");
  16. //获取连接
  17. Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");
  18. System.out.println(conn);//com.mysql.jdbc.JDBC4Connection@4ac68d3e
  19. //3、获取语言执行平台(执行sql语句的对象)
  20. Statement stmt= conn.createStatement();
  21. //4、获取执行sql语句的对象 返回一个结果集
  22. ResultSet res= stmt.executeQuery("select*from category");
  23. //处理查询结果
  24. while(res.next()){//是否还有下一个数据记录
  25. //获取每一行的数据
  26. Integer cid=res.getInt("cid");
  27. String cname=res.getString("cname");
  28. System.out.println("cid:"+cid+"\t"+"cname:"+cname);
  29. }
  30. //释放资源--关闭连接
  31. //关闭结果集
  32. res.close();
  33. //关闭sql语句平台
  34. stmt.close();
  35. //关闭连接
  36. conn.close();
  37. }
  38. }

获取驱动

image.png

getConnection语法格式

  1. getConnection(url,user,password)
  2. 第一参数是连接
  3. 第二参数是数据库用户密码
  4. 第三参数是数据库摩玛
  5. url语法格式
  6. jdbc:mysql://ip地址:数据库端口号//数据库名称

资源释放

  1. 资源释放问题
  2. 数据库的操作原则上是要一次连接一次关闭
  3. 将jdbc中用到的接口先声明好
  4. 因为释放资源是必须的,所以可以放在finally块中

测试

  1. package cn.ant.Day18;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import org.junit.Test;
  7. public class Demo3 {
  8. @Test
  9. public void test(){
  10. /*
  11. * 1、注册驱动--用到的是反射机制
  12. * 将mysql的数据库驱动导入--大小写敏感,一个字都不能错
  13. * jdbc的所有api都是在java.sql下的
  14. * */
  15. //接口声明
  16. Connection conn=null;
  17. Statement st=null;
  18. ResultSet rs=null;
  19. try{
  20. Class.forName("com.mysql.jdbc.Driver");
  21. conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");
  22. st=conn.createStatement();
  23. rs=st.executeQuery("select*from category");
  24. while(rs.next()){
  25. Integer cid=rs.getInt(1);
  26. String cname=rs.getString(2);
  27. System.out.println("cid:"+cid+"\t"+"cname:"+cname);
  28. }
  29. }catch(Exception e){
  30. e.printStackTrace();
  31. }finally{
  32. //判断是否为空
  33. try{
  34. if(rs!=null)rs.close();
  35. if(st!=null)st.close();
  36. if(conn!=null)conn.close();
  37. }catch(Exception e){
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. }

封装成工具类

  1. package cn.ant.Day18;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. import org.junit.Test;
  8. public class JDBCUtils {
  9. /*
  10. * jdbc的工具类
  11. * 用户封装jdbc操作中的重复操作
  12. *
  13. * 当前这个工具类一旦封装就可以重复,为了将就效率,一般使用静态
  14. * */
  15. private static String driver="com.mysql.jdbc.Driver";
  16. private static String url="jdbc:mysql://localhost:3306/mydb";
  17. private static String user="root";
  18. private static String password="123456";
  19. static{
  20. try {
  21. Class.forName(driver);
  22. } catch (ClassNotFoundException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. }
  27. //下面封装两个操作
  28. //1、封装获取连接的方法
  29. public static Connection getConnection(){
  30. //直接获取连接
  31. Connection conn;
  32. try {
  33. conn = DriverManager.getConnection(url,user,password);
  34. return conn;
  35. } catch (SQLException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. return null;
  40. }
  41. //封装一个释放资源的方法
  42. public static void closeResource(Connection conn,Statement st,ResultSet rs){
  43. try{
  44. if(st!=null) st.close();
  45. if(rs!=null) rs.close();
  46. if(conn!=null) conn.close();
  47. }catch(Exception e){
  48. e.printStackTrace();
  49. }
  50. }
  51. @Test
  52. public void test(){
  53. Connection conn=getConnection();
  54. System.out.println("conn==>"+conn);
  55. }
  56. }

CRUD

  1. C--create--增加
  2. R--Retrieve--读取--查询
  3. U-update--更新--改
  4. D--Delete--删除
  1. package cn.ant.Day18;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. import org.junit.Test;
  6. public class Demo04 {
  7. //jdbc模板
  8. public void test01(){
  9. Connection conn=null;
  10. Statement st=null;
  11. ResultSet rs=null;
  12. try{
  13. //逻辑操作
  14. }catch(Exception e){
  15. e.printStackTrace();
  16. }finally{
  17. //关闭资源
  18. JDBCUtils.closeResource(conn, st, rs);
  19. }
  20. }
  21. //添加
  22. // @Test
  23. public void test02(){
  24. Connection conn=null;
  25. Statement st=null;
  26. ResultSet rs=null;
  27. try{
  28. //逻辑操作
  29. //获取连接
  30. conn=JDBCUtils.getConnection();
  31. //获取执行sql对象
  32. st=conn.createStatement();
  33. //
  34. int i=st.executeUpdate("insert into category(cname) values('测试数据1')");
  35. System.out.println("插入数据结果==》"+i);
  36. }catch(Exception e){
  37. e.printStackTrace();
  38. }finally{
  39. //关闭资源
  40. JDBCUtils.closeResource(conn, st, rs);
  41. }
  42. }
  43. //修改
  44. // @Test
  45. public void test03(){
  46. Connection conn=null;
  47. Statement st=null;
  48. ResultSet rs=null;
  49. try{
  50. //逻辑操作
  51. //获取连接
  52. conn=JDBCUtils.getConnection();
  53. //获取执行sql对象
  54. st=conn.createStatement();
  55. //
  56. int i=st.executeUpdate("update category set cname='测试数据2' where cid=4");
  57. System.out.println("插入数据结果==》"+i);
  58. }catch(Exception e){
  59. e.printStackTrace();
  60. }finally{
  61. //关闭资源
  62. JDBCUtils.closeResource(conn, st, rs);
  63. }
  64. }
  65. //删除
  66. // @Test
  67. public void test04(){
  68. Connection conn=null;
  69. Statement st=null;
  70. ResultSet rs=null;
  71. try{
  72. //逻辑操作
  73. //获取连接
  74. conn=JDBCUtils.getConnection();
  75. //获取执行sql对象
  76. st=conn.createStatement();
  77. //
  78. int i=st.executeUpdate("delete from category where cid=4");
  79. System.out.println("插入数据结果==》"+i);
  80. }catch(Exception e){
  81. e.printStackTrace();
  82. }finally{
  83. //关闭资源
  84. JDBCUtils.closeResource(conn, st, rs);
  85. }
  86. }
  87. //查询
  88. @Test
  89. public void test05(){
  90. Connection conn=null;
  91. Statement st=null;
  92. ResultSet rs=null;
  93. try{
  94. //逻辑操作
  95. //获取连接
  96. conn=JDBCUtils.getConnection();
  97. //获取执行sql对象
  98. st=conn.createStatement();
  99. //
  100. rs=st.executeQuery("select * from category where cid=3");
  101. while(rs.next()){
  102. //在mysql数据库中数值类型 会隐式转换为字符串
  103. Integer cid=rs.getInt(1);
  104. String cname=rs.getString(2);
  105. System.out.println("cid:"+cid+"\t"+"cname:"+cname);
  106. }
  107. }catch(Exception e){
  108. e.printStackTrace();
  109. }finally{
  110. //关闭资源
  111. JDBCUtils.closeResource(conn, st, rs);
  112. }
  113. }
  114. }

关于Statement

  1. package cn.ant.Day18;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. import org.junit.Test;
  6. public class StatementDemo {
  7. //演示注入攻击
  8. @Test
  9. public void test(){
  10. //模拟登陆
  11. String username="jack";
  12. String password="123";
  13. //
  14. Connection conn=null;
  15. Statement st=null;
  16. ResultSet rs=null;
  17. try{
  18. conn=JDBCUtils.getConnection();
  19. String sql="select*from user where username='"+username+"' and password='"+password+"'";
  20. System.err.println(sql);
  21. st=conn.createStatement();
  22. rs=st.executeQuery(sql);
  23. if(rs.next()){
  24. System.out.println("登陆成功");
  25. }else{
  26. System.out.println("登陆失败");
  27. }
  28. }catch(Exception e){
  29. e.printStackTrace();
  30. }finally{
  31. JDBCUtils.closeResource(conn, st, rs);
  32. }
  33. }
  34. }

PreparedStatement(防止注入)代替Statement

  1. package cn.ant.Day18;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import org.junit.Test;
  7. public class PreparedStatementDemo {
  8. /*PreparedStatement
  9. * 是预处理机制,预处理sql语句
  10. * 处理的条件使用?来进行站位
  11. * 能够完美解决sql注入问题
  12. *
  13. * */
  14. @Test
  15. public void test(){
  16. //模拟登陆
  17. String username="jack";
  18. String password="1234";
  19. //
  20. Connection conn=null;
  21. PreparedStatement ps=null;
  22. ResultSet rs=null;
  23. try{
  24. conn=JDBCUtils.getConnection();
  25. String sql="select*from user where username=? and password=?";
  26. System.err.println(sql);
  27. ps=conn.prepareStatement(sql);
  28. ps.setString(1, username);
  29. ps.setString(2, password);
  30. rs=ps.executeQuery();
  31. if(rs.next()){
  32. System.out.println("登陆成功");
  33. }else{
  34. System.out.println("登陆失败");
  35. }
  36. }catch(Exception e){
  37. e.printStackTrace();
  38. }finally{
  39. JDBCUtils.closeResource(conn, ps, rs);
  40. }
  41. }
  42. }