用JDBC连接 数据库 进行简单的增删改查
JDBC为java的基础。用jdbc实现对数据库的增删改查的功能是程序员的基本要求。本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包。专门用来加载jdbc的驱动。如果数据库为oracle,相应的jar包换为ojdbc6.jar。
通过下面的代码可以练习一下,掌握jdbc的使用方法,自己可以对程序进行相应的扩展,可以试试oracle数据库,也可以试试MongoDB,还可以试试redis等。

package jdbc; import java.sql.*;
import java.util.UUID; public class JDBC_Test {
public static Connection getConnection() throws Exception {
String driver_mysql = "com.mysql.jdbc.Driver";
Class.forName(driver_mysql); // 数据库连接串
String mysql_url ="jdbc:mysql://127.0.0.1:3306/jdbc";
String userName = "root";
String password = "xiangpeng";//密码 // 获取数据库连接
Connection conn = DriverManager.getConnection(mysql_url, userName, password);
return conn;
} public static void main(String[] args) throws Exception {
//调用下面的方法
// JDBC_Test.createTableTest(); //建表
// JDBC_Test.addTest(); //添加
//JDBC_Test.addTest1(); // 预编译添加
// JDBC_Test.batchAddTest(); //批量添加
JDBC_Test.queryTest(); // 查询
// JDBC_Test.updateTest(); //更新
// JDBC_Test.delTest(); //删除
} //建表
public static void createTableTest()throws Exception{
Connection conn=getConnection();
String sql="create table JDBC_STUDENT3("+"ID VARCHAR2(32) NOT NULL,"+"NAME VARCHAR2(32),"+"SEX VARCHAR2(32)"+")";
PreparedStatement prestmt = conn.prepareStatement(sql);
boolean flag = prestmt.execute();
System.out.println("执行结果:"+flag);
prestmt.close();
conn.close();
} //添加
public static void addTest() throws Exception{
Connection conn=getConnection();
Statement stmt=conn.createStatement();
String sql="insert into jdbc_student(id, name, sex, birthday, age)"+"values(seq.nextval,'xp','m','to_date('2009-01-01','yyyy-MM-dd')','24')";
String uuid=getUUID();
String sql_uuid="insert into jdbc_student(id, name, sex, birthday, age)"+"values('"+uuid+"','xp','m','to_date('2009-01-01','yyyy-MM-dd')','24')";
int result=stmt.executeUpdate(sql_uuid);
System.out.println(result);
stmt.close();
conn.close();
} // java注入,采用预编译的方法插入数据
public static void addTest1() throws Exception {
Connection conn = getConnection();
conn.setAutoCommit(false);
String sql = "insert into jdbc_student(id, name, sex, birthday, age)"+ "values(?,?,?,?,?)";
PreparedStatement prestmt = conn.prepareStatement(sql);
String uuid = getUUID();
prestmt.setString(1, uuid);
prestmt.setString(2, "xp");
prestmt.setString(3, "m");
java.util.Date utilDate = new java.util.Date();
java.sql.Timestamp time = new java.sql.Timestamp(utilDate.getTime());
prestmt.setTimestamp(4, time);
prestmt.setInt(5, 24);
// 如果第一个结果是resultSet对象,就返回true;如果第一个结果是更新计数或者没有结果,则返回false
// 意思就是如果是查询的话就返回true,如果是更新或者插入的话就返回false
boolean result = prestmt.execute();
System.out.println("是否执行成功:" + result);
prestmt.close();
conn.close();
} //批量添加
public static void batchAddTest()throws Exception{
Connection conn=getConnection();
//开辟缓存
conn.setAutoCommit(false);
String sqla="insert into jdbc_student(id, name)"+"values('"+getUUID()+"', '张三a')";
String sqlb="insert into jdbc_student(id, name)"+"values('"+getUUID()+"', '张三b')";
String sqlc="insert into jdbc_student(id, name)"+"values('"+getUUID()+"', '张三c')";
Statement stmt =conn.createStatement();
stmt.addBatch(sqla);
stmt.addBatch(sqlb);
stmt.addBatch(sqlc);
} //查询
public static void queryTest() throws Exception {
Connection conn = getConnection();
String sql = "select * from jdbc_student t where name like ?";
PreparedStatement prestmt = conn.prepareStatement(sql);
prestmt.setString(1, "王%");
ResultSet rs = prestmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();// 获取元数据
int columnNum = rsmd.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= columnNum; i++) {
System.out.print(rsmd.getColumnName(i) + ": ");
System.out.println(JDBC_Test.getValue(rs, rsmd.getColumnType(i), rsmd.getColumnName(i)));
}
System.out.println("-----------");
}
prestmt.close();
conn.close();
}
//更新
public static void updateTest()throws Exception{
Connection conn=getConnection();
Statement stmt=conn.createStatement();
String sql="update jdbc_student set name='李四散步吧' where id='2'";
int result=stmt.executeUpdate(sql);
System.out.println(result);
stmt.close();
conn.close();
}
//删除
public static void delTest()throws Exception{
Connection conn=getConnection();
Statement stmt=conn.createStatement();
String sql="delete jdbc_student where id='2'";
int result=stmt.executeUpdate(sql);
System.out.println(result);
stmt.close();
conn.close();
}
//uuid生成方法
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
//获取object的值
public static Object getValue(ResultSet rs, int type, String columnName)throws SQLException {
//type为java.sql.Types的具体对应值
if (type == 4) {// integer类型
return rs.getInt(columnName);
} else if (type == 12) {// varchar2类型
return rs.getString(columnName);
} else if (type == 91) {// date类型
return rs.getDate(columnName);
}
return null;
} }
五、代码分析
在上述对数据库进行增删改查的过程中,可以发现其共性部分,即通用的流程:
(1)创建Connection对象、SQL查询命令字符串;
(2)对Connection对象传入SQL查询命令,获得PreparedStatement对象;
(3)对PreparedStatement对象执行executeUpdate()或executeQurey()获得结果;
(4)先后关闭PreparedStatement对象和Connection对象。
可见,使用JDBC时,最常打交道的是Connection、PreparedStatement这两个类,以及select中的ResultSet类。查阅Java API手册可以了解其具体的意义和方法。
下面引用的Java API的资料出自http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/index.html。
Connection
java.sql
接口 Connection
- 所有超级接口:
- Wrapper
public interface Connectionextends Wrapper与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
Connection对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。此信息是使用getMetaData方法获得的。
PreparedStatemnt
java.sql
接口 PreparedStatement
- 所有已知子接口:
- CallableStatement
public interface PreparedStatementextends Statement表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在
PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。常用方法
boolean execute()
在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。
ResultSet executeQuery()
在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。
int executeUpdate()
在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
ResultSet
java.sql
接口 ResultSet
- 所有超级接口:
- Wrapper
- 所有已知子接口:
- CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet, RowSet, SyncResolver, WebRowSet
public interface ResultSetextends Wrapper表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
六、思考问题
1.每次SQL操作都需要建立和关闭连接,这势必会消耗大量的资源开销,如何避免?
分析:可以采用连接池,对连接进行统一维护,不必每次都建立和关闭。事实上这是很多对JDBC进行封装的工具所采用的。
2.Java代码中,传入的数据格式与数据库定义不同怎么办?如把Java的String对象赋值给数据库的tinyint属性。
分析:在执行SQL语句时,数据库会尝试进行转换。根据我的实验,如果用内容为纯字母的String对象传入tinyint的age属性时,会被转化成0。具体转化规则应该和数据库有关。
参考:https://blog.csdn.net/garfielder007/article/details/52051105
https://www.cnblogs.com/wuyuegb2312/p/3872607.html
用JDBC连接 数据库 进行简单的增删改查的更多相关文章
- 使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理
一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的 ...
- python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作
1.通过 pip 安装 pymysql 进入 cmd 输入 pip install pymysql 回车等待安装完成: 安装完成后出现如图相关信息,表示安装成功. 2.测试连接 import ...
- 数据库中简单的增删改查(CRUD)
一切都是基于数据,而对数据的管理都离不开数据库.最近学到数据库的简单操作,所以写下这篇文章,总结一下学习到的知识.浅陋之处,多多见谅. 补充一下:一直弄不清SQL Server,Mysql ,以及Or ...
- 使用sql对数据库进行简单的增删改查
1.创建表 create table 表名( 列名 列的类型, 列名 列的类型, 列名 列的类型 (注意自后一列不能加‘ ,’) ); 2.修改表 修改表名--> rename 旧表名 t ...
- 【Android】数据库的简单应用——增删改查的操作
还记得getReadableDatabase()和getWritableDatabase()方法吧?在调用它们的时候会返回一个SQLiteDatabase对象,借助这个对象就可以进行CURD(Crea ...
- 通过JDBC进行简单的增删改查
通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...
- 通过JDBC进行简单的增删改查(以MySQL为例) 目录
通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...
- Java通过JDBC进行简单的增删改查(以MySQL为例)
Java通过JDBC进行简单的增删改查(以MySQL为例) 目录: 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JD ...
- JDBC实现最简单的增删改查
好久没写博客了,今天刚进入一家公司实习,在实习这段期间想把自己所学的东西通过博客记录下来 今天上午简单回顾了一下用JDBC实现最简单的增删改查 废话不多说,接下来就说明怎么用JDBC实现最简单的增删改 ...
随机推荐
- oracle根据身份证号码 计算年龄、性别
一.Oracle根据身份证判断性别: 女生身份证: 431382198103246985 男生身份证: 150921197208173492 SQL语句如下: select decode(mod ...
- ol图层支持的数据源
ol.source.BingMaps,必应地图的数据: ol.source.Cluster,聚族矢量数据: ol.source.ImageCanvas,数据来源是一个canvas元素,其中数据是图片: ...
- 记一次FileZillaServer提权
前段时间检测一个企业网站,在检测该企业的一个下属公司的网站时通过用户名admin和密码123456进入了后台,后台目录就是公司汉语拼音+admin,诸如xxxadmin这种形式的.在后台通过“产品图片 ...
- Rabbitmq重启服务器用户丢失解决办法
参考:https://blog.csdn.net/yiluoAK_47/article/details/78173563?utm_source=blogxgwz2 Rabbitmq创建的用户在服务器重 ...
- 一次php访问sql server 2008的API接口的采坑
2018年6月21日17:17:09,注意:不是详细文档,新手可能会看不懂 windows下安装 项目是sql server 2008的k3,php连接数据库写的API,因为是买的时候是别人的程序,测 ...
- js 利用jquery.gridly.js实现拖拽并且排序
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [daily] cscope
手册: http://cscope.sourceforge.net/cscope_vim_tutorial.html 下载 cscope_maps.vim 到 $HOME/.vim/plugin/ 目 ...
- FEX(Fabric Extender)
一.FEX Cisco Nexus 2000 FEX作为N5K.N6K.N7K.FI的一个远程线卡,单独的2K是没有网管功能的,必须配合父系交换机使用. 主要解决TOR和EOR的问题,TOR,接线简单 ...
- Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现
作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...
- Servlet服务器、客户端跳转
服务期跳转.服务器端转发.服务器端重定向是一个意思使用“req.getRequestDispatcher(“跳转路径”).forward(req,resp)”实现服务器端转发 客户端发送请求后数据传输 ...