发布时间:2019-08-09 09:14:30编辑:auto阅读(1423)
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中创建表:
/*创建用户表*/ 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;
在数据库中显示如下:
/*向表中插入数据*/ 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表中的数据输出
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数据库的插入,更新,删除
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(); } }
依次调用定义的方法,得到如图结果:
JDBC 编程 ----事务处理:
事务:维护数据一致性的工作单位,要么全部执行,要么全部不执行。
事务的基本特征:
原子性
一致性
隔离性
持久性
与事务相关的sql语句
开始事务: begin transaction
提交事务: commit transaction
回滚事务:rollback transaction
举例:在用户表和地址表中分别插入数据:
用户表 插入:
"insert into tbl_user(id, name, password, email)"+ "values(10, 'Tom', '2525252', 'tom@123.com')"
地址表插入:
"insert into tbl_address(id, city, country, user_id)"+ "values(1, 'shanghai', 'china', '10')";
可以看出,原有的数据库中地址表中已经有主键id=1的数据,程序会报出主键冲突的错误,具体代码如下:
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(); } }
程序报出异常如图:
这是,数据表中的插入结果如下:
可见,地址表中的信息没有正确插入,而用户表中的信息插入成功,这种插入是非常危险的,其无法保持数据的完整性。因此使用事务来处理这类问题。
上一篇: 3秒返回
下一篇: krypton系列0-3
47495
45796
36794
34326
28969
25599
24444
19612
19112
17634
5467°
6049°
5571°
5639°
6574°
5377°
5379°
5886°
5856°
7172°