前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JSP (3)------JDBC编程1

JSP (3)------JDBC编程1

作者头像
py3study
发布2020-01-14 15:44:02
5540
发布2020-01-14 15:44:02
举报
文章被收录于专栏:python3

JDBC API :

是一系列的编程接口,可以用来连接数据库,访问数据等。

DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持。

Connection:用于连接某一指定的数据库

Statement : 提供了执行sql语句,获取查询结果的方法。有两个子接口。分别是:

  • PrepareStatement:用于执行预编译的sql语句

ResultSet : 提供了对结果集处理的方法

JDBC Driver API

是面向驱动程序开发商的接口,JDBC驱动程序主要有四种类型:

  • JDBC-ODBC bridge : 将JDBC的调用全部委托给其他其他编程接口调用
  • 部分Java技术的本地API驱动程序: 部分基于java,其他的委托给本地客户端的代码实现
  • 全部基于java技术的本地API驱动程序
  • 全部基于java技术的本地协议驱动。

写一个JDBC的应用程序:

首先,在mysql中创建表:

代码语言:javascript
复制
/*创建用户表*/
create table tbl_user(
	id int(11) unsigned not null auto_increment,
	name varchar(50) not null default '',
	password varchar(50) not null default '',
	email varchar(50) default '',
	primary key (id)
)
engine = InnoDB	   /*mysql存储引擎的一种,支持事务*/
default charset = utf8;

/*创建地址表*/
create table tbl_address(
	id int(11) unsigned not null auto_increment,
	city varchar(20) default null,
	country varchar(20) default null,
	user_id int(11) unsigned not null,  /*用户表的主键*/
	primary key(id)
)
engine = InnoDB
default charset = utf8;

在数据库中显示如下:

wKiom1V1X2rQyupBAAA7DZ4IoFo049.jpg
wKiom1V1X2rQyupBAAA7DZ4IoFo049.jpg
wKiom1V1X-XwqV3eAADX1QSglL0293.jpg
wKiom1V1X-XwqV3eAADX1QSglL0293.jpg
wKioL1V1YYnRN9LlAADN0HsV_xw343.jpg
wKioL1V1YYnRN9LlAADN0HsV_xw343.jpg
代码语言:javascript
复制
/*向表中插入数据*/
insert into tbl_user(id, name, password, email) values
(1,'xiaoming', '123456', 'xiaom@sina.com'),
(2, 'daming', '654321','daming@163.com');

insert into tbl_address(city, country, user_id) values
('beijing', 'china', 1),
('NewYork', 'USA', 2);

JDBC 编程的步骤:

  • 加载驱动
  • 打开连接
  • 执行查询
  • 处理结果
  • 清理环境

添加java代码测试:将user表中的数据输出

代码语言:javascript
复制
package com.jike.jdbc;

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

public class JDBCTest {
	public static void main(String[] args) {
		String sql = "SELECT * FROM tbl_user";
		Connection conn = null;   // 当前的数据连接
		Statement st = null;   // 向数据库发送sql语句
		ResultSet rs = null;   // 封装从数据库里查询到的数据
		// 用ctrl+shift+o自动导入以上用到的三个接口
		try {
			Class.forName("com.mysql.jdbc.Driver"); // 注册MySQL的jdbc驱动程序  
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******", "*******");// 获取数据库连接,后面两个分别是数据库用户名和密码
			st = conn.createStatement();
			rs = st.executeQuery(sql);   // 发送sql语句
			
			while(rs.next()){
				System.out.print(rs.getInt("id")+" ");
				System.out.print(rs.getString("name")+" ");
				System.out.print(rs.getString("password")+" ");
				System.out.print(rs.getString("email")+" ");
				System.out.println();
				
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{ // 关闭顺序由小到大
			try{
				rs.close();
			}catch(Exception e2){
			}
			try {
				st.close();
			} catch (Exception e3) {
				// TODO: handle exception
			}
			try {
				conn.close();
			} catch (Exception e4) {
				// TODO: handle exception
			}
		}
	}
}

JDBC数据库的插入,更新,删除

代码语言:javascript
复制
package com.jike.jdbc;

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

public class JDBCTest {
	
	// 获取数据库连接
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");  
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "********", "*********");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}
	
	// 向数据库表中插入数据
	public static void insert(){
		Connection conn = getConnection();
		try {
			String sql = "insert into tbl_user(name, password, email)"+
							"values('deci', '2255225', 'deci@mail.com')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向数据库中插入了" + count + "条记录");
			conn.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	// 更新内容
	public static void update(){
		Connection conn = getConnection();
		try {
			String sql = "update tbl_user set email='dddd@123.com' where name = 'deci'";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向数据库中更新了" + count + "条记录");
			conn.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	//删除记录
	public static void delete(){
		Connection conn = getConnection();
		try {
			String sql = "delete from tbl_user where name = 'deci'";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向数据库删除了" + count + "条记录");
			conn.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		//insert();
		//update();
		delete();
	}
}

依次调用定义的方法,得到如图结果:

wKiom1V8Ya3Ty8hqAAIrJraJzDA435.jpg
wKiom1V8Ya3Ty8hqAAIrJraJzDA435.jpg

JDBC 编程 ----事务处理:

事务:维护数据一致性的工作单位,要么全部执行,要么全部不执行。

事务的基本特征:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

与事务相关的sql语句

开始事务: begin transaction

提交事务: commit transaction

回滚事务:rollback transaction

举例:在用户表和地址表中分别插入数据:

用户表 插入:

代码语言:javascript
复制
"insert into tbl_user(id, name, password, email)"+
         "values(10, 'Tom', '2525252', 'tom@123.com')"

地址表插入:

代码语言:javascript
复制
"insert into tbl_address(id, city, country, user_id)"+
	"values(1, 'shanghai', 'china', '10')";

可以看出,原有的数据库中地址表中已经有主键id=1的数据,程序会报出主键冲突的错误,具体代码如下:

代码语言:javascript
复制
package com.jike.jdbc;

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

public class TransactionTest {
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******","*******");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}
	
	// 向用户表中插入数据
	public static void insertUserData(){
		Connection conn = getConnection();
		try {
			String sql = "insert into tbl_user(id, name, password, email)"+
						"values(10, 'Tom', '2525252', 'tom@123.com')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向用户表中插入了"+count+"条数据");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	// 向地址表中插入数据
	public static void insertAddressData(){
		Connection conn = getConnection();
		try {
			String sql = "insert into tbl_address(id, city, country, user_id)"+
						"values(1, 'shanghai', 'china', '10')";
			//这里注意, 因为这条语句规定插入地址表中的数据id号为1,但是地址表中已经有id=1的数据,因此会抛出异常
			// 这是一个很严重的问题,因为数据只有部分被插入。需要采用事务保证数据要么完全插入,要么全部回滚。
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向地址表中输入了"+count+"条记录");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		insertUserData();
		insertAddressData();
	}
	
	
}

程序报出异常如图:

wKioL1V8bWPz3blyAAPCUg8UNTg851.jpg
wKioL1V8bWPz3blyAAPCUg8UNTg851.jpg

这是,数据表中的插入结果如下:

wKioL1V8baPR-rVSAAEyfIe30qs590.jpg
wKioL1V8baPR-rVSAAEyfIe30qs590.jpg

可见,地址表中的信息没有正确插入,而用户表中的信息插入成功,这种插入是非常危险的,其无法保持数据的完整性。因此使用事务来处理这类问题。

极客学院地址:http://www.jikexueyuan.com/course/625.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档