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

将连接数据库,关闭资源封装在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. php ucfirst()函数 语法

    php ucfirst()函数 语法 作用:字符串首字母大写 语法:ucfirst(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:把字符串中的首字符转换为大写.直线 ...

  2. webpack使用的补充

    1.分离生产环境和开发环境的wepack.config.js 我们可以将生产环境和开发环境中的配置分离为两个不同的文件,并且还维护一个共同的配置文件 common,可以通过 webpack.merge ...

  3. 【LeetCode 84】柱状图中最大的矩形

    题目链接 [题解] 维护一个单调递增的栈. 会发现栈内的第i个元素的前面一个(i-1)元素在原始的序列中的数字 都是要高于第i个元素的.(或者没有元素) 那么第i个元素往左最多可以扩展到第i-1个元素 ...

  4. S1.2 Python开发规范指南

    参考链接 Python风格规范 分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Pytho ...

  5. 用 Flask 来写个轻博客 (21) — 结合 reCAPTCHA 验证码实现用户注册与登录

    目录 目录 前文列表 扩展阅读 添加账户管理蓝图 新建控制器蓝图 新建表单 新建蓝图 main 的视图函数 新建模板 页面效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Fla ...

  6. 每天一个linux常用命令--ls 和 -ll 有什么区别?

    一.-ls 和 -ll  有什么区别? 1. ls 命令可以说是linux下最常用的命令之一.ll不是命令,是ls -l的别名相当于windows里的快捷方式.所以"ll"和“ls ...

  7. Appium移动端自动化:元素定位uiautomatorviewer

    一.启动uiautomatorviewer mac: 1.打开终端,进入Android/sdk/tools目录 2.打开uiautomatorviewer(我的路径是Android/sdk/tools ...

  8. QTP使用dictionary 对象

    1. 创建即使用Dictionary对象 ' 创建Dictionary对象Set Dic = CreateObject("Scripting.Dictionary")' 添加Dic ...

  9. js日历算法

    页面 <div class="un1"> <h2>服务档期</h2> <div class="date-panel" ...

  10. 彻底干掉恶心的 SQL 注入漏洞, 一网打尽!

    来源:b1ngz.github.io/java-sql-injection-note/ 简介 文章主要内容包括: , name); 还有一些情况,比如 order by.column name,不能使 ...