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代码的可读性。

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

花卉类:


  
   
    
     
    
    
     
      package pojo;
     
    
   
    
     
    
    
     
      /**
     
    
   
    
     
    
    
     
       * 花卉实体类
     
    
   
    
     
    
    
     
       * @author fan
     
    
   
    
     
    
    
     
       *
     
    
   
    
     
    
    
     
       */
     
    
   
    
     
    
    
     
      public class Flower {
     
    
   
    
     
    
    
     	private int id;//编号
     
    
   
    
     
    
    
     	private String name;//名称
     
    
   
    
     
    
    
     	private double price;//价格
     
    
   
    
     
    
    
     	private String prodution;//产地
     
    
   
    
     
    
    
     	public int getId() {
     
    
   
    
     
    
    
     		return id;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public void setId(int id) {
     
    
   
    
     
    
    
     		this.id = id;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public String getName() {
     
    
   
    
     
    
    
     		return name;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public void setName(String name) {
     
    
   
    
     
    
    
     		this.name = name;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public double getPrice() {
     
    
   
    
     
    
    
     		return price;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public void setPrice(double price) {
     
    
   
    
     
    
    
     		this.price = price;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public String getProdution() {
     
    
   
    
     
    
    
     		return prodution;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	public void setProdution(String prodution) {
     
    
   
    
     
    
    
     		this.prodution = prodution;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     
      }
     
    
  
 

对应的mysql:


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

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


  
   
    
     
    
    
     
      package dao.impl;
     
    
   
    
     
    
    
      
     
    
   
    
     
    
    
     
      import java.sql.Connection;
     
    
   
    
     
    
    
     
      import java.sql.DriverManager;
     
    
   
    
     
    
    
     
      import java.sql.PreparedStatement;
     
    
   
    
     
    
    
     
      import java.sql.ResultSet;
     
    
   
    
     
    
    
     
      import java.util.ArrayList;
     
    
   
    
     
    
    
     
      import java.util.List;
     
    
   
    
     
    
    
      
     
    
   
    
     
    
    
     
      import com.sun.crypto.provider.RSACipher;
     
    
   
    
     
    
    
     
      import com.sun.java.util.jar.pack.Package.Class;
     
    
   
    
     
    
    
     
      import com.sun.org.apache.regexp.internal.recompile;
     
    
   
    
     
    
    
      
     
    
   
    
     
    
    
     
      import dao.FlowerDao;
     
    
   
    
     
    
    
     
      import pojo.Flower;
     
    
   
    
     
    
    
      
     
    
   
    
     
    
    
     
      public class FlowerDaoImpl implements FlowerDao{
     
    
   
    
     
    
    
     		//查询所有花卉信息
     
    
   
    
     
    
    
     	@Override
     
    
   
    
     
    
    
     	public List<Flower> getFlowerInfoDao() {
     
    
   
    
     
    
    
     		//声明jdbc变量
     
    
   
    
     
    
    
     
      		Connection conn=null;
     
    
   
    
     
    
    
     
      		PreparedStatement ps=null;
     
    
   
    
     
    
    
     
      		ResultSet rs=null;
     
    
   
    
     
    
    
     		//创建集合
     
    
   
    
     
    
    
     
      		List<Flower> lf=null;
     
    
   
    
     
    
    
     		try {
     
    
   
    
     
    
    
     			//加载驱动
     
    
   
    
     
    
    
     
      			Class.forName("com.mysql.jdbc.Driver");
     
    
   
    
     
    
    
     			//创建连接对象
     
    
   
    
     
    
    
     
      			conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "ytywan1314");
     
    
   
    
     
    
    
     			//sql命令
     
    
   
    
     
    
    
     
      			String sql="select * from flower";
     
    
   
    
     
    
    
     			//创建sql命令对象
     
    
   
    
     
    
    
     
      			ps=conn.prepareStatement(sql);
     
    
   
    
     
    
    
     			//给占位符赋值
     
    
   
    
     
    
    
     			//执行
     
    
   
    
     
    
    
     
      			rs=ps.executeQuery();
     
    
   
    
     
    
    
     
      			lf=new ArrayList<>();
     
    
   
    
     
    
    
     			//遍历,封装到对象中
     
    
   
    
     
    
    
     			while(rs.next()) {
     
    
   
    
     
    
    
     
       Flower f=new Flower();
     
    
   
    
     
    
    
     
       f.setId(rs.getInt("id"));
     
    
   
    
     
    
    
     
       f.setName(rs.getString("name"));
     
    
   
    
     
    
    
     
       f.setPrice(rs.getDouble("price"));
     
    
   
    
     
    
    
     
       f.setProdution(rs.getString("production"));
     
    
   
    
     
    
    
     
       lf.add(f);
     
    
   
    
     
    
    
     
      			}
     
    
   
    
     
    
    
     			
     
    
   
    
     
    
    
     
      		} catch (Exception e) {
     
    
   
    
     
    
    
     
      			e.printStackTrace();
     
    
   
    
     
    
    
     
      		}finally {
     
    
   
    
     
    
    
     			//关闭资源
     
    
   
    
     
    
    
     
      			rs.close();
     
    
   
    
     
    
    
     
      			ps.close();
     
    
   
    
     
    
    
     
      			conn.close();
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     		//返回
     
    
   
    
     
    
    
     		return lf;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	
     
    
   
    
     
    
    
     
      }
     
    
  
 

util

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


  
   
    
     
    
    
     
      public class BaseDao {
     
    
   
    
     
    
    
     	private static String driver = "com.mysql.jdbc.Driver";		//数据库驱动字符串
     
    
   
    
     
    
    
     	private static String url ="jdbc:mysql://localhost:3306/jeep";
     
    
   
    
     
    
    
     	private static String user ="sa";		//用户名
     
    
   
    
     
    
    
     	private static String password ="";	//密码
     
    
   
    
     
    
    
     	
     
    
   
    
     
    
    
     	protected Connection conn;
     
    
   
    
     
    
    
     	protected PreparedStatement pstmt;
     
    
   
    
     
    
    
     	protected java.sql.ResultSet rs;
     
    
   
    
     
    
    
     	/**
     
    
   
    
     
    
    
     
       * 
     
    
   
    
     
    
    
     
       * 获取数据库连接对象
     
    
   
    
     
    
    
     
       */
     
    
   
    
     
    
    
     	public Connection getConnection(){
     
    
   
    
     
    
    
     
      		Connection conn = null;		//数据库连接对象
     
    
   
    
     
    
    
     		//获取连接并捕捉异常
     
    
   
    
     
    
    
     		try {
     
    
   
    
     
    
    
     
      			Class.forName(driver);
     
    
   
    
     
    
    
     
      			conn = DriverManager.getConnection(url,user,password);
     
    
   
    
     
    
    
     
      		} catch (Exception e)	{
     
    
   
    
     
    
    
     
      			e.printStackTrace();	
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     		return conn;	//返回连接对象
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	/**
     
    
   
    
     
    
    
     
       * 
     
    
   
    
     
    
    
     
       * 关闭数据库连接
     
    
   
    
     
    
    
     
       */
     
    
   
    
     
    
    
     	public void closeAll(Connection conn, Statement stmt, java.sql.ResultSet rs){
     
    
   
    
     
    
    
     		//若结果集对象不为空,则关闭
     
    
   
    
     
    
    
     		if (rs !=null){
     
    
   
    
     
    
    
     			try {
     
    
   
    
     
    
    
     
       rs.close();
     
    
   
    
     
    
    
     
      			} catch (Exception e){
     
    
   
    
     
    
    
     
       e.printStackTrace();
     
    
   
    
     
    
    
     
      			}
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     		//若Statement对象不为空,则关闭
     
    
   
    
     
    
    
     		if (stmt !=null){
     
    
   
    
     
    
    
     			try {
     
    
   
    
     
    
    
     
       stmt.close();
     
    
   
    
     
    
    
     
      			} catch (Exception e){
     
    
   
    
     
    
    
     
       e.printStackTrace();
     
    
   
    
     
    
    
     
      			}
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     		//若数据库连接对象不为空,则关闭
     
    
   
    
     
    
    
     		if (conn !=null){
     
    
   
    
     
    
    
     			try {
     
    
   
    
     
    
    
     
       conn.close();
     
    
   
    
     
    
    
     
      			} catch (Exception e){
     
    
   
    
     
    
    
     
       e.printStackTrace();
     
    
   
    
     
    
    
     
      			}
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     	/**
     
    
   
    
     
    
    
     
       * 增删改
     
    
   
    
     
    
    
     
       */
     
    
   
    
     
    
    
     	public int exceuteUpdate(String sql,Object...prams){
     
    
   
    
     
    
    
     		int result = 0;
     
    
   
    
     
    
    
     		//获取连接
     
    
   
    
     
    
    
     
      		conn = this.getConnection();
     
    
   
    
     
    
    
     		try {
     
    
   
    
     
    
    
     
      			pstmt = conn.prepareStatement(sql);
     
    
   
    
     
    
    
     			for (int i=0;i<prams.length;i++){
     
    
   
    
     
    
    
     
       pstmt.setObject(i+1, prams[i]);
     
    
   
    
     
    
    
     
      			}
     
    
   
    
     
    
    
     
      			result = pstmt.executeUpdate();
     
    
   
    
     
    
    
     
      		} catch (SQLException e){
     
    
   
    
     
    
    
     
       e.printStackTrace();
     
    
   
    
     
    
    
     
      		} finally {
     
    
   
    
     
    
    
     			//关闭资源
     
    
   
    
     
    
    
     
      			closeAll(conn,pstmt,rs);
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     		return result;
     
    
   
    
     
    
    
     
      	}
     
    
   
    
     
    
    
     
      }
     
    
  
 

properties

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

比如:dbinfo.properties文件内容:


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

 java:


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

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


  
   
    
     
    
    
     	public static Connection getCon() {
     
    
   
    
     
    
    
     		try {
     
    
   
    
     
    
    
     			return DriverManager.getConnection(
     
    
   
    
     
    
    
     
       dbProps.getProperty("db.connectUrl"), 
     
    
   
    
     
    
    
     
       dbProps.getProperty("db.user"),
     
    
   
    
     
    
    
     
       dbProps.getProperty("db.pwd"));
     
    
   
    
     
    
    
     
      		}catch(Exception e) {
     
    
   
    
     
    
    
     
      			e.printStackTrace();
     
    
   
    
     
    
    
     			return null;
     
    
   
    
     
    
    
     
      		}
     
    
   
    
     
    
    
     
      	}
     
    
  
 

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个月内不可修改。