经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
JavaWeb——JDBC
来源:cnblogs  作者:Dqarden  时间:2021/5/17 9:17:07  对本文有异议

内容索引

  1. 1. JDBC基本概念
  2. 2. 快速入门
  3. 3. JDBC中各个接口和类详解

JDBC:

  1. 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
  2. * JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
  3. 2. 快速入门:
  4. * 步骤:
  5. 1. 导入驱动jar mysql-connector-java-5.1.37-bin.jar
  6. 1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
  7. 2.右键-->Add As Library
  8. 2. 注册驱动
  9. 3. 获取数据库连接对象 Connection
  10. 4. 定义sql
  11. 5. 获取执行sql语句的对象 Statement
  12. 6. 执行sql,接受返回结果
  13. 7. 处理结果
  14. 8. 释放资源
  15. * 代码实现:
  16. //1. 导入驱动jar包
  17. //2.注册驱动
  18. Class.forName("com.mysql.jdbc.Driver");
  19. //3.获取数据库连接对象
  20. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
  21. //4.定义sql语句
  22. String sql = "update account set balance = 500 where id = 1";
  23. //5.获取执行sql的对象 Statement
  24. Statement stmt = conn.createStatement();
  25. //6.执行sql
  26. int count = stmt.executeUpdate(sql);
  27. //7.处理结果
  28. System.out.println(count);
  29. //8.释放资源
  30. stmt.close();
  31. conn.close();
  32. 3. 详解各个对象:
  33. 1. DriverManager:驱动管理对象
  34. * 功能:
  35. 1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
  36. static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager
  37. 写代码使用: Class.forName("com.mysql.jdbc.Driver");
  38. 通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
  39. static {
  40. try {
  41. java.sql.DriverManager.registerDriver(new Driver());
  42. } catch (SQLException E) {
  43. throw new RuntimeException("Can't register driver!");
  44. }
  45. }
  46. 注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
  47. 2. 获取数据库连接:
  48. * 方法:static Connection getConnection(String url, String user, String password)
  49. * 参数:
  50. * url:指定连接的路径
  51. * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
  52. * 例子:jdbc:mysql://localhost:3306/db3
  53. * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
  54. * user:用户名
  55. * password:密码
  56. 2. Connection:数据库连接对象
  57. 1. 功能:
  58. 1. 获取执行sql 的对象
  59. * Statement createStatement()
  60. * PreparedStatement prepareStatement(String sql)
  61. 2. 管理事务:
  62. * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
  63. * 提交事务:commit()
  64. * 回滚事务:rollback()
  65. 3. Statement:执行sql的对象
  66. 1. 执行sql
  67. 1. boolean execute(String sql) :可以执行任意的sql 了解
  68. 2. int executeUpdate(String sql) :执行DMLinsertupdatedelete)语句、DDL(createalterdrop)语句
  69. * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
  70. 3. ResultSet executeQuery(String sql) :执行DQLselect)语句
  71. 2. 练习:
  72. 1. account 添加一条记录
  73. 2. account 修改记录
  74. 3. account 删除一条记录
  75. 代码:
  76. Statement stmt = null;
  77. Connection conn = null;
  78. try {
  79. //1. 注册驱动
  80. Class.forName("com.mysql.jdbc.Driver");
  81. //2. 定义sql
  82. String sql = "insert into account values(null,'王五',3000)";
  83. //3.获取Connection对象
  84. conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
  85. //4.获取执行sql的对象 Statement
  86. stmt = conn.createStatement();
  87. //5.执行sql
  88. int count = stmt.executeUpdate(sql);//影响的行数
  89. //6.处理结果
  90. System.out.println(count);
  91. if(count > 0){
  92. System.out.println("添加成功!");
  93. }else{
  94. System.out.println("添加失败!");
  95. }
  96. } catch (ClassNotFoundException e) {
  97. e.printStackTrace();
  98. } catch (SQLException e) {
  99. e.printStackTrace();
  100. }finally {
  101. //stmt.close();
  102. //7. 释放资源
  103. //避免空指针异常
  104. if(stmt != null){
  105. try {
  106. stmt.close();
  107. } catch (SQLException e) {
  108. e.printStackTrace();
  109. }
  110. }
  111. if(conn != null){
  112. try {
  113. conn.close();
  114. } catch (SQLException e) {
  115. e.printStackTrace();
  116. }
  117. }
  118. }
  119. 4. ResultSet:结果集对象,封装查询结果
  120. * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
  121. * getXxx(参数):获取数据
  122. * Xxx:代表数据类型 如: int getInt() , String getString()
  123. * 参数:
  124. 1. int:代表列的编号,从1开始 如: getString(1)
  125. 2. String:代表列名称。 如: getDouble("balance")
  126. * 注意:
  127. * 使用步骤:
  128. 1. 游标向下移动一行
  129. 2. 判断是否有数据
  130. 3. 获取数据
  131. //循环判断游标是否是最后一行末尾。
  132. while(rs.next()){
  133. //获取数据
  134. //6.2 获取数据
  135. int id = rs.getInt(1);
  136. String name = rs.getString("name");
  137. double balance = rs.getDouble(3);
  138. System.out.println(id + "---" + name + "---" + balance);
  139. }
  140. * 练习:
  141. * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
  142. 1. 定义Emp
  143. 2. 定义方法 public List<Emp> findAll(){}
  144. 3. 实现方法 select * from emp;
  145. 5. PreparedStatement:执行sql的对象
  146. 1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
  147. 1. 输入用户随便,输入密码:a' or 'a' = 'a
  148. 2. sqlselect * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
  149. 2. 解决sql注入问题:使用PreparedStatement对象来解决
  150. 3. 预编译的SQL:参数使用?作为占位符
  151. 4. 步骤:
  152. 1. 导入驱动jar mysql-connector-java-5.1.37-bin.jar
  153. 2. 注册驱动
  154. 3. 获取数据库连接对象 Connection
  155. 4. 定义sql
  156. * 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
  157. 5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
  158. 6. 给?赋值:
  159. * 方法: setXxx(参数1,参数2)
  160. * 参数1:?的位置编号 1 开始
  161. * 参数2:?的值
  162. 7. 执行sql,接受返回结果,不需要传递sql语句
  163. 8. 处理结果
  164. 9. 释放资源
  165. 5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
  166. 1. 可以防止SQL注入
  167. 2. 效率更高

抽取JDBC工具类 : JDBCUtils

  1. * 目的:简化书写
  2. * 分析:
  3. 1. 注册驱动也抽取
  4. 2. 抽取一个方法获取连接对象
  5. * 需求:不想传递参数(麻烦),还得保证工具类的通用性。
  6. * 解决:配置文件
  7. jdbc.properties
  8. url=
  9. user=
  10. password=
  11. 3. 抽取一个方法释放资源
  12. * 代码实现:
  13. public class JDBCUtils {
  14. private static String url;
  15. private static String user;
  16. private static String password;
  17. private static String driver;
  18. /**
  19. * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
  20. */
  21. static{
  22. //读取资源文件,获取值。
  23. try {
  24. //1. 创建Properties集合类。
  25. Properties pro = new Properties();
  26. //获取src路径下的文件的方式--->ClassLoader 类加载器
  27. ClassLoader classLoader = JDBCUtils.class.getClassLoader();
  28. URL res = classLoader.getResource("jdbc.properties");
  29. String path = res.getPath();
  30. System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
  31. //2. 加载文件
  32. // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
  33. pro.load(new FileReader(path));
  34. //3. 获取数据,赋值
  35. url = pro.getProperty("url");
  36. user = pro.getProperty("user");
  37. password = pro.getProperty("password");
  38. driver = pro.getProperty("driver");
  39. //4. 注册驱动
  40. Class.forName(driver);
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. } catch (ClassNotFoundException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. /**
  48. * 获取连接
  49. * @return 连接对象
  50. */
  51. public static Connection getConnection() throws SQLException {
  52. return DriverManager.getConnection(url, user, password);
  53. }
  54. /**
  55. * 释放资源
  56. * @param stmt
  57. * @param conn
  58. */
  59. public static void close(Statement stmt,Connection conn){
  60. if( stmt != null){
  61. try {
  62. stmt.close();
  63. } catch (SQLException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. if( conn != null){
  68. try {
  69. conn.close();
  70. } catch (SQLException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. /**
  76. * 释放资源
  77. * @param stmt
  78. * @param conn
  79. */
  80. public static void close(ResultSet rs,Statement stmt, Connection conn){
  81. if( rs != null){
  82. try {
  83. rs.close();
  84. } catch (SQLException e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. if( stmt != null){
  89. try {
  90. stmt.close();
  91. } catch (SQLException e) {
  92. e.printStackTrace();
  93. }
  94. }
  95. if( conn != null){
  96. try {
  97. conn.close();
  98. } catch (SQLException e) {
  99. e.printStackTrace();
  100. }
  101. }
  102. }
  103. }
  104. * 练习:
  105. * 需求:
  106. 1. 通过键盘录入用户名和密码
  107. 2. 判断用户是否登录成功
  108. * select * from user where username = "" and password = "";
  109. * 如果这个sql有查询结果,则成功,反之,则失败
  110. * 步骤:
  111. 1. 创建数据库表 user
  112. CREATE TABLE USER(
  113. id INT PRIMARY KEY AUTO_INCREMENT,
  114. username VARCHAR(32),
  115. PASSWORD VARCHAR(32)
  116. );
  117. INSERT INTO USER VALUES(NULL,'zhangsan','123');
  118. INSERT INTO USER VALUES(NULL,'lisi','234');
  119. 2. 代码实现:
  120. public class JDBCDemo9 {
  121. public static void main(String[] args) {
  122. //1.键盘录入,接受用户名和密码
  123. Scanner sc = new Scanner(System.in);
  124. System.out.println("请输入用户名:");
  125. String username = sc.nextLine();
  126. System.out.println("请输入密码:");
  127. String password = sc.nextLine();
  128. //2.调用方法
  129. boolean flag = new JDBCDemo9().login(username, password);
  130. //3.判断结果,输出不同语句
  131. if(flag){
  132. //登录成功
  133. System.out.println("登录成功!");
  134. }else{
  135. System.out.println("用户名或密码错误!");
  136. }
  137. }
  138. /**
  139. * 登录方法
  140. */
  141. public boolean login(String username ,String password){
  142. if(username == null || password == null){
  143. return false;
  144. }
  145. //连接数据库判断是否登录成功
  146. Connection conn = null;
  147. Statement stmt = null;
  148. ResultSet rs = null;
  149. //1.获取连接
  150. try {
  151. conn = JDBCUtils.getConnection();
  152. //2.定义sql
  153. String sql = "select * from user where username = '"+username+"' and password = '"+password+"' ";
  154. //3.获取执行sql的对象
  155. stmt = conn.createStatement();
  156. //4.执行查询
  157. rs = stmt.executeQuery(sql);
  158. //5.判断
  159. /* if(rs.next()){//如果有下一行,则返回true
  160. return true;
  161. }else{
  162. return false;
  163. }*/
  164. return rs.next();//如果有下一行,则返回true
  165. } catch (SQLException e) {
  166. e.printStackTrace();
  167. }finally {
  168. JDBCUtils.close(rs,stmt,conn);
  169. }
  170. return false;
  171. }
  172. }

JDBC控制事务:

  1. 1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
  2. 2. 操作:
  3. 1. 开启事务
  4. 2. 提交事务
  5. 3. 回滚事务
  6. 3. 使用Connection对象来管理事务
  7. * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
  8. * 在执行sql之前开启事务
  9. * 提交事务:commit()
  10. * 当所有sql都执行完提交事务
  11. * 回滚事务:rollback()
  12. * catch中回滚事务
  13. 4. 代码:
  14. public class JDBCDemo10 {
  15. public static void main(String[] args) {
  16. Connection conn = null;
  17. PreparedStatement pstmt1 = null;
  18. PreparedStatement pstmt2 = null;
  19. try {
  20. //1.获取连接
  21. conn = JDBCUtils.getConnection();
  22. //开启事务
  23. conn.setAutoCommit(false);
  24. //2.定义sql
  25. //2.1 张三 - 500
  26. String sql1 = "update account set balance = balance - ? where id = ?";
  27. //2.2 李四 + 500
  28. String sql2 = "update account set balance = balance + ? where id = ?";
  29. //3.获取执行sql对象
  30. pstmt1 = conn.prepareStatement(sql1);
  31. pstmt2 = conn.prepareStatement(sql2);
  32. //4. 设置参数
  33. pstmt1.setDouble(1,500);
  34. pstmt1.setInt(2,1);
  35. pstmt2.setDouble(1,500);
  36. pstmt2.setInt(2,2);
  37. //5.执行sql
  38. pstmt1.executeUpdate();
  39. // 手动制造异常
  40. int i = 3/0;
  41. pstmt2.executeUpdate();
  42. //提交事务
  43. conn.commit();
  44. } catch (Exception e) {
  45. //事务回滚
  46. try {
  47. if(conn != null) {
  48. conn.rollback();
  49. }
  50. } catch (SQLException e1) {
  51. e1.printStackTrace();
  52. }
  53. e.printStackTrace();
  54. }finally {
  55. JDBCUtils.close(pstmt1,conn);
  56. JDBCUtils.close(pstmt2,null);
  57. }
  58. }
  59. }

原文链接:http://www.cnblogs.com/Dqarden/p/14755706.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号