十二、数据库编程JDBC
二、概述
简述
JDBC是什么?JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。可以用JAVA来写不同类型的可执行文件:JAVA应用程序、JAVA Applets、Java Servlet、JSP等,不同的可执行文件都能通过JDBC访问数据库,又兼备存储的优势。简单说它就是JAVA与数据库的连接的桥梁或者插件,用JAVA代码就能操作数据库的增删改查、存储过程、事务等。
JDBC有什么用?我们用JAVA就能连接到数据库;创建SQL或者MYSQL语句;执行SQL或MYSQL的查询数据库;查看和修改结果记录。
我们思考一下?数据库是由不同生产产商决定的,例如Mysql、Oracle、SQL Server,而如果JAVA JDK不可能说提供对不同数据库的实现吧?还有,JAVA具备天生跨平台的优势,它就提供了JDBC的接口API,具体的实现由不同的生产产商决定。这样,数据库生产产商都根据JAVA API去实现各自的应用驱动,这问题就迎刃而解了。
JDBC的工作原理是什么?我将在下一篇文章叙述JDBC运用的设计模式,以及部分JDK源码。
工作原理图(转自百度百科)
常用接口
提供的接口包括:JAVA API:提供对JDBC的管理链接;JAVA Driver API:支持JDBC管理到驱动器连接。
DriverManager:这个类管理数据库驱动程序的列表,查看加载的驱动是否符合JAVA Driver API的规范。
Connection:与数据库中的所有的通信是通过唯一的连接对象。
Statement:把创建的SQL对象,转而存储到数据库当中。
ResultSet:它是一个迭代器,用于检索查询数据。
三、快速入门
操作流程图
数据类型图
数字类型
时间日期类型
字符串类型
实例练习
1、Connection
public class JDBCUtil {
//Driver类全名
public static String DRIVER=“com.mysql.jdbc.Driver”;
//jdbc协议:子协议://ip:端口号/数据库名
public static String URL=“jdbc:mysql://localhost:3306/test”;
//数据库用户名
public static String USERNAME=“root”;
//数据库密码
public static String PASSWORD=“root”;
private static Connection connection=null;
/**
* 获取JDBC连接
* @return
*/
public static Connection getConnection(){
try {
//加载驱动程序:它通过反射创建一个driver对象。
Class.forName(DRIVER);
//获得数据连接对象。
// 在返回connection对象之前,DriverManager它内部会先校验驱动对象driver信息对不对,我们只要知道内部过程即可。
connection= DriverManager.getConnection(URL,USERNAME,PASSWORD);
return connection;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 通过读取文件连接
* @param fileName
* @return
* @throws SQLException
*/
public Connection getConnectionByLoadSettingFile(String fileName) throws SQLException {
/*
文件里面的内容:跟上面的常量一模一样
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
*/
Properties props=new Properties();
try {
//我的properties文件是放在src根目录下的
InputStream in=DBUtil.class.getResourceAsStream("/"+fileName);
if(null==in)
System.out.println("找不到文件:"+fileName);
props.load(in);
} catch (Exception e) {
e.printStackTrace();
}
String driver=props.getProperty("jdbc.driver");
if(null!=driver)
System.setProperty("jdbc.drivers",driver);
String url=props.getProperty("jdbc.url");
String username=props.getProperty("jdbc.username");
String password=props.getProperty("jdbc.password");
connection=DriverManager.getConnection(url,username,password);
return connection;
}
}
2、Statement
public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
Statement statement=null;
connection=JDBCUtil.getConnection();
statement=connection.createStatement();
//需要在自己的数据库当中建立一张user表
String sql="insert into user(loginName,userName,password,sex)values('tom123','tom','123456',1)";
statement.executeUpdate(sql);
}
}
3、PareparedStatement
public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
PreparedStatement pStatement=null;
connection=JDBCUtil.getConnection();
String sql="insert into user(loginName,userName,password,sex)values(?,?,?,?)";
//预编译
pStatement=connection.prepareStatement(sql);
//前面的索引对应上面的问号,传递参数。
pStatement.setString(1,"tom123");
pStatement.setString(2,"tom");
pStatement.setString(3,"123456");
pStatement.setInt(4,1);
pStatement.executeUpdate();
}
}
4、ResultSet
public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
Statement statement=null;
ResultSet resultSet;
connection=JDBCUtil.getConnection();
String sql="select * from user";
statement=connection.createStatement();
//resultSet就是一个迭代器,里面的方法跟迭代器几乎一致。
resultSet=statement.executeQuery(sql);
while (resultSet.next()){
String loginName=resultSet.getString("loginName");
String userName=resultSet.getString("userName");
String password=resultSet.getString("password");
int sex=resultSet.getInt("sex");
System.out.println(loginName+"-"+userName+"-"+password+"-"+sex);
}
}
}
四、可滚动和可更新的结果集
相关参数
//了解数据集可滚动更新:查看ResultSet接口的几个参数
/** 结果集不能滚动(默认值)*/
int TYPE_FORWARD_ONLY = 1003;
/** 结果集可以滚动,但对数据库变化不敏感*/
int TYPE_SCROLL_INSENSITIVE = 1004;
/**结果集可以滚动,且对数据库变化敏感*/
int TYPE_SCROLL_SENSITIVE = 1005;
/**结果集不能用于更新数据库(默认值)*/
int CONCUR_READ_ONLY = 1007;
/**结果集可以用于更新数据库*/
int CONCUR_UPDATABLE = 1008;
可滚动可更新
注意:可滚动简单说就是设置结果集可更新resultSet目前的游标值。可更新就是可以更新结果集里面的增删改查。可更新简单说,就是获取数据集ResultSet以后改动更加灵活。
public class Client {
public static void main(String [] args){
Connection connection=null;
PreparedStatement pStatement=null;
Statement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getInstance().getConnection();
//第一个参数设置是否可以滚动,第二个参数设置是否可更新
statement=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql=“select * from user”;
ResultSet rs=statement.executeQuery(sql);
/**可滚动的几个方法
rs.previous();
rs.next();
rs.getRow();
rs.absolute(0);
**/
//往数据集里面插入数据同时更新到数据:从表的最后开始插入。
rs.moveToInsertRow();//把游标移动到插入行,默认在最后一行。
rs.updateString("loginName","小白脸");
rs.updateString("userName","大猩猩");
rs.updateString("password","123");
rs.updateInt("sex",100);
rs.insertRow();
rs.moveToCurrentRow();//把游标移动最后一个位置
//删除第十行数据
rs.absolute(10);
rs.deleteRow();
while(rs.next()){
System.out.println(rs.getString(2));
//把数据集里的数据中的性别全部更新为0
rs.updateInt("sex",0);
rs.updateRow();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}