JAVAswing界面实现数据库增删改查(精)
- 格式:doc
- 大小:67.50 KB
- 文档页数:14
Java项目中实现增删改查的基本流程1. 确定需求和设计数据库在开始实现增删改查功能之前,首先需要明确项目的需求,并设计相应的数据库结构。
数据库可以使用关系型数据库如MySQL、Oracle,或者非关系型数据库如MongoDB、Redis等。
2. 创建数据模型根据需求和数据库设计,创建相应的Java数据模型。
数据模型可以使用Java类来表示,类中的属性对应数据库表的字段。
public class User {private Long id;private String name;private int age;// ...// getter and setter methods}3. 创建数据库连接在Java项目中使用数据库之前,需要先创建数据库连接。
可以使用JDBC来连接关系型数据库,或者使用相应的驱动来连接非关系型数据库。
public class DatabaseUtil {private static final String URL = "jdbc:mysql://localhost:3306/mydb";private static final String USERNAME = "root";private static final String PASSWORD = "password";public static Connection getConnection() {try {return DriverManager.getConnection(URL, USERNAME, PASSWORD);} catch (SQLException e) {e.printStackTrace();}return null;}}4. 实现增加数据功能增加数据功能是向数据库中插入新的数据记录。
可以通过执行SQL插入语句来实现。
public class UserDao {public void addUser(User user) {String sql = "INSERT INTO user (name, age) VALUES (?, ?)";try (Connection conn = DatabaseUtil.getConnection();PreparedStatement stmt = conn.prepareStatement(sql)) {stmt.setString(1, user.getName());stmt.setInt(2, user.getAge());stmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}}5. 实现删除数据功能删除数据功能是从数据库中删除指定的数据记录。
⽤Java语⾔来进⾏数据库的创建以及增删改查1.⾸先是创建⼀个继承sqliteopenhelper类来创建数据库或者更新数据库,创建数据库在onCreate(SQLiteDatabase db)⽅法中,更新数据库在onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)⽅法中。
1package com.bwf.a10_sql_02.db;23import android.content.Context;4import android.database.sqlite.SQLiteDatabase;5import android.database.sqlite.SQLiteDatabase.CursorFactory;6import android.database.sqlite.SQLiteOpenHelper;78/**9 * 此助⼿类主要帮助我们完成数据库的创建、表格的创建、及数据库升级的功能10 * */11public class DBHelper extends SQLiteOpenHelper{12/**13 * 构造⽅法:14 * @param Context context 上下⽂对象15 * @param String name 指定数据库名16 * @param CursorFactory factory 游标⼯⼚,如果使⽤默认Cursor取数据,传null即可17 * @param int version 数据库版本号18 * */19public DBHelper(Context context, String name, CursorFactory factory,20int version) {21super(context, name, factory, version);22 }2324/**25 * 数据库第⼀次创建时会调⽤,⼀般在其中创建数据库表26 * @param SQLiteDatabase db 数据库操作对象,封装了Sqlite中常⽤的增删改查等⽅法27 * */28 @Override29public void onCreate(SQLiteDatabase db) {30// 定义⼀个创建表格的SQL语句31 String sql = "CREATE TABLE stu(_id INTEGER PRIMARY KEY AUTOINCREMENT," +32 "name VARCHAR(5), age INTEGER)";33// 执⾏上述SQL语句来创建表格34 db.execSQL(sql);35 }3637/**38 * 数据库升级时⽤到,常在⾥边完成数据库表格的修改或者增加39 * 在创建SQLiteOpenHelper时,会传⼊该数据库的版本,40 * 如果传⼊的数据库版本号⽐数据库⽂件中存储的版本号⼤的话,41 * 则系统会⾃动调⽤该⽅法来完成数据库升级42 *43 * @param SQLiteDatabase db 数据库操作类对象44 * @param int oldVersion ⽼的数据库版本号45 * @param int newVersion 新的数据库版本号46 * */47 @Override48public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {49// TODO Auto-generated method stub5051 }5253 }2. 创建⼀个类来进⾏数据库建表和数据的增删改查package com.bwf.a10_sql_02.db;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;/*** 使⽤该类来封装增删改查等数据库操作的⽅法,⽅便使⽤* @author fanhy* @since 2015-09-22* @version 1.0.0* */public class DBOPeration {SQLiteDatabase sd;public DBOPeration(Context context) {super();// 得到DBHelper对象,通过它去打开数据库DBHelper dbHelper = new DBHelper(context, "Stu.db", null, 1);// 初始化SQLiteDatabase/*** 两种⽅式打开数据库:* 内存充裕时,两种⽅式打开数据库的效果是⼀样的,都是可以读写的* 当内存较低没有可写空间时:* getReadableDatabase:以可读形式打开* getWritableDatabase:以可写⽅式打开失败并抛出异常* */sd = dbHelper.getReadableDatabase();//sd = dbHelper.getWritableDatabase();}/*** 插⼊⼀条数据* @param String name 学⽣姓名* @param int age 学⽣年龄** */public void insert(String name, int age){// ⾸先定义出要执⾏的数据库语句//String insertStr = "INSERT INTO stu (name, age) values ("+name+","+age+")";// 执⾏该SQL语句//sd.execSQL(insertStr);// 内部通过⼀个HashMap来实现的ContentValues values = new ContentValues();values.put("name", name);values.put("age", age);/*** @param String table 表名* @param String nullColumnHack 缺省(ContentValues)指定哪⼀列值为NULL* @param ContentValues values 要插⼊的数据封装到该容器中* */sd.insert("stu", "name", values);}/*** 删除所有数据* */public void deleteAll(){// 定义数据库语句//String deleteAllStr = "delete from stu";//sd.execSQL(deleteAllStr);/*** @param String table 表名* @param String whereClause 删除的条件,传null代表全部删除* @param String[] whereArgs 当删除条件都有不确定值时,在该参数中使⽤变量代替,不需要则传null * */sd.delete("stu", null, null);}/*** 根据年龄范围来删除* */public void deleteByAgeRange(int from, int to){/*** @param String table 表名* @param String whereClause 删除的条件,传null代表全部删除* @param String[] whereArgs 当删除条件都有不确定值时,在该参数中使⽤变量代替,不需要则传null * */String whereClause = "age > ? and age < ?";String[] whereArgs = new String[]{from + "", to + ""};sd.delete("stu", whereClause, whereArgs);}/*** 修改指定名字同学的年龄* @param String nameCondition 更新条件* @param int newAge 更新后的年龄* */public void updateData(String nameCondition, int newAge){//String sqlUpdate = "update stu set age = "+age+" where name = '" + nameCondition +"'";//sd.execSQL(sqlUpdate);/*** @param String table 表名* @param ContentValues values 要更新的数据封装到该容器中* @param String whereClause 更新的条件,如果填null则表⽰⽆条件修改,即修改全部内容* @param String[] whereArgs 更新条件中含未知内容?部分使⽤该参数来填充,不需要则填null* */ContentValues values = new ContentValues();values.put("name", nameCondition);values.put("age", newAge);String whereClause = "name = ?";String[] whereArgs = {nameCondition};sd.update("stu", values, whereClause, whereArgs);}/*** 查询所有数据* */public Cursor searchAll(){Cursor cursor;//String sqlSelect = "select * from stu";//cursor = sd.rawQuery(sqlSelect, null);/*** @param String table 表名* @param String[] columns 要返回的字段(列),如果需要返回所有字段,则传null即可* @param String selection 查询的条件,有不确定的部分⽤?占位,如果要查询全部则传null即可* @param String[] selectionArgs 查询中⽤?占位的部分,使⽤此参数进⾏填充,不需要则传null即可* @param String groupBy 分组条件,按照某字段或某⼏个字段进⾏分组,不需要则传null即可* @param String having 配合分组使⽤可以带条件,不需要则传null* @param String orderBy 排序条件,可以按照某个或某些字段分别做升序或者降序排列,不需要则传null * */cursor = sd.query("stu", null, null, null, null, null, null);return cursor;}/*** 按照年龄范围查询,结果按年龄升序排列* */public Cursor searchByAgeRange(int from, int to){Cursor cursor;/*** @param String table 表名* @param String[] columns 要返回的字段(列),如果需要返回所有字段,则传null即可* @param String selection 查询的条件,有不确定的部分⽤?占位,如果要查询全部则传null即可* @param String[] selectionArgs 查询中⽤?占位的部分,使⽤此参数进⾏填充,不需要则传null即可* @param String groupBy 分组条件,按照某字段或某⼏个字段进⾏分组,不需要则传null即可* @param String having 配合分组使⽤可以带条件,不需要则传null* @param String orderBy 排序条件,可以按照某个或某些字段分别做升序或者降序排列,不需要则传null * */String selection = "age > ? and age < ?";String[] selectionArgs = {from + "", to + ""};String orderBy = "age asc";cursor = sd.query("stu", null, selection, selectionArgs, null, null, orderBy);return cursor;}/*** 根据关键字进⾏模糊查询,结果按年龄降序排列* @param String key 查询的关键字* */public Cursor searchByKey(String key){Cursor cursor;/*** @param String table 表名* @param String[] columns 要返回的字段(列),如果需要返回所有字段,则传null即可* @param String selection 查询的条件,有不确定的部分⽤?占位,如果要查询全部则传null即可* @param String[] selectionArgs 查询中⽤?占位的部分,使⽤此参数进⾏填充,不需要则传null即可* @param String groupBy 分组条件,按照某字段或某⼏个字段进⾏分组,不需要则传null即可* @param String having 配合分组使⽤可以带条件,不需要则传null* @param String orderBy 排序条件,可以按照某个或某些字段分别做升序或者降序排列,不需要则传null * */String selection = "name like '%" + key +"%'";String orderBy = "age desc";cursor = sd.query("stu", null, selection, null, null, null, orderBy);return cursor;}}。
通过Java代码实现对数据库的数据进⾏操作:增删改查(JDBC)在写代码之前,依然是引⽤mysql数据库的jar包⽂件:右键项⽬—构建路径—设置构建路径—库—添加外部JAR在数据库中我们已经建⽴好⼀个表xs ;分别有xuehao xingming xuexiao 三个列然后我们开始码代码调⽤,进⾏增删改查⾸先是增加import java.sql.*;public class XueYuan {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");//加载驱动String jdbc="jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=GBK";Connection conn=DriverManager.getConnection(jdbc, "root", "");//链接到数据库Statement state=conn.createStatement(); //容器String sql="insert into xs values('1108','张伟','汉企')"; //SQL语句state.executeUpdate(sql); //将sql语句上传⾄数据库执⾏conn.close();//关闭通道}执⾏后,数据中多了⼀⾏数据删除数据import java.sql.*;public class XueYuan {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");//加载驱动String jdbc="jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=GBK";Connection conn=DriverManager.getConnection(jdbc, "root", "");//链接到数据库Statement state=conn.createStatement(); //容器String sql="delete from xs where xuehao='1108'"; //SQL语句state.executeUpdate(sql); //将sql语句上传⾄数据库执⾏conn.close();//关闭通道}}执⾏后,数据库中xuehao为“1108”的数据的整⾏被删掉修改数据import java.sql.*;public class XueYuan {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");//加载驱动String jdbc="jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=GBK";Connection conn=DriverManager.getConnection(jdbc, "root", "");//链接到数据库Statement state=conn.createStatement(); //容器String sql="update xs set xuexiao='淄博汉企' where xuehao='1101' "; //SQL语句state.executeUpdate(sql); //将sql语句上传⾄数据库执⾏conn.close();//关闭通道}}数据库中的1101对应的xuexiao发⽣了改变⼩结:数据的增删改⼏乎是⼀样的唯⼀不同的是SQL语句不同⽽已查询数据查询数据和增删改不同的地⽅是,我们需要获取,⽽正常获取时,我们获取到的是⼀个字符集import java.sql.*;import javax.xml.stream.events.StartElement;public class Test3 {public static void main(String[] args) throws Exception {//导⼊驱动包Class.forName("com.mysql.jdbc.Driver");//链接⾄数据库String jdbc="jdbc:mysql://127.0.0.1:3306/mydb";Connection conn=DriverManager.getConnection(jdbc, "root", "");Statement state=conn.createStatement();//容器String sql="select * from xs"; //sql语句ResultSet rs=state.executeQuery(sql); //将sql语句传⾄数据库,返回的值为⼀个字符集⽤⼀个变量接收while(rs.next()){ //next()获取⾥⾯的内容System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));//getString(n)获取第n列的内容//数据库中的列数是从1开始的}conn.close();}获取的结果例⼦:输⼊账号和密码,在数据库中获取,如果有该信息,则显⽰其登陆成功,如果没有,则显⽰输⼊错误有两种⽅法可以实现:import java.sql.*;import java.util.*;public class Login {public static void main(String[] args) throws Exception {// 输⼊⽤户名和密码Scanner sc=new Scanner(System.in);System.out.println("请输⼊账号");String zh=sc.nextLine();System.out.println("请输⼊密码");String mm=sc.nextLine();// zh=zh.replaceAll("\'", "\""); //替换// mm=mm.replaceAll("\'", "\""); //替换//到数据库验证⽤户名和密码是否正确Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "");Statement state=conn.createStatement();String sql="select * from yonghu where zhanghao='"+zh+"' and mima='"+mm+"'";ResultSet re=state.executeQuery(sql);//输出:正确显⽰欢迎,不正确显⽰错误if(re.next()){System.out.println("登陆成功!"+re.getString(3)+" 欢迎你");}else{System.out.println("输⼊账号或密码错误");}conn.close();}}实现了该功能但是如果我们输⼊同样会显⽰登陆成功(sql注⼊攻击),为避免出现这种情况我们加⼊两个替换zh=zh.replaceAll("\'", "\"") 将输⼊的所有单引号全部换成双引号,就可以避免这样的漏洞;但是这种⽅法治标不治本,根本原因是字符串的拼接的原因从根本上解决问题还有⼀种写法在SQL语句中,不确定的条件⽤?代替,PreparedStatement(sql)容器来装 setString( n ,m)来赋值n是第⼏个问号的位置,m是赋import java.sql.*;import java.util.*;public class Login {public static void main(String[] args) throws Exception{//输⼊⽤户名和密码Scanner sc=new Scanner(System.in);System.out.println("请输⼊账号");String zh=sc.nextLine();System.out.println("请输⼊密码");String mm=sc.nextLine();Class.forName("com.mysql.jdbc.Driver");String jdbc="jdbc:mysql://127.0.0.1:3306/mydb";Connection conn=DriverManager.getConnection(jdbc, "root", "");String sql="select * from yonghu where zhanghao=? and mima=?"; //sql语句PreparedStatement state=conn.prepareStatement(sql); //容器state.setString(1, zh); //将第n个值替换成某个值state.setString(2, mm);ResultSet re=state.executeQuery(); //上传数据库返回结果集if(re.next()){ //如果取到了值,那么输出System.out.println("登陆成功"+re.getString(3)+",欢迎你");}else{System.out.println("登陆失败,账号或密码输⼊错误");}}。
JAVA 数据库基本操作, 增删改查package mypack; JAVA 数据库基本操作, 增删改查import java.sql.Connection;import java.sql.ResultSet;import java.util.ArrayList;public class DbOper {//查询多行记录public ArrayList select({Connection conn =null;ResultSet rs =null;try {import java.sql.PreparedStatement; import java.sql.SQLException; PreparedStatement pstmt =null; ArrayList al =new ArrayList(;conn =DbConn.getConn(;pstmt =conn.prepareStatement(“select *from titles ”; rs =pstmt.executeQuery(;while (rs.next({Titles t =newTitles(;t.setTitleid(rs.getString(1;t.setTitle(rs.getString(2;al.add(t;}}catch (SQLExceptione {e.printStackTrace(;}finally {try {//TODO 自动生成catch 块if (rs!=null rs.close(;if (pstmt!=nullpstmt.close(;if (conn!=nullconn.close(;}catch (SQLExceptione {e.printStackTrace(;}}//TODO 自动生成catch 块return al; }//查询单个对象public Titles selectOne(Stringtitleid{Connection conn =null;ResultSet rs =null;try {PreparedStatement pstmt =null; Titles t =new Titles(;conn =DbConn.getConn(;pstmt.setString(1,titleid;while (rs.next({pstmt =conn.pre pareStatement(“select *from titles where title_id=?”; rs =pstmt.executeQuery(;t.setTitleid(rs.getString(1;t.setTitle(rs.getString(2;}}catch (SQLExceptione {e.printStackTrace(;}finally {try {//TODO 自动生成catch 块if (rs!=null rs.close(;if (pstmt!=nullpstmt.close(;if (conn!=nullconn.close(;}catch (SQLExceptione {e.printStackTrace(;}}}//TODO 自动生成catch 块return t;//增加记录public boolean insert(Titlest{Connection conn =null;boolean b =false; try {PreparedStatement pstmt=null;conn=DbConn.getConn(;pstmt =conn.prep areStatement(“insert into titles(title_id,titlevalues (?,?”; pstmt.setString(1,t.getTitleid(;pstmt.setString(2,t.getTitle(;int n =pstmt.executeUpdate(;if(n==1b=true;}catch (SQLExceptione {e.printStackTrace(;}finally{try {//TODO 自动生成catch 块if(pstmt!=nullpstmt.close(;if(conn!=nullconn.close(;}catch (SQLExceptione {e.printStackTrace(;}}}//TODO 自动生成catch 块return b;//删除记录public boolean delete(Stringtitleid{Connection conn =null;boolean b =false; try {PreparedStatement pstmt=null;conn =DbConn.getConn(;pstmt.setString(1,titleid;if(n==1b=true;pstmt =conn.prepareStatement(“delete from titles where title_id=?”; int n =pstmt.executeUpdate(;}catch (SQLExceptione {e.printStackTrace(;}finally{try {//TODO 自动生成catch 块if(pstmt!=nullpstmt.close(;if(conn!=nullconn.close(;}catch (SQLExceptione {e.printStackTrace(;}}//TODO 自动生成catch 块return b;}//修改表public boolean update(Titlest{Connection conn =null;boolean b PreparedStatement pstmt=null;try {=false;conn =DbConn.getConn(;pstmt =conn.prepareStatement(“update titles settitle=?where title_id=?”; pstmt.setString(1,t.getTitle(;pstmt.setString(2,t.getTitleid(;int n =pstmt.executeUpdate(;if(n==1b=true;}catch (SQLExceptione {e.printStackTrace(;}finally{try {//TODO 自动生成catch 块if(pstmt!=nullpstmt.close(;if(conn!=nullconn.close(;}catch (SQLExceptione {e.printStackTrace(;}}}}//TODO 自动生成catch 块return b;。
JAVA数据库基本操作增删改查增:一、使用JDBCAPI操作数据库1、创建jdbc对象:为了访问数据库需要创建一个jdbc对象,使用DriverManager类的static方法getConnection(创建jdbc对象。
2、获取Statement对象:通过jdbc.createStatement(方法创建一个Statement对象,使用executeUpdate(方法执行SQL语句。
3、执行sql语句:使用前面创建的Statement对象执行SQL语句,例如,执行INSERT语句则需要使用executeUpdate(方法将要插入的数据插入数据库。
4、关闭jdbc对象:通过jdbc对象的close(方法关闭jdbc对象,以便释放资源,并将数据插入数据库。
二、使用Hibernate框架操作数据库1、创建SessionFactory对象:Hibernate框架使用SessionFactory类来管理数据库的连接,并从数据库中加载实体,进行数据的操作。
SessionFactory对象维护一个连接池,利用它可以创建多个Session对象。
2、创建Session对象:Hibernate框架使用Session类来管理数据,使用SessionFactory对象的openSession(方法可以创建Session对象,并从连接池中获取需要的连接。
3、获取Transaction对象:Session类的beginTransaction(方法可以创建Transaction对象,用于控制数据库的事务。
4、执行SQL语句:使用Session对象的save(方法执行SQL语句,向数据库中插入数据。
6、关闭session:使用Session对象的close(方法关闭session,释放资源。
删:一、使用JDBCAPI操作数据库。
java项目中实现增删改查基本流程Java项目中实现增删改查基本流程引言本文将详细讨论在Java项目中实现增删改查的基本流程。
通过该流程,我们可以在项目中对数据进行操作,包括创建、读取、更新和删除。
步骤一:创建在创建数据之前,首先需要创建数据库和相应的表。
接下来,我们可以通过以下步骤创建具体的数据:1.创建模型类:创建一个Java类来表示数据模型,包含需要的属性和方法。
2.设计数据库表结构:根据模型类的属性,设计数据库表结构,确定每个属性对应的字段。
3.编写DAO(数据访问对象)类:该类用于实现对数据库的访问操作,包括插入数据到数据库中。
4.实例化模型类:在业务逻辑层中,实例化模型类,并设置相应的属性值。
5.调用DAO类的插入方法:在业务逻辑层中,调用DAO类的插入方法,将数据插入到数据库中。
步骤二:读取读取数据是对数据库进行查询操作,获取需要的数据。
下面是读取数据的基本流程:1.编写DAO类的查询方法:在DAO类中编写查询方法,根据需要的条件和属性查询数据。
2.调用DAO类的查询方法:在业务逻辑层中,调用DAO类的查询方法,获取查询结果。
3.处理查询结果:根据返回的结果集,进行数据的处理和展示。
步骤三:更新更新数据是对数据库中已有数据的修改操作。
下面是更新数据的基本流程:1.编写DAO类的更新方法:在DAO类中编写更新方法,根据需要的条件和属性更新数据。
2.实例化模型类并设置属性值:在业务逻辑层中,实例化模型类,并设置需要更新的属性值。
3.调用DAO类的更新方法:在业务逻辑层中,调用DAO类的更新方法,更新数据。
步骤四:删除删除数据是在数据库中删除指定的数据记录。
下面是删除数据的基本流程:1.编写DAO类的删除方法:在DAO类中编写删除方法,根据需要的条件删除数据。
2.调用DAO类的删除方法:在业务逻辑层中,调用DAO类的删除方法,删除数据。
结论在一个Java项目中,实现增删改查的基本流程是创建、读取、更新和删除。
java连接数据库增、删、改、查工具类java连接数据库增、删、改、查工具类这篇文章主要介绍了java连接数据库增、删、改、查工具类,需要的朋友可以参考下java连接数据库增、删、改、查工具类数据库操作工具类,因为各厂家数据库的分页条件不同,目前支持Mysql、Oracle、Postgresql的分页查询在Postgresql环境测试过了,其他数据库未测试。
sql语句需要使用预编译形式的复制代码代码如下:packagedb;ng.annotation.ElementType; ng.annotation.Retention; ng.annotation.RetentionPolicy; ng.annotation.Target; ng.reflect.Field; importjava.sql.Connection; importjava.sql.Date;importjava.sql.Driver;importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement; importjava.sql.Time;importjava.sql.Timestamp; importjava.util.ArrayList; importjava.util.List;importjava.util.regex.Matcher; importjava.util.regex.Pattern;importjavax.naming.NamingException; importjavax.sql.DataSource;/数据库查询工具类使用预编译的sql@authorXueLiang/publicclassDBUtil{privatestaticStringdriver;privatestaticDataSourceds=null;privatestaticStringurl="jdbc:postgresql://192.168.56.101/db ";privatestaticStringuser="test";privatestaticStringpassword="12345678";static{try{Class.forName("org.postgresql.Driver");//ds=(DataSource)SpringContextUtil.getBean("dataSource"); }catch(Exceptione){e.printStackTrace();}}/建立连接@returnconConnection@throwsException/privatestaticConnectiongetConnection()throwsException{ Connectionconn=DriverManager.getConnection(url,user,password);//Connectionconn=ds.getConnection();Driverd=DriverManager.getDriver(conn.getMetaData().getU RL());driver=d.getClass().getName();returnconn;}/关闭连接@paramconn@paramstmt@parampreStmt@paramrs@throwsSQLException/privatestaticvoidreplease(Connectionconn,Statementstmt,R esultSetrs)throwsSQLException{if(rs!=null){rs.close();rs=null;}if(stmt!=null){stmt.close();stmt=null;}if(conn!=null){conn.close();conn=null;}/利用正则表达式,获得SELECTSQL中的列名@paramsql@return/ privatestaticListgetColumnsFromSelect(Stringsql){ ListcolNames=newArrayList();//取出sql中列名部分Patternp=pile("(?i)select\\s(.?)\\sfrom."); Matcherm=p.matcher(sql.trim());String[]tempA=null;if(m.matches()){tempA=m.group(1).split(",");}if(tempA==null){returnnull;}Stringp1="(\\w+)";Stringp2="(?:\\w+\\s(\\w+))";Stringp3="(?:\\w+\\sas\\s(\\w+))";Stringp4="(?:\\w+\\.(\\w+))";Stringp5="(?:\\w+\\.\\w+\\s(\\w+))";Stringp6="(?:\\w+\\.\\w+\\sas\\s(\\w+))";Stringp7="(?:.+\\s(\\w+))";Stringp8="(?:.+\\sas\\s(\\w+))";p=pile("(?:"+p1+"||"+p2+"||"+p3+"||"+p4 +"||"+p5+"||"+p6+"||"+p7+"||"+p8+")");for(Stringtemp:tempA){m=p.matcher(temp.trim());if(!m.matches()){continue;}for(inti=1;i<=m.groupCount();i++){if(m.group(i)==null||"".equals(m.group(i))){ continue;}colNames.add(m.group(i));}}returncolNames;}利用正则表达式,获得INSERTSQL中的列名@paramsql@return/privatestaticListgetColumnsFromInsert(Stringsql){ListcolNames=newArrayList();//取出sql中列名部分Patternp=pile("(?i)insert\\s+into.\\((.)\\)\\s+valu es.");Matcherm=p.matcher(sql.trim());String[]tempA=null;if(m.matches()){tempA=m.group(1).split(",");}if(tempA==null){returnnull;}Stringp1="(\\w+)";Stringp2="(?:\\w+\\s(\\w+))";Stringp3="(?:\\w+\\sas\\s(\\w+))";Stringp4="(?:\\w+\\.(\\w+))";Stringp5="(?:\\w+\\.\\w+\\s(\\w+))";Stringp6="(?:\\w+\\.\\w+\\sas\\s(\\w+))";Stringp7="(?:.+\\s(\\w+))";Stringp8="(?:.+\\sas\\s(\\w+))";p=pile("(?:"+p1+"||"+p2+"||"+p3+"||"+p4 +"||"+p5+"||"+p6+"||"+p7+"||"+p8+")");for(Stringtemp:tempA){m=p.matcher(temp.trim());if(!m.matches()){continue;}for(inti=1;i<=m.groupCount();i++){if(m.group(i)==null||"".equals(m.group(i))){continue;}colNames.add(m.group(i));}}returncolNames;}/利用正则表达式,获得UPDATESQL中的列名,包括WHERE字句的@paramsql@return/privatestaticListgetColumnsFromUpdate(Stringsql){ListcolNames=newArrayList();//取出sql中列名部分Patternp=pile("(?i)update(?:.)set(.)(?:from.)where (.(and).)");Matcherm=p.matcher(sql.trim());String[]tempA=null;if(m.matches()){tempA=m.group(1).split(",");if(m.groupCount()>1){String[]tmp=m.group(2).split("and");String[]fina=newString[tempA.length+tmp.length]; System.arraycopy(tempA,0,fina,0,tempA.length); System.arraycopy(tmp,0,fina,tempA.length,tmp.length); tempA=fina;}}if(tempA==null){returnnull;}Stringp1="(?i)(\\w+)(?:\\s\\=\\s.)";Stringp2="(?i)(?:\\w+\\.)(\\w+)(?:\\s\\=\\s.)";p=pile(p1+"||"+p2);for(Stringtemp:tempA){m=p.matcher(temp.trim());if(!m.matches()){continue;}for(inti=1;i<=m.groupCount();i++){if(m.group(i)==null||"".equals(m.group(i))){ continue;}colNames.add(m.group(i));}}returncolNames;}/为sql添加统计代码@return/privatestaticStringaddCountSQL(Stringsql){ StringBuffersb=newStringBuffer();sb.append("selectcount()asdataCountfrom("); sb.append(sql);sb.append(")asa");returnsb.toString();}/为sql添加分页代码@paramstart@paramlimit@return/privatestaticStringaddPagingSQL(Stringsql,intstart,intlimit){ StringBuffersb=newStringBuffer();if("com.microsoft.jdbc.sqlserver.SQLServerDviver".equals(dri ver)){//SQLServer0.72000}elseif("com.microsoft.sqlserver.jdbc.SQLServerDriver".equal s(driver)){//SQLServer20052008}elseif("com.mysql.jdbc.Driver".equals(driver)){//MySQLsb.append(sql);sb.append("LIMIT");sb.append(start);sb.append(",");sb.append(limit);}elseif(".driver.OracleDriver".eq uals(driver)){//Oracle8/8i/9i/10g数据库(thin模式)Listlist=getColumnsFromSelect(sql);sb.append("select");for(Stringstr:list)sb.append(str).append(",");sb.deleteCharAt(stIndexOf(","));sb.append("from(").append(sql).append(")asa");sb.append("whererownumbetween").append(start==0?1:sta rt).append("and").append(limit);}elseif("com.ibm.db2.jdbc.app.DB2Driver".equals(driver)){// DB2}elseif("com.sybase.jdbc.SybDriver".equals(driver)){//Sybase}elseif("rmix.jdbc.IfxDriver".equals(driver)){//Informi x}elseif("org.postgresql.Driver".equals(driver)){//PostgreSQL sb.append(sql);sb.append("LIMIT");sb.append(limit);sb.append("OFFSET");sb.append(start);}returnsb.toString();}/将RusultSet对象实例化T对象@param@paramt@paramrs@paramsql@returnt@throwsException/privatestaticTinstance(Classt,ResultSetrs,Stringsql)throwsExc eption{Listcolumns=getColumnsFromSelect(sql);Tobj=t.newInstance();for(Stringcol:columns){try{Fieldf=t.getDeclaredField(col);f.setAccessible(true);Objectv=getValue(col,f.getType().getName(),rs);f.set(obj,v);}catch(NoSuchFieldExceptione){Field[]fields=t.getDeclaredFields();for(Fieldf:fields){Columncolumn=f.getAnnotation(Column.class); if(column!=null&&().equals(col)){ f.setAccessible(true);Objectv=getValue(col,f.getType().getName(),rs);f.set(obj,v);}}}}returnobj;}privatestaticObjectgetValue(StringcolumnName,Stringtype, ResultSetrs)throwsSQLException{Objectobj=null;//System.out.println("name="+f.getName()+",type="+f.getT ype().getName());if("ng.Integer".equals(type)||"int".equals(type)){obj=rs.getInt(columnName);}elseif("ng.Long".equals(type)||"long".equals(type)){obj=rs.getLong(columnName);}elseif("ng.Short".equals(type)||"short".equals(type)){obj=rs.getShort(columnName);}elseif("ng.Float".equals(type)||"float".equals(type)){obj=rs.getFloat(columnName);}elseif("ng.Double".equals(type)||"double".equals(type )){obj=rs.getDouble(columnName);}elseif("ng.Byte".equals(type)||"byte".equals(type)){obj=rs.getByte(columnName);}elseif("ng.Boolean".equals(type)||"boolean".equals(ty pe)){obj=rs.getBoolean(columnName);}elseif("ng.String".equals(type)){obj=rs.getString(columnName);}else{obj=rs.getObject(columnName);}//System.out.println("name="+f.getName()+",type="+f.getT ype().getName()+",value="+(obj==null?"NULL":obj.getClass())+ ",{"+columnName+":"+obj+"}");returnobj;}/将param中的参数添加到pstate@parampstate@paramcolumns@throwsSQLException/privatestaticvoidsetParameters(PreparedStatementpstate,O bject...params)throwsException{if(params!=null&¶ms.length>0){for(inti=0;iObjectvalue=params[i];intj=i+1;if(value==null)pstate.setString(j,"");if(valueinstanceofString)pstate.setString(j,(String)value); elseif(valueinstanceofBoolean) pstate.setBoolean(j,(Boolean)value); elseif(valueinstanceofDate) pstate.setDate(j,(Date)value); elseif(valueinstanceofDouble) pstate.setDouble(j,(Double)value); elseif(valueinstanceofFloat) pstate.setFloat(j,(Float)value); elseif(valueinstanceofInteger) pstate.setInt(j,(Integer)value); elseif(valueinstanceofLong) pstate.setLong(j,(Long)value); elseif(valueinstanceofShort)pstate.setShort(j,(Short)value);elseif(valueinstanceofTime)pstate.setTime(j,(Time)value);elseif(valueinstanceofTimestamp) pstate.setTimestamp(j,(Timestamp)value); elsepstate.setObject(j,value);}}}/将param中的参数添加到pstate@parampstate@paramcolumns@paramt@throwsSQLException/setParameters(Prepare dStatementpstate,Listcolumns,Tt)throwsException{if(columns!=null&&columns.size()>0){for(inti=0;iStringattr=columns.get(i);Objectvalue=null;Class>c=t.getClass();try{Fieldf=c.getDeclaredField(attr);value=f.get(t);}catch(NoSuchFieldExceptione){Field[]fields=c.getDeclaredFields();for(Fieldf:fields){Columncolumn=f.getAnnotation(Column.class); if(column!=null&&().equals(attr)) value=f.get(t);}}intj=i+1;if(value==null)pstate.setString(j,"");if(valueinstanceofString)pstate.setString(j,(String)value);elseif(valueinstanceofBoolean)pstate.setBoolean(j,(Boolean)value);elseif(valueinstanceofDate)pstate.setDate(j,(Date)value);elseif(valueinstanceofDouble)pstate.setDouble(j,(Double)value);elseif(valueinstanceofFloat)pstate.setFloat(j,(Float)value);elseif(valueinstanceofInteger)pstate.setInt(j,(Integer)value);elseif(valueinstanceofLong)pstate.setLong(j,(Long)value);elseif(valueinstanceofShort)pstate.setShort(j,(Short)value);elseif(valueinstanceofTime)pstate.setTime(j,(Time)value);elseif(valueinstanceofTimestamp) pstate.setTimestamp(j,(Timestamp)value); elsepstate.setObject(j,value);}}}/执行insert操作@paramsql预编译的sql语句@paramtsql中的参数@return执行行数@throwsException/publicstaticintinsert(Stringsql,Tt)throwsException{Connectionconn=null; PreparedStatementpstate=null; intupdateCount=0;try{conn=getConnection();Listcolumns=getColumnsFromInsert(sql); pstate=conn.prepareStatement(sql); setParameters(pstate,columns,t); updateCount=pstate.executeUpdate(); }finally{replease(conn,pstate,null);}returnupdateCount;}/执行insert操作@paramsql预编译的sql语句@paramparam参数@return执行行数@throwsException/publicstaticintinsert(Stringsql,Object...param)throwsExceptio n{Connectionconn=null;PreparedStatementpstate=null;intupdateCount=0;try{conn=getConnection();pstate=conn.prepareStatement(sql);setParameters(pstate,param); updateCount=pstate.executeUpdate(); }finally{replease(conn,pstate,null);}returnupdateCount;}/执行update操作@paramsql预编译的sql语句@paramtsql中的参数@return执行行数@throwsException/publicstaticintupdate(Stringsql,Tt)throwsException{ Connectionconn=null; PreparedStatementpstate=null; intupdateCount=0;try{conn=getConnection();Listcolumns=getColumnsFromUpdate(sql); pstate=conn.prepareStatement(sql); setParameters(pstate,columns,t);updateCount=pstate.executeUpdate();}finally{replease(conn,pstate,null);}returnupdateCount;}执行update操作@paramsql@paramparam参数@return执行行数@throwsException/publicstaticintupdate(Stringsql,Object...param)throwsExcepti on{Connectionconn=null;PreparedStatementpstate=null;intupdateCount=0;try{conn=getConnection();pstate=conn.prepareStatement(sql);setParameters(pstate,param); updateCount=pstate.executeUpdate(); }finally{replease(conn,pstate,null);}returnupdateCount;}/查询复数的对象@paramt查询结果封装的对象类型@paramsql预编译的sql@paramparam查询条件@returnList@throwsException/publicstaticListqueryPlural(Classt,Stringsql,Object...param)th rowsException{Connectionconn=null;PreparedStatementstmt=null;ResultSetrs=null;Listlist=newArrayList();try{conn=getConnection();stmt=conn.prepareStatement(sql);setParameters(stmt,param);rs=stmt.executeQuery();while(rs.next()){list.add(instance(t,rs,sql));}}finally{replease(conn,stmt,rs);}returnlist;}/分页查询复数的对象@paramt查询结果封装的对象类型@paramstart开始页@paramlimit页大小@paramsql预编译的sql语句@paramparam查询参数@throwsException/publicstaticListqueryPluralForPagging(Classt,intstart,intlimit, Stringsql,Object...param)throwsException{Connectionconn=null;PreparedStatementstmt=null;ResultSetrs=null;Listlist=newArrayList();try{conn=getConnection();//添加分页代码sql=addPagingSQL(sql,start,limit);stmt=conn.prepareStatement(sql);setParameters(stmt,param);rs=stmt.executeQuery();while(rs.next()){list.add(instance(t,rs,sql));}}finally{replease(conn,stmt,rs); }returnlist;}/查询单个的对象@paramt查询结果对象@paramsql预编译的sql @paramparam查询参数@returnT@throwsException/publicstaticTquerySingular(Classt,Stringsql,Object...param)th rowsException{Tobj=null;ResultSetrs=null;Connectionconn=null;PreparedStatementpstate=null;try{conn=getConnection();pstate=conn.prepareStatement(sql);setParameters(pstate,param);rs=pstate.executeQuery();if(rs.next()){obj=instance(t,rs,sql);}}finally{replease(conn,pstate,rs); }returnobj;}/查询数据量@paramparam查询参数@paramsql@return@throwsSQLException@throwsNamingException /publicstaticintqueryDataCount(Stringsql,Object...param) throwsException{intdataCount=0;Connectionconn=null; PreparedStatementpstate=null;ResultSetrs=null;try{conn=getConnection();sql=addCountSQL(sql);pstate=conn.prepareStatement(sql); setParameters(pstate,param);rs=pstate.executeQuery();if(rs.next()){dataCount=rs.getInt("dataCount");}}finally{replease(conn,pstate,rs);}returndataCount;}/属性字段的注释,用于标记该属性对应的数据库字段例如:@Column(name="user_name"); StringuserName;表示userName这个属性对应的数据库字段是user_name如果属性和数据库字段完全一致,则不必标注@authorxueliang/@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME) public@interfaceColumn{ Stringname()default"";}}。
//数据库的查询数据package com.geminno.www.day1;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.sql.Connection;public class FirstJDBC {//类public static void main(String[] args) {//主方法Connection conn = null;//在这里定义,后面可以直接关闭Statement st = null;ResultSet rs = null;try {//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//这个是固定的//2.建立连接String url = "jdbc:mysql://localhost:3306/day810";//定义数据库位置String user = "root";//定义用户名String password = "root";//定义数据库密码conn = DriverManager.getConnection(url, user, password);//建立连接,千万不能导入错误if(conn != null){System.out.println("连接成功!!");}else{System.out.println("连接失败!!");}//3.创建对象st = conn.createStatement();//创建一个Statement对象String sql = "select * from student";//输入一个sql语句,用来发送到sql服务器//4.发送sql语句rs = st.executeQuery(sql);//发送sql语句并返回一个值//5.处理结果集(输出第一条数据)//由于数据太多,所有这种方法太麻烦了,所有直接加一个循环//因为rs.next()返回是Boolean类型的,所以可以作为标志来//当rs.next()为true时,进行循环,当rs.next()为false时,退出循环。
Swing界面与数据库删除操作import javax.swing.*;import javax.swing.border.*;import java.awt.*;import java.sql.*;import java.awt.event.*;public class jiemianshanchu extends JFrame implements ActionListener{ JTable table;Object[][] rowData=new Object[5][3];String[] title={"编号","标题","内容"};JLabel l1=new JLabel();JLabel l2=new JLabel();JTextField t0=new JTextField();JButton b1=new JButton();JButton b2=new JButton();public jiemianshanchu(){super("登入窗口");setBounds(200,200,360,310);setLayout(null); //不使用布局l1.setForeground(Color.red);l1.setFont(new Font("",Font.BOLD,18));l1.setText("新闻管理系统");l1.setBounds(39,28,170,36);add(l1);l2.setText("请输入删除编号:");l2.setBounds(38,83,100,15);add(l2);t0.setBounds(140,80,100,21);add(t0);b1.setText("退出");b1.setBounds(141,120,68,23);add(b1);b2.setText("确定");b2.setBounds(67,120,68,23);add(b2);setVisible(true);b2.addActionListener(this);b1.addActionListener(this);}public void actionPerformed(ActionEvent e){if(e.getSource()==b2){try {Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");String strCon = "jdbc:odbc:xinwen"; //连接字符串String strUser = ""; //数据库用户名String strPwd = ""; //口令Connection conn=DriverManager.getConnection(strCon, strUser, strPwd);Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);int id=Integer.parseInt(t0.getText());stat.executeUpdate("delete from xinwen where id="+id+"");JOptionPane.showMessageDialog(null,"数据已成功删除!");}catch (Exception ex){}}if(e.getSource()==b1){System.exit(0);}}public static void main(String args[]){jiemianshanchu jiemianshanchu=new jiemianshanchu();}}。