jdbc的连接数据库,使用PreparedStatement实现增删改查等接口
首先是连接,关闭资源等数据库操作
将连接数据库,关闭资源封装在JDBCUtils里
package jdbc.utils; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; public class JDBCUtils {
//获取数据库连接函数
public static Connection getConnection() throws Exception {
Class clazz=Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:1433;databaseName=EDUCATION";
Connection con = DriverManager.getConnection(url,"sa","1");
System.out.println("连接成功");
return con;
}
//关闭连接和操作指针
public static void closeResource(Connection con,PreparedStatement ps) {
try {
if(ps != null)
ps.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
try {
if(con != null)
con.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
} //关闭连接,信使,结果集
public static void closeResource(Connection con,PreparedStatement ps,ResultSet resultSet) {
try {
if(ps != null)
ps.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
try {
if(con != null)
con.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
try {
if(resultSet != null)
resultSet.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
使用PreparedStatement对数据库进行单条的增删改等操作以及通用的操作
package jdbc_practice.preparedstatement.crud; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import jdbc.utils.JDBCUtils;; /*
* PreparedStatement代替Statement, 实现对数据库增删改
* */ public class PreparedStatementUpdateTest {
//增加class的一条记录
public static void testAdd() {
Connection con=null;
PreparedStatement ps=null;
try {
con=JDBCUtils.getConnection(); String sql="insert into class values(?,?)";
ps=con.prepareStatement(sql);
ps.setObject(1,"030103");
ps.setObject(2, "物联网");
ps.execute();
System.out.println("增加成功");
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, ps);
}
}
//修改class的一条记录
public static void testUpdate(){
Connection con=null;
PreparedStatement ps=null;
try {
con = JDBCUtils.getConnection(); //建立信使ps,预编译sql语句
String sql = "update class set cName = ? where classId = ?";
ps = con.prepareStatement(sql); //填充占位符
ps.setObject(1, "数媒");
ps.setObject(2, "030100"); //执行
ps.execute();
System.out.println("修改成功");
}
catch(Exception e) {
e.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, ps);
}
}
//删除class的一条记录
public static void testDelete() {
Connection con=null;
PreparedStatement ps=null;
try {
con=JDBCUtils.getConnection(); String sql="delete class where cName=?";
ps=con.prepareStatement(sql);
ps.setObject(1,"计科");
ps.execute();
System.out.println("删除成功");
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, ps);
}
} //通用增删改,参数为预编译的sql,和可变形参args用来充当占位符
public static void update(String sql,Object ...args) {
Connection con = null;
PreparedStatement ps=null;
try {
//1.获取连接
con=JDBCUtils.getConnection();
//2.预编译sql,返回ps实例
ps=con.prepareStatement(sql);
//填充占位符,sql中的占位符个数=args数组长度
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
}
//4.执行
ps.execute(); System.out.println("执行成功 ");
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
//5.关闭资源
JDBCUtils.closeResource(con, ps);
}
} //对上述三种操作进行测试
public static void main(String []args) {
String sql="insert into class values(?,?)";
String s1,s2;
s1="030104";
s2="计创";
update(sql,s1,s2); sql="delete from class where cName=?";
s1="计创";
update(sql,s1); sql="update class set cName=? where classId=?";
s1="计创";
s2="030102";
update(sql,s1,s2);
}
}
使用PreparedStatement对表进行通用查询操作,即查询字段args是个可变参数
package jdbc_practice.preparedstatement.crud;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData; import java.lang.reflect.Field; import jdbc.utils.*;
import bean.Class; public class ClassforQuery {
//对表的通用查询操作:即查询字段是个可变参数
public static Class queryForClass(String sql,Object...args) {
Connection con = null;
PreparedStatement ps=null;
ResultSet res = null;
try {
con=JDBCUtils.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
} res=ps.executeQuery();
//获取结果集的元数据 ,元数据指的是每个列的列名,String name = "Tom",String 和name是修饰Tom的元数据
ResultSetMetaData rsmd = res.getMetaData();
//通过rsmd来获取结果集中的列数
int col = rsmd.getColumnCount();
if(res.next()) {
Class clazz = new Class();
//处理一行数据中的每一个列
for(int i=0;i<col;i++) {
//获取每个列的属性值
Object value = res.getObject(i+1);
//获取每个列的列名
String colName = rsmd.getColumnName(i+1);
//给clazz对象的colName属性,赋值为value:通过反射
Field field = Class.class.getDeclaredField(colName);//先拿到属性名为colName的属性
field.setAccessible(true);//将属性设置为可访问
field.set(clazz, value);//修改该对象的该属性值为value
}
System.out.println("执行成功");
return clazz;
}
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {//finally块在return执行之后,return返回之前执行
JDBCUtils.closeResource(con, ps, res);
}
return null;
} public static void main(String []args) {
String sql = "select classId,cName from class where classId = ?";
String arg1 = "030100",arg2 = "";
Class clazz = queryForClass(sql,arg1);
System.out.println(clazz);
}
}
对单表查询的升级,解决了数据库表的列名和java类名不同的情况
package jdbc_practice.preparedstatement.crud; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData; import bean.Student;
import jdbc.utils.JDBCUtils;
import java.lang.reflect.Field; public class StudentForQuery {
public static Student queryForStudent(String sql,Object...args) {
Connection con = null;
PreparedStatement ps = null;
ResultSet res = null;
try {
con=JDBCUtils.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
}
//获得数据集和元数据集
res = ps.executeQuery();
ResultSetMetaData rsmd = res.getMetaData();
int col = rsmd.getColumnCount(); if(res.next()) {
Student stu = new Student();
for(int i=0;i<col;i++) {
Object value = res.getObject(i+1); //要获得的数据值
String colLabel = rsmd.getColumnLabel(i+1); //要获得的元数据名称 Field field = Student.class.getDeclaredField(colLabel);//这里要用Label以解决数据库表类名称和类属性名不同的情况
field.setAccessible(true);
field.set(stu,value);
} System.out.println("执行成功");
return stu;
} }
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, ps, res);
} return null;
} public static void main(String[]args) {
String sql = "select stuId as studentId,stuName as studentName from student where stuName = ?";
String arg = "李军";
Student stu = queryForStudent(sql,arg);
System.out.println(stu);
}
}
使用PreparedStatement实现对不同表的通用的返回一个对象的查询操作
以及使用ArrayList返回对不同表的通用的返回多个对象的查询操作
package jdbc_practice.preparedstatement.crud; import java.lang.reflect.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List; import bean.Student;
import jdbc.utils.JDBCUtils; public class PreparedStatementQueryTest {
//使用PreparedStatement实现对不同表的通用的返回一个对象的查询操作
//使用泛型机制,参数里先传入一个类的类型
public static <T> T getInstance(Class<T> clazz,String sql,Object...args) {
Connection con = null;
PreparedStatement ps = null;
ResultSet res = null;
try {
con=JDBCUtils.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
} //获得数据集和元数据集
res = ps.executeQuery();
ResultSetMetaData rsmd = res.getMetaData();
int col = rsmd.getColumnCount(); if(res.next()) {
T t = clazz.newInstance();
for(int i=0;i<col;i++) {
Object value = res.getObject(i+1); //要获得的数据值
String colLabel = rsmd.getColumnLabel(i+1); //要获得的元数据名称 //通过反射给t对象指定的colName属性赋值为value
Field field = clazz.getDeclaredField(colLabel);
field.setAccessible(true);
field.set(t,value);
} System.out.println("执行成功");
return t;
} }
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, ps, res);
} return null;
} //返回对不同表的通用的返回多个对象的查询操作
public static <T> ArrayList<T> getForList(Class<T> clazz,String sql,Object...args){
Connection con = null;
PreparedStatement ps = null;
ResultSet res = null;
try {
con=JDBCUtils.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
} //获得数据集和元数据集
res = ps.executeQuery();
ResultSetMetaData rsmd = res.getMetaData();
int col = rsmd.getColumnCount(); ArrayList<T> list = new ArrayList<T>();
while(res.next()) {
T t = clazz.newInstance();
for(int i=0;i<col;i++) {
Object value = res.getObject(i+1); //要获得的数据值
String colLabel = rsmd.getColumnLabel(i+1); //要获得的元数据名称 //通过反射给t对象指定的colName属性赋值为value
Field field = clazz.getDeclaredField(colLabel);
field.setAccessible(true);
field.set(t,value);
} list.add(t);
}
System.out.println("执行成功");
return list;
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, ps, res);
} return null;
} public static void main(String []args) {
String sql = "select stuName as studentName,stuId as studentId from student where stuId = ?";
String arg = "101"; Student stu = getInstance(Student.class,sql,arg);
System.out.println(stu); sql = "select stuId as studentId,stuName as studentName from student where stuId > ?";
arg = "0";
ArrayList<Student> list = getForList(Student.class, sql, arg);
list.forEach(System.out::println); }
}
jdbc的连接数据库,使用PreparedStatement实现增删改查等接口的更多相关文章
- jdbc 09: preparedStatement实现增删改查
jdbc连接mysql,利用preparedStatement实现增删改查 package com.examples.jdbc.o9_preparedStatement实现增删改; import ja ...
- Java数据库连接--JDBC基础知识(操作数据库:增删改查)
一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...
- JDBC【1】-- 入门之增删改查
目录 1.jdbc是什么 2.使用IDEA开发 2.1 创建数据库,数据表 2.2 使用IDEA创建项目 1.jdbc是什么 JDBC(Java DataBase Connectivity,java数 ...
- 用JDBC连接 数据库 进行简单的增删改查
JDBC为java的基础.用jdbc实现对数据库的增删改查的功能是程序员的基本要求.本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包. ...
- JDBC+Servlet+JSP的学生案例增删改查
数据库信息传输到页面实现. 先进行学生信息页面展示: 接口IStudentDao public interface IStudentDao { /** * 保存操作 * @param stu 学生对象 ...
- JDBC+Servlet+JSP实现基本的增删改查(简易通讯录)
前言: 最近学习JavaWeb的过程中,自己实践练手了几个小项目,目前已经上传到我的Github上https://github.com/Snailclimb/JavaWebProject.目前只上传了 ...
- Django 文件配置、pycharm及django连接数据库、表的增删改查 总结
静态文件配置 1.你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的 2.django如何给用户开设资源接口呢? ...
- 增删改查——Statement接口
1.增加数据表中的元组 package pers.datebase.zsgc; import java.sql.Connection; import java.sql.DriverManager; i ...
- 简单实现 nodejs koa2 mysql 增删改查 制作接口
1.首先 在电脑上安装 nodejs (此处略过) 2.全局安装 koa2 (这里使用的淘宝镜像cnpm,有兴趣的同学可以自行搜索下) cnpm install koa-generator -g 3. ...
随机推荐
- 图与例解读Async/Await
JavaScript ES7的async/await语法让异步promise操作起来更方便.如果你需要从多个数据库或者接口按顺序异步获取数据,你可能最终写出一坨纠缠不清的promise与回调.然而使用 ...
- 【HDOJ6579】Operation(线性基)
题意:给定一个数列a,给定两种操作: 1.询问[l,r]区间内最大的xor和 2.n++,a[n]赋值为x 要求强制在线 n,m<=5e5,a[i]<2^30 思路:同CF1100F 固定 ...
- VMware安装MAC OS
测试环境 安装环境:win10 .VMware Workstation Pro14 镜像:OS X 10.11.5(由于太大,就没有上传网盘,网上也有很多资源) 安装准备 安装前先把关于VMware的 ...
- 22 October in 614
Contest A. defile struct 自定义排序.按照题意抽象成模型模拟就可以了. 自定义排序核心代码: struct node { int x, id; } d[1000003]; bo ...
- vmware导出OVF文件失败
从VMware菜单栏选择导出到 .ovf. 显示导出失败 "Failed to open ..... .vmx". 尝试直接打开虚拟机,系统全部正常. 打开虚拟机所在目录,查找后缀 ...
- spark sql correlated scalar subqueries must be aggregated 错误解决
最近在客户中使用spark sql 做一些表报处理,但是在做数据关联时,老是遇到 “correlated scalar subqueries must be aggregated” 错误 举一个例子, ...
- VS中C语言scanf函数报错
在VS中创建C项目使用scanf方法时会如下报错 解决方案 方法1:文件中设置 在第一行设置代码 #define _CRT_SECURE_NO_WARNINGS 或者添加警告忽略 #pr ...
- Java学习之线程通信(多线程(Lock))--生产者消费者
SDK1.5版本以后对synchronized的升级,其思想是:将同步和锁封装成对象,其对象中包含操作锁的动作. 代码: //1.导入包 import java.util.concurrent.loc ...
- linux shell assemble PDF文件
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat asm.sh header_start=0 header_len=15 xref_start ...
- Redis项目实战,一些经验总结
来源:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类 ...