目录
引言:
JDBC介绍
JDBC编程步骤
导入专用的jar包(不同的数据库需要的jar包不同
?URL
?账号密码
?连接演示:
Statement与PreparedStatement接口
使用Statement接口
使用PreparedStatement接口
增删改操作
?查询操作
?获取结果(ResultSet)
获取行
?获取值
释放资源
引言:
????????相信梦想是价值的源泉,相信眼光决定未来的一切,相信成功的信念比成功本身更重要,相信人生有挫折没有失败,相信生命的质量来自决不妥协的信念
JDBC介绍
????????JDBC(Java?DataBase?Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。
JDBC编程步骤
-
导入专用的jar包(不同的数据库需要的jar包不同
?
?
?连接演示:
?????????因为在进行数据库的增删改查的时候都需要与数据库建立连接,所以可以在项目中将建立连接写成一个工具方法,用的时候直接调用即可
Statement与PreparedStatement接口
????????Statement接口创建之后,可以执行SQL语句,完成对数据库的增删改查。其中 ,增删改只需要改变SQL语句的内容就能完成,然而查询略显复杂。在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点,具体在下文中的对比中介绍。所以Statement在实际过程中使用的非常的少,所以具体的放到PreparedStatement那里给出详细代码。
????????字符串拼接方式的SQL语句是非常繁琐的,中间有很多的单引号和双引号的混用,极易出错。
使用PreparedStatement接口
- 使用PreparedStatement接口与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。
增删改操作
?查询操作
//返回多个对象查询操作
public static <T> List<T> getForList(Class<T> clazz, String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
//通过ResultSetMetData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
//--------------------------------
//创建集合对象
ArrayList<T> list = new ArrayList<>();
while (rs.next()) {
T t = clazz.newInstance();
//Customer cust = new Customer();
//处理结果集一行数据中的每一个列:给t对象指定 的属性赋值
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columValue = rs.getObject(i + 1);
//获取每个列的列名
//String columnName = rsmd.getColumnName(i + 1);
String columnLabel = rsmd.getColumnLabel(i + 1);
//给cust对象指定的columnName属性,赋值为columnValue,通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columValue);
}
list.add(t);
}
return list;
//-----------------------------------------------------------
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.colseResource(conn, ps, rs);
}
return null;
}
?运行
String sql2 = "select id,name,email from customers where id < ?";
List<Customer> list = getForList(Customer.class, sql2, 12);
list.forEach(System.out::println);
System.out.println("--------------------------------");
String sql3 = "select order_id orderId,order_name orderName from `order` where order_id < ?";
List<Order> orderList = getForList(Order.class, sql3, 5);
orderList.forEach(System.out::println);
结果:
?获取结果(ResultSet)
Jdbc中的ResultSet封装了Sql语句的执行结果集。Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的指针。初始的时候,索引值是从1开始(数据库要求)指针指向第一个数据。调用ResultSet.next() 方法,使指针指向下一个数据,可以判断下个数据是否为空,或者可以调用getObject(int index)、getString(int index)等方法来获取指向的数据。
获取行
ResultSet提供了对结果集进行指针的方法:
?获取值
ResultSet封装的数据通过get方法取出:
释放资源
????????Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。后创建的对象先关闭,先关闭Statement对象再关闭Connection对象。?
????????看到这里,就连单表查询都需要这么多代码,是不是感觉通过JDBC对数据库操作过于繁琐。所以诞生了Mybatis框架,Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。
|