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

将连接数据库,关闭资源封装在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. Alex and Number

    Alex and Number 时间限制: 1 Sec  内存限制: 128 MB提交: 69  解决: 12[提交][状态] 题目描述 Alex love Number theory. Today ...

  2. [CSP-S模拟测试]:Miner(欧拉路)

    题目背景 $And\ the\ universe\ said\ you\ are\ the\ daylight \\ And\ the\ universe\ said\ you\ are\ the\ ...

  3. 前端每日实战:94# 视频演示如何用纯 CSS 创作一台拍立得照相机

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YjYgey 可交互视频 此视频是可 ...

  4. ArrayList和Map的一些知识

    2014年10月17日16:39:01 1.如何获取某条数据在ArrayList中的索引值? 多个对象存储的ArrayList中,如果只知道对象其中的一个属性,如何获取该对象在ArrayList里的索 ...

  5. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件

    背景:基于Angular 6,引入ngx-ueditor 发现现象:如果以Shift键+任意键结尾,则ngModel会丢失包含shift键的字符 例如:输入“ABC+AB++++”,则ngModel中 ...

  6. iOS开发环境搭建 及 编写1个hello world

    参照: https://www.cnblogs.com/ansersion/p/9084460.html 前置条件 : MAC一台 安装xcode,从appstore 下载 xcode,(6G多,考验 ...

  7. webbrowser 防止读取 缓存

    http://bbs.csdn.net/topics/240011502 引用 3 楼 kelei0017 的回复: Delphi(Pascal) codeprocedure TInformation ...

  8. Prometheus 安装与配置

    下载Prometheus https://prometheus.io/download/ wget https://github.com/prometheus/prometheus/releases/ ...

  9. upc组队赛16 GCDLCM 【Pollard_Rho大数质因数分解】

    GCDLCM 题目链接 题目描述 In FZU ACM team, BroterJ and Silchen are good friends, and they often play some int ...

  10. qt ui界面控件布局设计

    1.布局控件简介: 水平布局,里面的控件将水平展示,布局器里面的控件大小若没有固定,其大小将随着布局的大小而自动拉伸.可以通过设置其左(layoutLeftMargin).上(layoutTopMar ...