JDBC基本操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mChenys/article/details/80498114

一、什么是jdbc:

jdbc是oracle公司指定的一套规范(一套接口)

二、jdbc作用:

连接数据库
发送sql语句

处理结果

三、jdbc的组成:

java内置的2个包java.sql和javax.sql;

驱动:jdbc的实现类.由数据库厂商提供.例如MySql的驱动jar包

四、数据库URL

URL用于标识数据库的位置,通过URL地址可以让JDBC程序连接哪个数据库,URL的写法为:

常用数据库URL地址的写法:

Oracle写法:jdbc:oracle:thin:@localhost:1521:sid

MySql写法: jdbc:mysql://localhost:3306/sid

Mysql的url地址的简写形式: jdbc:mysql:///sid

常用属性:useUnicode=true&characterEncoding=UTF-8

sid:为数据库的名称


五、jdbc操作步骤:

1.数据库和表
2.创建一个项目
3.导入驱动jar包
4.编码:
注册驱动
获取连接
编写sql
创建预编译的语句执行者
设置参数
执行sql
处理结果

释放资源


六、编码

测试用的数据库表


测试工程结构:


demo1:

   
   
  1. package demo1;
  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. public class Jdbctest {
  8. public static void main(String[] args) {
  9. Connection conn = null;
  10. Statement statement = null;
  11. ResultSet resultSet = null;
  12. try {
  13. //1.通过字节码对象注册驱动
  14. Class.forName( "com.mysql.jdbc.Driver");
  15. //2.获得连接对象
  16. conn = DriverManager.getConnection( "jdbc:mysql:///mydb1", "root", "root");
  17. //3.通过conn对象获得向数据库发送sql语句的statement对象
  18. statement = conn.createStatement();
  19. //4.通过stmt对象执行sql语句,拿到执行的结果,返回给rs对象
  20. resultSet = statement.executeQuery( "select * from user");
  21. //5.解析rs结果集中的数据
  22. while(resultSet.next()) {
  23. int id = resultSet.getInt( "id") ;
  24. String name = resultSet.getString( "username");
  25. System.out.println( "id:"+id+ " name:"+name);
  26. }
  27. //6.关闭资源
  28. } catch (Exception e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. } finally {
  32. if( null !=resultSet)
  33. try {
  34. resultSet.close();
  35. } catch (SQLException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. if( null !=statement)
  40. try {
  41. statement.close();
  42. } catch (SQLException e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. if( null !=conn)
  47. try {
  48. conn.close();
  49. } catch (SQLException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }
demo2 jdbc连接工具类封装和CRUD操作

   
   
  1. package utils;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. import java.util.ResourceBundle;
  9. /**
  10. * jdbc操作的工具类
  11. * @author mChenys
  12. *
  13. */
  14. public class JdbcUtils {
  15. private static String driverClass = null;
  16. private static String url = null;
  17. private static String username;
  18. private static String password;
  19. static {
  20. //读取配置文件
  21. ResourceBundle bundle = ResourceBundle.getBundle( "jdbc");
  22. driverClass = bundle.getString( "driverClass");
  23. url = bundle.getString( "url");
  24. username = bundle.getString( "username");
  25. password = bundle.getString( "password");
  26. try {
  27. //加载驱动
  28. Class.forName(driverClass);
  29. } catch (ClassNotFoundException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34. /**
  35. * 获取mysql连接
  36. * @return
  37. */
  38. public static Connection getConnection() {
  39. try {
  40. return DriverManager.getConnection(url, username, password);
  41. } catch (SQLException e) {
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. }
  45. return null;
  46. }
  47. /**
  48. * 释放资源
  49. * @param rs
  50. * @param stmt
  51. * @param conn
  52. */
  53. public static void release(ResultSet rs, Statement stmt, Connection conn) {
  54. if ( null != rs)
  55. try {
  56. rs.close();
  57. } catch (SQLException e) {
  58. // TODO Auto-generated catch block
  59. e.printStackTrace();
  60. } finally {
  61. rs = null;
  62. }
  63. if ( null != stmt)
  64. try {
  65. stmt.close();
  66. } catch (SQLException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. } finally {
  70. stmt = null;
  71. }
  72. if ( null != conn)
  73. try {
  74. conn.close();
  75. } catch (SQLException e) {
  76. // TODO Auto-generated catch block
  77. e.printStackTrace();
  78. } finally {
  79. conn = null;
  80. }
  81. }
  82. public static void release(ResultSet rs, PreparedStatement stmt, Connection conn) {
  83. if ( null != rs)
  84. try {
  85. rs.close();
  86. } catch (SQLException e) {
  87. // TODO Auto-generated catch block
  88. e.printStackTrace();
  89. } finally {
  90. rs = null;
  91. }
  92. if ( null != stmt)
  93. try {
  94. stmt.close();
  95. } catch (SQLException e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. } finally {
  99. stmt = null;
  100. }
  101. if ( null != conn)
  102. try {
  103. conn.close();
  104. } catch (SQLException e) {
  105. // TODO Auto-generated catch block
  106. e.printStackTrace();
  107. } finally {
  108. conn = null;
  109. }
  110. }
  111. }

   
   
  1. package demo2;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. import utils.JdbcUtils;
  7. /**
  8. * 测试CRUD操作
  9. * @author mChenys
  10. *
  11. */
  12. public class JdbcCrud {
  13. public static void main(String[] args) {
  14. // testInsert();
  15. // testDelete();
  16. //testUpdate();
  17. testQuery();
  18. }
  19. private static void testInsert() {
  20. Connection conn = JdbcUtils.getConnection();
  21. Statement stmt = null;
  22. if ( null != conn) {
  23. try {
  24. stmt = conn.createStatement();
  25. // stmt.execute("insert into user(username) values('测试插入')");
  26. stmt.executeUpdate( "insert into user(username) values('测试插入2')");
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. } finally {
  30. JdbcUtils.release( null, stmt, conn);
  31. }
  32. }
  33. }
  34. private static void testDelete() {
  35. Connection conn = JdbcUtils.getConnection();
  36. Statement stmt = null;
  37. if ( null != conn) {
  38. try {
  39. stmt = conn.createStatement();
  40. stmt.executeUpdate( "delete from user where username='测试插入2'");
  41. } catch (SQLException e) {
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. } finally {
  45. JdbcUtils.release( null, stmt, conn);
  46. }
  47. }
  48. }
  49. private static void testUpdate() {
  50. Connection conn = JdbcUtils.getConnection();
  51. Statement stmt = null;
  52. if ( null != conn) {
  53. try {
  54. stmt = conn.createStatement();
  55. stmt.executeUpdate( "update user set username='哈哈' where username='测试插入'");
  56. } catch (SQLException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. } finally {
  60. JdbcUtils.release( null, stmt, conn);
  61. }
  62. }
  63. }
  64. private static void testQuery() {
  65. Connection conn = JdbcUtils.getConnection();
  66. Statement stmt = null;
  67. ResultSet rs = null;
  68. if ( null != conn) {
  69. try {
  70. stmt = conn.createStatement();
  71. rs= stmt.executeQuery( "select * from user");
  72. if( null !=rs) {
  73. while(rs.next()) {
  74. System.out.println( "id:"+rs.getInt( "id")+ " name:"+rs.getString( "username"));
  75. }
  76. }
  77. } catch (SQLException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. } finally {
  81. JdbcUtils.release(rs, stmt, conn);
  82. }
  83. }
  84. }
  85. }

jdbc.properties文件,必须放在src目录下

driverClass = com.mysql.jdbc.Driver
url = jdbc:mysql:///mydb1
username = root

password = root


demo3 PreparedStatement的使用

   
   
  1. package demo3;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import utils.JdbcUtils;
  7. /**
  8. * PreparedStatement 的使用
  9. * @author mChenys
  10. *
  11. */
  12. public class PrepareStmtTest {
  13. public static void main(String[] args) {
  14. // testInsert();
  15. // testDelete();
  16. // testUpdate();
  17. testQuery();
  18. }
  19. private static void testInsert() {
  20. Connection conn = JdbcUtils.getConnection();
  21. PreparedStatement stmt = null;
  22. if( null !=conn) {
  23. try {
  24. stmt = conn.prepareStatement( "insert into user values(null,?)");
  25. stmt.setString( 1, "zhangs"); //替换?,索引从1开始
  26. stmt.executeUpdate();
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. } finally {
  30. JdbcUtils.release( null, stmt, conn);
  31. }
  32. }
  33. }
  34. private static void testDelete() {
  35. Connection conn = JdbcUtils.getConnection();
  36. PreparedStatement stmt = null;
  37. if( null !=conn) {
  38. try {
  39. stmt = conn.prepareStatement( "delete from user where username=?");
  40. stmt.setString( 1, "zhangs"); //替换?,索引从1开始
  41. stmt.executeUpdate();
  42. } catch (SQLException e) {
  43. e.printStackTrace();
  44. } finally {
  45. JdbcUtils.release( null, stmt, conn);
  46. }
  47. }
  48. }
  49. private static void testUpdate() {
  50. Connection conn = JdbcUtils.getConnection();
  51. PreparedStatement stmt = null;
  52. if( null !=conn) {
  53. try {
  54. stmt = conn.prepareStatement( "update user set username=? where username=?");
  55. stmt.setString( 1, "呵呵");
  56. stmt.setString( 2, "哈哈");
  57. stmt.executeUpdate();
  58. } catch (SQLException e) {
  59. e.printStackTrace();
  60. } finally {
  61. JdbcUtils.release( null, stmt, conn);
  62. }
  63. }
  64. }
  65. private static void testQuery() {
  66. Connection conn = JdbcUtils.getConnection();
  67. PreparedStatement stmt = null;
  68. ResultSet rs = null;
  69. if( null !=conn) {
  70. try {
  71. stmt = conn.prepareStatement( "select * from user");
  72. rs= stmt.executeQuery();
  73. if( null !=rs) {
  74. while(rs.next()) {
  75. System.out.println( "id:"+rs.getString( "id")+ " name:"+rs.getString( "username"));
  76. }
  77. }
  78. } catch (SQLException e) {
  79. e.printStackTrace();
  80. } finally {
  81. JdbcUtils.release(rs, stmt, conn);
  82. }
  83. }
  84. }
  85. }
PreparedStatement是用于解决sql语句注入的问题
SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为。
1 、 statement 存在 sql 注入攻击问题
例如:登陆用户名输入时,采用 xxx ’ or ‘ 1 ’ = ‘ 1
在数据库中就相当于执行了如下语句,导致 where 后面的条件是永真的结果。
select * from users where name='aaa' or '1'='1' and password=''
 
2、 对于防范 SQL 注入,可以采用 PreparedStatement 取代 Statement 。
因为:通过 PreaparedStatement 对象 , 这个对象也是可以向数据库发送 sql 语句的 , 但是不同之处在于这个类对 sql 可以进行预编译 , 预编译了之后 , 再传入的特殊字符就不会当作特殊字符去处理 , 从而可以解决 sql 注入的问题 .





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值