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. ...
随机推荐
- The mook jong
The mook jong Accepts: 506 Submissions: 1281 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- 第二章(1.3)Python基础知识(输入输出)
一.?输出 用print加上字符串,就可以向屏幕上输出指定的文字 print?'hello, world' print也可以打印整数. >>> print?300 二.?输入 Pyt ...
- Bootstrap Date Range Picker
var optionSet1 = { startDate: moment().subtract(29, 'days'), endDate: moment(), minDate: '12/21/2012 ...
- haskell目录层次
daniel@daniel-mint /usr/lib/ghc/haskell2010-1.1.1.0 $ tree . ├── Control │ └── Monad.hi ├── Data │ ...
- 数据库——MySQL乐观锁与悲观锁
乐观锁与悲观锁 一.悲观锁 悲观锁的特点是“先获取锁,再进行业务操作“”.即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作 读取某几行数据时会给他们加上锁,其他的要修改数 ...
- 树的直径(BFS)
][];];];];,,;vis[i]=; ; j <= n ; j++){ ){;//标记 res[j]=res[root]+; ; i <= n- ; i++){; data[b][a ...
- Python基础代码1
Python基础代码 import keyword#Python中关键字 print(keyword.kwlist) ['False', 'None', 'True', 'and', 'as', 'a ...
- tp5 之 "No input file specified
tp5 之 "No input file specified" 问题 通过"域名/模块/控制器/方法"这样的方式访问的时候,浏览器输出如下: 直接通过" ...
- Python面向对象初始(三大特征,多态,继承,封装)
Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...
- Java中 Map用法
public static Map GetGoodTypes() { Map goodTypes=new HashMap(); goodTypes.put(1,"原材料"); go ...