首先是连接,关闭资源等数据库操作

将连接数据库,关闭资源封装在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实现增删改查等接口的更多相关文章

  1. jdbc 09: preparedStatement实现增删改查

    jdbc连接mysql,利用preparedStatement实现增删改查 package com.examples.jdbc.o9_preparedStatement实现增删改; import ja ...

  2. Java数据库连接--JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

  3. JDBC【1】-- 入门之增删改查

    目录 1.jdbc是什么 2.使用IDEA开发 2.1 创建数据库,数据表 2.2 使用IDEA创建项目 1.jdbc是什么 JDBC(Java DataBase Connectivity,java数 ...

  4. 用JDBC连接 数据库 进行简单的增删改查

    JDBC为java的基础.用jdbc实现对数据库的增删改查的功能是程序员的基本要求.本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包. ...

  5. JDBC+Servlet+JSP的学生案例增删改查

    数据库信息传输到页面实现. 先进行学生信息页面展示: 接口IStudentDao public interface IStudentDao { /** * 保存操作 * @param stu 学生对象 ...

  6. JDBC+Servlet+JSP实现基本的增删改查(简易通讯录)

    前言: 最近学习JavaWeb的过程中,自己实践练手了几个小项目,目前已经上传到我的Github上https://github.com/Snailclimb/JavaWebProject.目前只上传了 ...

  7. Django 文件配置、pycharm及django连接数据库、表的增删改查 总结

    静态文件配置 1.你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的 2.django如何给用户开设资源接口呢? ...

  8. 增删改查——Statement接口

    1.增加数据表中的元组 package pers.datebase.zsgc; import java.sql.Connection; import java.sql.DriverManager; i ...

  9. 简单实现 nodejs koa2 mysql 增删改查 制作接口

    1.首先 在电脑上安装 nodejs (此处略过) 2.全局安装 koa2 (这里使用的淘宝镜像cnpm,有兴趣的同学可以自行搜索下) cnpm install koa-generator -g 3. ...

随机推荐

  1. 图与例解读Async/Await

    JavaScript ES7的async/await语法让异步promise操作起来更方便.如果你需要从多个数据库或者接口按顺序异步获取数据,你可能最终写出一坨纠缠不清的promise与回调.然而使用 ...

  2. 【HDOJ6579】Operation(线性基)

    题意:给定一个数列a,给定两种操作: 1.询问[l,r]区间内最大的xor和 2.n++,a[n]赋值为x 要求强制在线 n,m<=5e5,a[i]<2^30 思路:同CF1100F 固定 ...

  3. VMware安装MAC OS

    测试环境 安装环境:win10 .VMware Workstation Pro14 镜像:OS X 10.11.5(由于太大,就没有上传网盘,网上也有很多资源) 安装准备 安装前先把关于VMware的 ...

  4. 22 October in 614

    Contest A. defile struct 自定义排序.按照题意抽象成模型模拟就可以了. 自定义排序核心代码: struct node { int x, id; } d[1000003]; bo ...

  5. vmware导出OVF文件失败

    从VMware菜单栏选择导出到 .ovf. 显示导出失败 "Failed to open ..... .vmx". 尝试直接打开虚拟机,系统全部正常. 打开虚拟机所在目录,查找后缀 ...

  6. spark sql correlated scalar subqueries must be aggregated 错误解决

    最近在客户中使用spark sql 做一些表报处理,但是在做数据关联时,老是遇到 “correlated scalar subqueries must be aggregated” 错误 举一个例子, ...

  7. VS中C语言scanf函数报错

    在VS中创建C项目使用scanf方法时会如下报错 解决方案 方法1:文件中设置 在第一行设置代码    #define _CRT_SECURE_NO_WARNINGS 或者添加警告忽略     #pr ...

  8. Java学习之线程通信(多线程(Lock))--生产者消费者

    SDK1.5版本以后对synchronized的升级,其思想是:将同步和锁封装成对象,其对象中包含操作锁的动作. 代码: //1.导入包 import java.util.concurrent.loc ...

  9. linux shell assemble PDF文件

      daniel@daniel-mint ~/latex/linux/itext/daniel $ cat asm.sh header_start=0 header_len=15 xref_start ...

  10. Redis项目实战,一些经验总结

    来源:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类 ...