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