原生JDBC连接数据库

原生JDBC连接数据库JDBC概述概述JDBC(JavaDataBaseConnectivity,java数据库连接)是SUN公司开发的,一种用于执行SQL语句的JavaAPI JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成 JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供…

大家好,又见面了,我是你们的朋友全栈君。

目录

 

JDBC概述

概述

原理

JDBC入门案例

 API详解

java.sql.DriverManager类

java.sql.Connection接口

java.sql.PreparedStatement接口

java.sql.ResultSet接口

抽取工具类

预处理对象

SQL注入攻击

防止SQL注入攻击

使用防止SQL注入的方式,更新数据库信息

查询所有数据信息


JDBC概述

概述

  • JDBC(Java Data Base Connectivity,java数据库连接)是SUN公司开发的,一种用于执行SQL语句的Java API
  • JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成
  • JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信
  • mysql的驱动mysql-connector-java-5.1.37-bin.jar

原理

原生JDBC连接数据库

  • JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库
  • 驱动一般都由数据库生成厂商提供

JDBC入门案例

  • 准备数据

CREATE TABLE `sort` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `sname` varchar(100) DEFAULT NULL,
  `sprice` double DEFAULT NULL,
  `sdesc` varchar(5000) DEFAULT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;


INSERT INTO `sort` VALUES ('1', '家电', '2000', '优惠的促销');
INSERT INTO `sort` VALUES ('2', '家具', '8900', '家具价格上调,原材料涨价');
INSERT INTO `sort` VALUES ('3', '儿童玩具', '300', '赚家长钱');
INSERT INTO `sort` VALUES ('4', '生鲜', '500.99', '生鲜商品');
INSERT INTO `sort` VALUES ('5', '服装', '24000', '换季销售');
INSERT INTO `sort` VALUES ('6', '洗涤', '50', '洗发水促销');
INSERT INTO `sort` VALUES ('7', '汽车用品', '50000', '疯狂涨价');
  • 导入驱动jar包

原生JDBC连接数据库

  • JDBC核心类
    •  java.sql.DriverManager:管理JDBC程序的
    • java.sql.Connection:java程序与数据库之间建立的连接,相当于一个管道
    • java.sql.Statement:用于执行SQL语句,并返回结果
    •  java.sql.ResultSet:存储数据库查询的结果
  • 开发步骤
    • 注册驱动.
    • 获得连接.
    • 获得语句执行平台
    • 执行sql语句
    • 处理结果
    • 释放资源.
  • 案例实现
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;


/*
 * JDBC操作数据库的步骤:
 * 1.注册驱动
 * 		告知JVM使用的是哪一个数据库的驱动
 * 2.获得连接
 * 		使用JDBC中的类,完成对mysql数据库的连接(TCP协议)
 * 3.获得语句执行平台
 * 		通过连接对象获取对SQL语句的执行者对象
 * 4.执行sql语句
 * 		使用执行者对象,向数据库执行SQL语句
 * 		获取数据库的执行后的结果
 * 5.处理结果
 * 6.释放资源
 * 		调用一堆close
 */
public class JDBCTest {

	public static void main(String[] args) throws Exception {

		// 1. 注册驱动
		// 使用java.sql.DriverManager类的静态方法registerDriver(Driver driver)
		// Driver是一个接口,参数传递:MySQL驱动程序的实现类
		// DriverManager.registerDriver(new Driver());
		// 查看驱动类源码,注册两次驱动,浪费资源
		Class.forName("com.mysql.jdbc.Driver");
		// 2. 获得连接
		// uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字
		String url = "jdbc:mysql://localhost:3306/itheima";
		// static Connection getConnection(String url, String user, String password)
		// 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中
		Connection conn = DriverManager.getConnection(url, "root", "root");
		System.out.println(conn);// com.mysql.jdbc.JDBC4Connection@10d1f30
		// 3. 获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象
		//conn对象,调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库
		//返回的是Statement接口的实现类对象,在MySQL驱动程序中
		Statement stat = conn.createStatement();
		System.out.println(stat);//com.mysql.jdbc.StatementImpl@137bc9
		// 4. 执行sql语句
		//通过执行者对象调用方法执行SQL语句,获取结果
		//int executeUpdate(String sql)  执行数据库中的SQL语句,仅限于insert,update,delete
		//返回值int,操作成功数据库的行数
		int row = stat.executeUpdate("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车用品',50000,'疯狂涨价')");
		System.out.println(row);
		// 5. 释放资源
		stat.close();
		conn.close();
	}

}

原生JDBC连接数据库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCDemo {

	public static void main(String[] args) throws Exception {
		// 1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2.获取连接对象
		String url = "jdbc:mysql://localhost:3306/itheima";
		Connection conn = DriverManager.getConnection(url, "root", "root");
		// 3.获取执行SQL语句
		Statement stat = conn.createStatement();
		// 拼写SQL语句
		String sql = "select * from sort";
		// 4.调用执行者对象方法,执行SQL语句获取结果集
		// 返回的是ResultSet接口的实现类对象,实现类在mysql驱动中
		ResultSet rs = stat.executeQuery(sql);
		// System.out.println(rs);//com.mysql.jdbc.JDBC4ResultSet@18cef0a
		// 5.处理结果集
		// ResultSet接口的方法 boolean next() 有结果集true,没有结果集返回false
		while (rs.next()) {
			// 获取每列的数据,使用的是ResultSet接口的方法getXXX
			int sid = rs.getInt("sid");// 相当于rs.getInt(1);这个方法有弊端
			String sname = rs.getString("sname");
			double sprice = rs.getDouble("sprice");
			String sdesc = rs.getString("sdesc");
			
			System.out.println(sid+"\t"+sname+"\t"+sprice+"\t"+sdesc);
			
		}
		// 6.关闭资源
		rs.close();
		stat.close();
		conn.close();

	}
}

 

 API详解

java.sql.DriverManager类

public static Connection getConnection(String url, String user, String password)//建立到给定数据库URL 的连接
public static void registerDriver(Driver driver);//注册驱动

java.sql.Connection接口

PreparedStatement prepareStatement(String sql);//创建一个PreparedStatement 对象,高效执行SQL语句

java.sql.PreparedStatement接口

ResultSet executeQuery()//执行查询语句,返回结果集
int executeUpdate();//执行更新语句,返回成功修改的行数
void setObject(int parameterIndex, Object x)//给占位符设置参数

java.sql.ResultSet接口

boolean next();//从当前位置向后移一行

抽取工具类

jdbc.properties配置文件

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/itheima
user=root
password=root

 

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 使用JDBC工具类,获取数据库的连接 采用读取配置文件的方式 读取配置文件,获取连接,执行一次,static{}
 */
public class JDBCUtilsConfig {

	private static Connection con;

	private static String driverClass;
	private static String url;
	private static String user;
	private static String password;

	static {
		try {
			readConfig();
			Class.forName(driverClass);

		} catch (Exception e) {
			throw new RuntimeException("数据库连接失败");
		}
	}

	/**
	 * @Title: readConfig
	 * @Description:读取配置文件
	 * @throws IOException
	 */
	private static void readConfig() throws IOException {

		InputStream is = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("jdbc.properties");
		Properties pro = new Properties();
		pro.load(is);
		driverClass = pro.getProperty("driverClass");
		url = pro.getProperty("url");
		user = pro.getProperty("user");
		password = pro.getProperty("password");
	}

	public static Connection getConnection() {
		try {
			con = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}

	public static void close(Connection con, Statement stat) {

		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException ex) {
			}
		}

		if (con != null) {
			try {
				con.close();
			} catch (SQLException ex) {
			}
		}

	}

	public static void close(Connection con, Statement stat, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException ex) {
			}
		}

		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException ex) {
			}
		}

		if (con != null) {
			try {
				con.close();
			} catch (SQLException ex) {
			}
		}

	}
}

 测试工具类

import java.sql.Connection;

import com.itheima.utils.JDBCUtilsConfig;

public class TestJDBCUtils {

	public static void main(String[] args) {
		Connection con = JDBCUtilsConfig.getConnection();
		System.out.println(con);
	}
}

 原生JDBC连接数据库

预处理对象

SQL注入攻击

create table users(
	id int primary key auto_increment,
	username varchar(100),
	password varchar(100)
);

insert into users (username,password) values ('a','1'),('b','2');

select * from users;

-- SQL注入攻击(无论用户名和密码是什么,结果都是查询所有数据)
select * from users where username ='wess' and password ='*nkj' or 1=1

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/*
 * java程序实现用户登录,用户名和密码,数据库检查
 * 演示被别人注入攻击
 */
public class JDBCDemo02 {

	public static void main(String[] args) throws Exception {
		// 1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2.获取连接对象
		String url = "jdbc:mysql://localhost:3306/itheima";
		Connection conn = DriverManager.getConnection(url, "root", "root");
		// 3.获取执行SQL语句
		Statement stat = conn.createStatement();
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入用户名:");
		String user = sc.nextLine();
		System.out.println("请输入密码:");
		String pass = sc.nextLine();
		// 拼写SQL语句
		String sql = "select * from users where username ='"+user+"' and password ='"+pass+"'";
		System.out.println(sql);
		// 4.调用执行者对象方法,执行SQL语句获取结果集
		ResultSet rs = stat.executeQuery(sql);
		// 5.处理结果集
		while (rs.next()) {
			System.out.println(rs.getString("username") + "\t" + rs.getString("password"));
		}
		// 6.关闭资源
		rs.close();
		stat.close();
		conn.close();
	}
}

 

原生JDBC连接数据库

防止SQL注入攻击

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/*
 *  Java程序实现用户登录,用户名和密码,数据库检查
 *  防止注入攻击
 *  	Statement接口实现类,作用执行SQL语句,返回结果集
 *  		有一个子接口PreparedStatement  (SQL预编译存储,多次高效的执行SQL) 
 * 		PreparedStatement的实现类数据库的驱动中,如何获取接口的实现类
 *  	Connection数据库连接对象的方法
 *  	PreparedStatement prepareStatement(String sql)         
 */
public class JDBCDemo03 {

	public static void main(String[] args) throws Exception {
		// 1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2.获取连接对象
		String url = "jdbc:mysql://localhost:3306/itheima";
		Connection conn = DriverManager.getConnection(url, "root", "root");
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入用户名:");
		String user = sc.nextLine();
		System.out.println("请输入密码:");
		String pass = sc.nextLine();
		// 拼写SQL语句
		String sql = "select * from users where username = ? and password = ? ";
		// 3.获取执行SQL语句
		//Connection接口
		PreparedStatement pst = conn.prepareStatement(sql);
		//调用pst对象的setXXX方法设置问号占位符的参数
		pst.setObject(1, user);
		pst.setObject(2, pass);
		System.out.println(sql);
		// 4.调用执行者对象方法,执行SQL语句获取结果集
		ResultSet rs = pst.executeQuery();
		// 5.处理结果集
		while (rs.next()) {
			System.out.println(rs.getString("username") + "\t" + rs.getString("password"));
		}
		// 6.关闭资源
		rs.close();
		pst.close();
		conn.close();
	}
}

使用防止SQL注入的方式,更新数据库信息

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/**
 * @Title: JDBCDemo04
 * @Description:防止SQL注入的方法,增加一条数据
 * @author jsz
 * @date 2018年7月22日 
 */
public class JDBCDemo04 {

	public static void main(String[] args) throws Exception {
		// 1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2.获取连接对象
		String url = "jdbc:mysql://localhost:3306/itheima";
		Connection conn = DriverManager.getConnection(url, "root", "root");

		// 3.拼写修改的SQL语句,参数采用?占位
		String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
		// 4.调用数据库连接对象con的方法prepareStatement获取SQL语句的预编译对象
		PreparedStatement pst = conn.prepareStatement(sql);
		// 5.调用pst的方法setXXX设置?占位
		pst.setObject(1, "汽车美容");
		pst.setObject(2, 49988);
		pst.setObject(3, 7);
		// 6.调用pst方法执行SQL语句
		pst.executeUpdate();
		// 7.关闭资源
		pst.close();
		conn.close();
	}
}

查询所有数据信息

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/*
 * PreparedStatement接口实现数据表的查询操作
 */
public class JDBCDemo05 {

	public static void main(String[] args) throws Exception {
		// 1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 2.获取连接对象
		String url = "jdbc:mysql://localhost:3306/itheima";
		Connection conn = DriverManager.getConnection(url, "root", "root");

		// 3.拼写修改的SQL语句,参数采用?占位
		String sql = "select * from sort";
		// 4.调用数据库连接对象con的方法prepareStatement获取SQL语句的预编译对象
		PreparedStatement pst = conn.prepareStatement(sql);
		// 5.调用pst方法执行SQL语句
		ResultSet rs = pst.executeQuery();
		while(rs.next()){
			System.out.println(rs.getString("sid")+"\t"+rs.getString("sname")+"\t"+rs.getString("sprice")+"\t"+rs.getString("sdesc"));
		}
		// 7.关闭资源
		rs.close();
		pst.close();
		conn.close();
	}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159744.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 注册豪礼

    注册豪礼

  • LabVIEW灰度图像操作与运算(基础篇—2)[通俗易懂]

    LabVIEW灰度图像操作与运算(基础篇—2)[通俗易懂]图像操作、像素操作以及图像运算等前期的图像操作不仅会在空间域增强图像,还能极大地提高后续图像处理算法的执行速度及其有效性。

  • idea2021.12.13激活码_在线激活

    (idea2021.12.13激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html4C3L012EAA-eyJsa…

  • JVM 优化实战[通俗易懂]

    JVM 优化实战[通俗易懂]本文讲解了JVM的内存划分和分配策略,并以截图和脚本展示常用可视化和命令行工具的使用方法,完整演示了JVM优化、内存泄露排查、gc.log分析方法等。作者:王克锋 出处:https://kefeng.wang/2016/11/22/java-jvm/ 版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。1GC相关内存1.1内存划分1.1.1堆(Heap)存放 newM…

  • Wol 网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑

    Wol 网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑文章目录Wol网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑1、远程唤醒简介2、需要以下唤醒条件3、环境和准备工作4、配置路由器,让路由器接收你的远程开机命令5、测试配置的网络是否能够正常收到开机信号6、装个teamviewer,开机自启动,实现远程开机和远程控制Wol网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑1、远程唤醒简介远程唤醒技术(WOL,Wake-…

  • Java多线程详解

    Java多线程详解多任务现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时间依旧只做了一件事情。多线程原来是一条路,慢慢因为车太多了,道路堵塞,效率极低。为了提高使用的效率

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号