mysql——JDBC

举报
兔老大 发表于 2021/04/23 00:15:51 2021/04/23
【摘要】 概述 JDBC:java Data Base Connectivity ,java数据库连接,它是一种用于执行sql语句的java API,为多种关系数据库提供统一访问。 其实就是一组用java编写的类和接口。 JDBC API 提供两类主要接口: 1)面向开发人员的java.sql程序包,使得Java程序员能够进行数据库连接,执行SQL查询,并得到结果集合。 2)...

概述

JDBC:java Data Base Connectivity ,java数据库连接,它是一种用于执行sql语句的java API,为多种关系数据库提供统一访问。

其实就是一组用java编写的类和接口。

JDBC API 提供两类主要接口:

1)面向开发人员的java.sql程序包,使得Java程序员能够进行数据库连接,执行SQL查询,并得到结果集合。

2)面向底层数据库厂商的JDBC Drivers

程序员只需要写一个程序,就可以访问所有的数据库。

提供者:sun公司

内容:

集成在java.sql和javax.sql包下,比如:

DriverManager类:管理各种驱动

Connection接口:数据库连接

Statement接口:发送命令得到结果

等等。。。

 

JDBC访问数据库步骤

1.加载数据库的驱动程序

------------Class.forName(“driverName”);

2.建立数据库连接             

------------Connection conn=DriverManager.getConnection(String url, String user, String password )

------------url的格式:"jdbc:<JDBC驱动程序名:端口号>:数据源"

------------例子:"jdbc:mysql://localhost:3306/myuser"

3.执行数据库操作SQL

------------Statement stmt = conn.createStatement();

------------ResultSet rs = stmt.executeQuery(sql);

4.得到ResultSet进行结果处理

5.关闭数据库连接

PreparedStatement

:是Statement的子接口

PreparedStatement类效率会更高。使用PreparedStatement有很多优势,总结如下:

防止SQL注入攻击(使用占位符“?)

提高SQL的执行性能(在执行之前有预处理)

避免使用SQL方言提高JDBC中有关SQL代码的可读性。

简单的写一个例子熟悉大体流程:

花卉类:


  
  1. package pojo;
  2. /**
  3. * 花卉实体类
  4. * @author fan
  5. *
  6. */
  7. public class Flower {
  8. private int id;//编号
  9. private String name;//名称
  10. private double price;//价格
  11. private String prodution;//产地
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public double getPrice() {
  25. return price;
  26. }
  27. public void setPrice(double price) {
  28. this.price = price;
  29. }
  30. public String getProdution() {
  31. return prodution;
  32. }
  33. public void setProdution(String prodution) {
  34. this.prodution = prodution;
  35. }
  36. }

对应的mysql:


  
  1. CREATE TABLE `flower` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',
  3. `name` varchar(100) NOT NULL COMMENT '名称',
  4. `price` double(10,2) NOT NULL COMMENT '价格',
  5. `production` varchar(100) NOT NULL COMMENT '产地',
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

我们要JDBC完成对所有花卉的读取操作:


  
  1. package dao.impl;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import com.sun.crypto.provider.RSACipher;
  9. import com.sun.java.util.jar.pack.Package.Class;
  10. import com.sun.org.apache.regexp.internal.recompile;
  11. import dao.FlowerDao;
  12. import pojo.Flower;
  13. public class FlowerDaoImpl implements FlowerDao{
  14. //查询所有花卉信息
  15. @Override
  16. public List<Flower> getFlowerInfoDao() {
  17. //声明jdbc变量
  18. Connection conn=null;
  19. PreparedStatement ps=null;
  20. ResultSet rs=null;
  21. //创建集合
  22. List<Flower> lf=null;
  23. try {
  24. //加载驱动
  25. Class.forName("com.mysql.jdbc.Driver");
  26. //创建连接对象
  27. conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "ytywan1314");
  28. //sql命令
  29. String sql="select * from flower";
  30. //创建sql命令对象
  31. ps=conn.prepareStatement(sql);
  32. //给占位符赋值
  33. //执行
  34. rs=ps.executeQuery();
  35. lf=new ArrayList<>();
  36. //遍历,封装到对象中
  37. while(rs.next()) {
  38. Flower f=new Flower();
  39. f.setId(rs.getInt("id"));
  40. f.setName(rs.getString("name"));
  41. f.setPrice(rs.getDouble("price"));
  42. f.setProdution(rs.getString("production"));
  43. lf.add(f);
  44. }
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. }finally {
  48. //关闭资源
  49. rs.close();
  50. ps.close();
  51. conn.close();
  52. }
  53. //返回
  54. return lf;
  55. }
  56. }

util

我们发现,增删改其实都差不多,我们写的时候都是把其中一个的代码拿来改一改,并且打开啊关闭啊这些操作也类似,所以我们要把操作们都得封装到一个类里,需要时直接传入sql语句还有参数调用即可。


  
  1. public class BaseDao {
  2. private static String driver = "com.mysql.jdbc.Driver"; //数据库驱动字符串
  3. private static String url ="jdbc:mysql://localhost:3306/jeep";
  4. private static String user ="sa"; //用户名
  5. private static String password =""; //密码
  6. protected Connection conn;
  7. protected PreparedStatement pstmt;
  8. protected java.sql.ResultSet rs;
  9. /**
  10. *
  11. * 获取数据库连接对象
  12. */
  13. public Connection getConnection(){
  14. Connection conn = null; //数据库连接对象
  15. //获取连接并捕捉异常
  16. try {
  17. Class.forName(driver);
  18. conn = DriverManager.getConnection(url,user,password);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. return conn; //返回连接对象
  23. }
  24. /**
  25. *
  26. * 关闭数据库连接
  27. */
  28. public void closeAll(Connection conn, Statement stmt, java.sql.ResultSet rs){
  29. //若结果集对象不为空,则关闭
  30. if (rs !=null){
  31. try {
  32. rs.close();
  33. } catch (Exception e){
  34. e.printStackTrace();
  35. }
  36. }
  37. //若Statement对象不为空,则关闭
  38. if (stmt !=null){
  39. try {
  40. stmt.close();
  41. } catch (Exception e){
  42. e.printStackTrace();
  43. }
  44. }
  45. //若数据库连接对象不为空,则关闭
  46. if (conn !=null){
  47. try {
  48. conn.close();
  49. } catch (Exception e){
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. /**
  55. * 增删改
  56. */
  57. public int exceuteUpdate(String sql,Object...prams){
  58. int result = 0;
  59. //获取连接
  60. conn = this.getConnection();
  61. try {
  62. pstmt = conn.prepareStatement(sql);
  63. for (int i=0;i<prams.length;i++){
  64. pstmt.setObject(i+1, prams[i]);
  65. }
  66. result = pstmt.executeUpdate();
  67. } catch (SQLException e){
  68. e.printStackTrace();
  69. } finally {
  70. //关闭资源
  71. closeAll(conn,pstmt,rs);
  72. }
  73. return result;
  74. }
  75. }

properties

对于常量信息,如果每次都修改代码无疑是痛苦的事,所以我们可以提取出相应的配置文件。

比如:dbinfo.properties文件内容:


  
  1. db.driver=com.mysql.jdbc.Driver
  2. db.connectUrl=jdbc:mysql://127.0.0.1:3306/myqq_db?useUnicode=true&characterEncoding=UTF-8
  3. db.user=root
  4. db.pwd=

 java:


  
  1. private static Properties dbProps = new Properties();
  2. InputStream is = DBUtil.class.getResourceAsStream("/dbinfo.properties");
  3. dbProps.load(is);
  4. Class.forName(dbProps.getProperty("db.driver"));

 之后我们连接时就可以根据文件的记录来取值了。


  
  1. public static Connection getCon() {
  2. try {
  3. return DriverManager.getConnection(
  4. dbProps.getProperty("db.connectUrl"),
  5. dbProps.getProperty("db.user"),
  6. dbProps.getProperty("db.pwd"));
  7. }catch(Exception e) {
  8. e.printStackTrace();
  9. return null;
  10. }
  11. }

JDBC知识积累

 

 

1、数据连接池的工作机制?

考察点:连接池

参考回答:

J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

 

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/91491021

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。