JAVA数据库操作详细
- 格式:pdf
- 大小:411.51 KB
- 文档页数:46
天之火–Qutr的专栏君子终日乾乾,夕惕若,厉,无咎。
HomeJava连接MySql数据库,并且实现插入、删除、更新、选择操作!这是我最近写的一个连接MySql数据库的一个例子,主要实现了插入,删除,更新,选择操作,用的环境是j2sdk1.4.2_08,Eclipse3.1。
以前我的同事用Python 写了同样的类,非常的好用,支持了我们公司的大部分业务,现在我们慢慢改用Java了,所以我用Java重写了一遍。
一方面在今后的业务中能够用到,另一方面熟悉一下Java。
下面我把在Eclipse3.1下怎样配置数据库连接信息简单说一下。
1.启动Eclipse3.1。
2.建立一个Java project就叫DbConnect 吧,再在该Project下建立一个新类也叫DbConnect 吧。
3.右击DbConnect.java文件点import,选择Archive file然后选择你的mysql-connector-java-3.1.8-bin.jar文件,点Finish。
你会看到有好些文件被加载进来,OK这就是连接MySql所需的驱动信息。
如果到了这里你都成功的话那么恭喜你,你已经成功一半了!:)4.接下来把我下面的代码copy到你的Java文件中,修改相关的数据库连接信息运行一下。
OK?我说一下那个mysql-connector-java-3.1.8-bin.jar文件,其实这就是一个MySql的驱动,各数据库厂商提供了不同的适用于JDBC的驱动使得在Java中连接数据库非常简单。
这里我就不多说了,以后我会写篇专门介绍数据库驱动的文章。
关于MySql的驱动还有更新版本的,你需要到MySql的网站上去下载,这个网上到处都是,我就不多说了。
下面看程序,有些地方我写了详细的注释应该能看懂。
这个类是非常有特色的,在每个方法的传人参数和返回值不变的情况下,希望高手能提出改进意见。
多指教,谢谢!/*** 数据库连接、选择、更新、删除演示*///import java.sql.*;import java.sql.Connection;import java.sql.Statement;import java.sql.ResultSet;import java.sql.DriverManager;import java.util.*;public class DbConnect{/////////////////////////////////////////———–>>>数据成员and 构造函数private Connection dbconn;private Statement dbstate;private ResultSet dbresult;DbConnect(){dbconn = null;dbstate = null;dbresult = null;}/////////////////////////////////////////———–>>>类方法public void print(String str)//简化输出{System.out.println(str);}//end print(…)/*** 连接MySql数据库* @param host* @param port* @param dbaName* @param usName* @param psw* @return bool值,连接成功返回真,失败返回假*/public boolean dbConnection(String host, String port, String dbaName, String usName, String psw){String driverName = "com.mysql.jdbc.Driver";//"org.gjt.mm.mysql.Driver"两个驱动都可以用String dbHost = host;//数据库的一些信息String dbPort = port;String dbName = dbaName;String enCoding = "?useUnicode=true&characterEncoding=gb2312"; //解决MySql中文问题,要连续写不能空格String userName = usName;String Psw = psw;String url = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName + enCoding;try{Class.forName(driverName).newInstance();dbconn = DriverManager.getConnection(url, userName, Psw);//getConnection(url, userName, Psw)从给的driver中选择合适的去连接数据库//return a connection to the URL}catch(Exception e){print("url = " + url); //发生错误时,将连接数据库信息打印出来print("userName = " + userName);print("Psw" + Psw);print("Exception: " + e.getMessage());//得到出错信息}if (dbconn != null)//dbconn != null 表示连接数据库成功,由异常保证!?return true;elsereturn false;}// end boolean dbConnection(…)/*** 对数据库表进行选择操作!* @param tableName 数据库表名* @param fieles 字段名* @param selCondition 选择条件* @return 一个含有map的List(列表)*/public ArrayList dbSelect(String tableName, ArrayList fields, String selCondition){ArrayList mapInList = new ArrayList();String selFields = "";for (int i = 0; i<fields.size(); ++i)selFields += fields.get(i) + ", ";String selFieldsTem = selFields.substring(0, selFields.length() – 2);//根据String的索引提取子串try{dbstate = dbconn.createStatement();String sql = "select " + selFieldsTem + " from " + tableName + selCondition;print("sql = " + sql);try{dbresult = dbstate.executeQuery(sql);}catch(Exception err){print("Sql = " + sql);print("Exception: " + err.getMessage());}while(dbresult.next()){Map selResult = new HashMap();selResult.put("message_type", dbresult.getString("message_type"));selResult.put("message_content",dbresult.getString("message_content"));mapInList.add(selResult);}}catch(Exception e){print("Exception: " + e.getMessage());}return mapInList;}//end String dbSelect(…)/*** 对数据库表中的记录进行删除操作* @param tableName* @param condition* @return bool值,表示删除成功或者失败。
如何用Java编写一个简单的数据库应用程序Java是一个非常强大的编程语言,它提供了多种处理数据库的方案。
下面我们将介绍如何用Java编写一个简单的数据库应用程序。
1.安装Java开发环境(JDK):首先,你需要安装Java开发环境(Java Development Kit,JDK)。
你可以从Oracle官方网站上下载最新版本的JDK,并按照它们提供的说明进行安装。
2.设置环境变量:一旦JDK安装完毕,你需要设置相应的环境变量。
在Windows系统中,你可以在“系统属性”中找到“高级”选项卡,点击“环境变量”,并添加JAVA_HOME变量指向JDK的安装路径。
3.下载并安装数据库:Java支持多种数据库,例如MySQL、Oracle和PostgreSQL。
你可以选择其中一个作为你的数据库。
在这个教程中,我们将使用MySQL作为示范。
从MySQL官方网站下载并安装最新版本的MySQL。
4.连接数据库:一旦数据库安装完毕,你需要编写Java代码来连接数据库。
首先,你需要下载MySQL JDBC驱动程序。
你可以从MySQL官方网站上找到最新版本的驱动程序,并将其添加到你的项目中。
接下来,你需要使用编程语言的`import`语句将这个驱动程序导入到你的Java代码中。
5.建立数据库连接:在你的Java代码中,你需要使用JDBC驱动程序提供的API来建立数据库连接。
这包括创建一个Connection对象,并传入数据库的URL、用户名和密码。
```javaimport java.sql.*;public class Main {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String user = "root";String password = "mypassword";try {Connection conn = DriverManager.getConnection(url, user, password);System.out.println("Connected to the database");} catch (SQLException e) {System.out.println("An error occurred");e.printStackTrace();}}}```在上面的代码中,`url`变量指定了数据库的URL,`user`和`password`变量指定了连接数据库所需的用户名和密码。
java根据传入sql语句进行数据库查询的方法在现代软件开发领域,Java已经成为了一种非常流行和广泛使用的编程语言之一。
尤其是在与数据库的交互方面,Java提供了丰富的API和工具,使得开发人员可以轻松地进行数据库操作。
在本篇文章中,我将探讨一种重要的Java编程技巧,即使用传入的SQL语句进行数据库查询的方法。
1. 什么是传入SQL语句进行数据库查询的方法?传入SQL语句进行数据库查询,是指在Java代码中,我们可以动态地构建和执行SQL查询语句。
相比于静态地写死SQL语句,这种方法更加灵活和可扩展,能够适应不同的查询需求。
2. Java中如何实现传入SQL语句进行数据库查询?Java提供了多种方式来实现传入SQL语句进行数据库查询的方法。
下面,我将介绍其中两种较常见的方式。
2.1 PreparedStatementPreparedStatement是一种预编译的SQL语句对象,允许我们在执行SQL查询之前传入参数。
通过使用占位符,我们可以动态地向SQL语句中插入参数,从而实现传入SQL语句进行数据库查询的功能。
例如:```String sql = "SELECT * FROM users WHERE id = ?";PreparedStatement pstmt =connection.prepareStatement(sql);pstmt.setInt(1, id);ResultSet rs = pstmt.executeQuery();```在上述代码中,我们首先定义了一个SQL语句,其中包含了一个占位符"?"。
我们通过调用setInt()方法,将id值传入占位符中。
通过执行executeQuery()方法,我们可以获得查询结果集。
2.2 SQLBuilderSQLBuilder是一种基于构建器模式的工具,可以帮助我们更加便捷地构建复杂的SQL查询语句。
java关于数据库字典用法Java关于数据库字典用法1. 什么是数据库字典数据库字典是指数据库中表、视图、列等各种对象的定义和描述信息。
它记录了数据库对象的元数据,包括对象的名称、类型、大小、约束等详细信息,以便于开发人员和数据库管理员进行数据库管理和数据库设计工作。
2. 为什么需要使用数据库字典数据库字典是数据库的重要组成部分,它具有以下几个重要的作用:•提供数据结构的文档化描述,方便开发人员了解数据库的结构和设计意图。
•提供数据表、视图等对象的详细信息,帮助开发人员快速定位和解决问题。
•提高开发人员之间的沟通效率,减少沟通成本。
•作为数据仓库和数据集成的重要依据,方便数据处理和数据分析工作的进行。
3. 如何生成数据库字典在Java中,我们可以使用各种数据库操作框架和工具来生成数据库字典。
以下是几种常见的生成数据库字典的方式:使用JDBC API获取数据库元数据Java提供了JDBC API来操作数据库,我们可以使用该API来获取数据库的元数据信息。
通过``接口,我们可以获取数据库的各种信息,包括表、列、主键、外键等信息。
可以使用以下代码片段来生成数据库字典:Connection conn = ("jdbc: "username", "password"); DatabaseMetaData metaData = ();ResultSet tables = (null, null, "%", null);while (()) {String tableName = ("TABLE_NAME");ResultSet columns = (null, null, tableName, null); while (()) {String columnName = ("COLUMN_NAME");String dataType = ("TYPE_NAME");int columnSize = ("COLUMN_SIZE");// 可以将这些信息保存到字典文件中}}使用第三方库或工具除了JDBC API,还有一些第三方库和工具可以用来生成数据库字典。
java mysqldatasource 用法Java MysqlDataSource 用法1. 什么是 MysqlDataSource?MysqlDataSource 是 Java 中用于连接和操作 MySQL 数据库的一个类。
它是接口的一个实现,允许开发人员使用标准的 JDBC API 来访问数据库。
2. 导入 MysqlDataSource要使用 MysqlDataSource,首先需要在代码中导入相关的类。
在Java 中,可以使用以下语句导入 MysqlDataSource 类:import ;3. 创建 MysqlDataSource 实例要使用 MysqlDataSource 类,需要创建一个 MysqlDataSource 的实例。
可以使用以下代码创建一个实例:MysqlDataSource dataSource = new MysqlDataSource();4. 设置数据库连接信息在创建 MysqlDataSource 实例后,需要设置相关的数据库连接信息,包括服务器地址、端口号、数据库名称、用户名和密码等。
以下是设置这些信息的示例代码:("localhost");(3306);("mydatabase");("username");("password");5. 设置其他连接选项除了基本的数据库连接信息外,还可以设置其他连接选项,例如连接超时时间、编码方式等。
以下是设置一些常用选项的示例代码:(5000); // 设置连接超时时间为 5 秒("UTF-8"); // 设置编码方式为 UTF-8(true); // 启用 SSL 加密连接6. 获取数据库连接设置完数据库连接信息后,可以通过调用 MysqlDataSource 的getConnection()方法来获取一个数据库连接。
如何在Java中进行数据的持久化和读取操作数据的持久化是指将程序中的数据存储在持久存储介质中(如文件、数据库等)以便下次程序运行时能够重新读取和使用。
在Java中,数据的持久化和读取操作可以通过文件操作、数据库操作、序列化和反序列化等方式实现。
本文将重点介绍在Java中进行数据的持久化和读取操作的几种方法。
一、文件操作1.1文件写入在Java中进行文件数据的持久化操作可以使用FileOutputStream 或者BufferedWriter等类来实现。
通过FileOutputStream类,可以将数据以字节的形式写入文件,示例代码如下:```javatry {String data = "Hello, World!";FileOutputStream fos = new FileOutputStream("data.txt");fos.write(data.getBytes());fos.close();} catch (IOException e) {e.printStackTrace();}```上述代码中,首先定义了一个字符串数据并赋值给data变量,然后通过FileOutputStream类打开文件输出流,并将字符串数据以字节形式写入文件中,最后关闭文件输出流。
1.2文件读取使用FileInputStream或者BufferedReader类可以实现对文件数据的读取操作。
示例代码如下:```javatry {FileInputStream fis = new FileInputStream("data.txt");int content;while ((content = fis.read()) != -1) {System.out.print((char) content);}fis.close();} catch (IOException e) {e.printStackTrace();}```上述代码中,首先使用FileInputStream类打开文件输入流,并定义一个整型变量content用于存储读取的字节数据。
Java中使用MyBatis Plus连接和操作MySQL数据库1. 简介近年来,Java语言以其跨平台特性和广泛的应用领域成为了全球最受欢迎的编程语言之一。
而MySQL作为一种强大的开源关系型数据库,也是Java开发者首选的数据库之一。
在Java中,我们可以使用MyBatis Plus来连接和操作MySQL数据库,提升开发效率和简化数据库操作。
2. MyBatis Plus简介MyBatis Plus是基于MyBatis的一款增强工具,旨在简化和提升MyBatis的使用体验。
它提供了一系列强大的功能,如代码生成器、分页插件、性能分析插件等,使得开发者能够更加便捷地开发和维护数据库相关的应用程序。
3. 连接MySQL数据库在使用MyBatis Plus连接MySQL数据库之前,我们需要先在项目中引入相关的依赖。
可以通过Maven或Gradle等构建工具来管理项目的依赖。
在pom.xml或build.gradle文件中添加相应的依赖项,然后进行构建操作。
在Java代码中,我们需要创建一个数据源并配置相关的数据库连接信息。
可以使用MySQL提供的JDBC驱动程序来管理数据库连接。
在MyBatis Plus中,我们可以使用com.mysql.cj.jdbc.Driver作为驱动类,指定数据库的URL、用户名和密码来建立连接。
4. 创建实体类在进行数据库操作之前,我们需要定义与数据库表对应的实体类。
在Java中,我们可以使用POJO(Plain Old Java Object)来表示实体类。
POJO是一种普通的Java对象,不继承任何特定的父类或实现任何特定的接口。
在MyBatis Plus中,实体类需要使用@Table注解来指定对应的数据库表名,使用@Column注解来指定字段名,以及指定主键等属性。
通过在实体类中定义与表对应的字段和属性,我们可以通过MyBatis Plus来进行数据库的增删改查操作。
Java操作PostgreSQLPostgreSQL是一种开源的关系型数据库管理系统,广泛应用于许多企业和开发者的项目中。
Java作为一种强大而灵活的编程语言,也提供了许多工具和库可以用于与PostgreSQL进行交互和操作。
本文将介绍如何使用Java操作PostgreSQL数据库,以及一些常用的操作技巧和注意事项。
一、准备工作在开始使用Java操作PostgreSQL之前,我们需要进行一些准备工作。
首先,确保你已经安装了Java开发环境(JDK),并且能够正常运行Java程序。
其次,需要安装并配置好PostgreSQL数据库,并创建一个数据库实例。
二、连接数据库与PostgreSQL进行交互的第一步是建立连接。
Java提供了JDBC (Java Database Connectivity)来实现与各种数据库的连接。
下面是一个连接到PostgreSQL数据库的示例代码:```javaimport java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class PostgreSQLConnection {public static void main(String[] args) {Connection connection = null;try {// 加载驱动程序Class.forName("org.postgresql.Driver");// 连接数据库String url = "jdbc:postgresql://localhost:5432/mydatabase";String user = "myuser";String password = "mypassword";connection = DriverManager.getConnection(url, user, password); System.out.println("成功连接到数据库!");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 关闭连接try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}}```在上述代码中,首先使用`Class.forName`加载PostgreSQL的JDBC驱动程序。
非本人资料,资料来自:/cxwen78/article/details/6863696这网址很多好的资料。
JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术。
一、JDBC基础知识JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。
1、跨平台运行:这是继承了Java语言的“一次编译,到处运行”的特点;2、不受数据库供应商的限制:巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发人员通过SQL调用数据库和处理结果,而不需要考虑数据库的提供商;另一个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利用JDBC API创建Java程序和数据源之间的桥梁。
应用程序只需要编写一次,便可以移到各种驱动程序上运行。
Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就可以被识别,就可以正常工作。
所以JDBC不受数据库供应商的限制。
JDBC API可以作为连接Java应用程序与各种关系数据库的纽带,在带来方便的同时也有负面影响,以下是JDBC的优、缺点。
优点如下:∙操作便捷:JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数;∙可移植性强:JDBC支持不同的关系数据库,所以可以使同一个应用程序支持多个数据库的访问,只要加载相应的驱动程序即可;∙通用性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;∙面向对象:可以将常用的JDBC数据库连接封装成一个类,在使用的时候直接调用即可。
Java中的数据库操作和ORM框架在Java开发中,数据库操作是一个非常重要的环节之一。
为了方便开发者对数据库进行操作,提高开发效率和可维护性,ORM(Object Relational Mapping)框架被广泛应用。
本文将介绍Java中的数据库操作和ORM框架的使用。
一、Java中的数据库操作1. JDBCJDBC(Java Database Connectivity)是Java中最常用的数据库操作方式之一。
通过JDBC,开发者可以使用Java程序连接数据库、执行SQL语句、获取数据结果等。
JDBC的基本使用步骤如下:(1)加载数据库驱动程序:Class.forName("com.mysql.jdbc.Driver");(2)建立数据库连接:Connection connection = DriverManager.getConnection(url, username, password);(3)创建Statement对象:Statement statement =connection.createStatement();(4)执行SQL语句并获取结果:ResultSet resultSet = statement.executeQuery(sql);(5)遍历结果集并处理数据:while (resultSet.next()) { // 处理数据 }(6)释放资源:resultSet.close(); statement.close(); connection.close();2. PreparedStatementPreparedStatement是JDBC中用于执行预编译SQL语句的接口。
相比Statement,PreparedStatement具备更好的性能和安全性,并且可以防止SQL注入攻击。
使用PreparedStatement的基本步骤如下:(1)创建PreparedStatement对象:PreparedStatement preparedStatement = connection.prepareStatement(sql);(2)设置参数并执行SQL语句:preparedStatement.setXXX(index, value); // 设置参数 preparedStatement.execute(); // 执行SQL语句(3)获取结果集并处理数据:ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { // 处理数据 }(4)释放资源:resultSet.close(); preparedStatement.close(); connection.close();二、ORM框架的使用1. HibernateHibernate是一个流行的Java ORM框架,它通过对象关系映射的方式将Java对象与数据库表进行映射,提供了一系列方便的API来进行数据库操作。
由于对数据库操作后有很多重复代码.这样可以把操作封装成一个类,这个类可以完成对表的操作.第七十一讲:初步理解模式的概念(mv):增加项目的可维护性,尤其在做一个大项目的时候,如果没有一个好的方案的话,那么就会很悲剧了.软件开发也是一个渐进的过程./***写成一个ming版的学生管理系统*1,查询任务*2,添加学生*/package com.test1;import java.awt.*;import java.awt.event.*;import java.sql.*;import javax.swing.*;public class StudentManagement extends JFrame implements ActionListener {//定义一些控件JPanel jp1,jp2;JLabel jl;JButton jb1,jb2,jb3,jb4;JTable jt;JTextField jtf;JScrollPane jsp=null;Connection ct=null;PreparedStatement ps=null;StuModel sm=null;public static void main(String[]args){ StudentManagement ta=new StudentManagement(); }public StudentManagement(){jp1=new JPanel();jl=new JLabel("请输入名字:");jtf=new JTextField(20);jb1=new JButton("查询");//注册监听jb1.addActionListener(this);//把各个控件加入到jp1;jp1.add(jl);jp1.add(jtf);jp1.add(jb1);jp2=new JPanel();jb2=new JButton("添加");jb3=new JButton("修改");jb4=new JButton("删除");//注册监听jb2.addActionListener(this);jb3.addActionListener(this);jb4.addActionListener(this);jp2.add(jb2);jp2.add(jb3);jp2.add(jb4);//创建一个数据模型对象sm=new StuModel();//初始化JTablejt=new JTable(sm);//初始化jspjsp=new JScrollPane(jt);//吧jsp放进到JFramethis.add(jsp);this.add(jp1,BorderLayout.NORTH);this.add(jp2,BorderLayout.SOUTH);this.setSize(500,400);this.setLocation(200,200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){//TODO Auto-generated method stub//判断是那个按钮被点击//如果相应与监听在同一个类中也可以用下面方法.if(e.getSource()==jb1){//System.out.println("用户希望查询");测试用的//因为把表的数据封装到StuModel中,我们就可以比较简单地完成查询任务String name=this.jtf.getText().trim();//写一个sql语句String sql="select*from student where stuName='"+name+"'";//构建新的数据模型类并更新sm=new StuModel(sql);jt.setModel(sm);}//当用户点击添加else if(e.getSource()==jb2){//合理应该为模式的状态,否则,还没有插完就会执行下面的语句,导致无法更新.StuAddDialog sad=new StuAddDialog(this,"添加学生",true);//重新再获得新的数据模型sm=new StuModel();jt.setModel(sm);}else if(e.getSource()==jb3){System.out.print("aaaa");int rownum=this.jt.getSelectedRow();if(rownum==-1){//提示JOptionPane.showMessageDialog(this,"请选择一行");return;//代表不要再往下面走了,谁调用就返回给谁}//显示修改对话框new StudentUpdateDialog(this,"修改对话框",true,sm,rownum);}//当前用户点击删除else if(e.getSource()==jb4){//得到该学生的id//getSelectedRo会返回用户点击的行//如果一行都没选,则会返回-1int rownum=this.jt.getSelectedRow();if(rownum==-1){//提示JOptionPane.showMessageDialog(this,"请选择一行");return;//代表不要再往下面走了,谁调用就返回给谁}//得到学生的编号String stuId=(String)sm.getValueAt(rownum,0);//System.out.print(stuId);//测试用的//连接数据库,完成删除任务try{//加载驱动Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//System.out.print("1");//测试用的//得到连接ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;d atabaseName=spdb1","sa","h123");//System.out.print("2");//测试用的ps=ct.prepareStatement("delete from student where stuid='"+stuId+"'");//System.out.print("3");//测试用的ps.executeUpdate();}catch(Exception ex){ex.printStackTrace();}finally{try{if(ps!=null)ps.close();if(ct!=null)ps.close();}catch(SQLException e1){//TODO Auto-generated catch blocke1.printStackTrace();}}sm=new StuModel();jt.setModel(sm);}}}/***这是我的一个Student表的模型*可以把对student表的各种操作封装到该模型中*/package com.test1;import java.sql.*;import java.util.Vector;import javax.swing.JTable;import javax.swing.table.AbstractTableModel; public class StuModel extends AbstractTableModel{Vector rowData,columnNames;JTable jt=null;//定义操作数据库需要的东西PreparedStatement ps=null;Connection ct=null;ResultSet rs=null;public void init(String sql){if(sql==null){sql="select*from student";}//中间处理jt=new JTable();columnNames=new Vector();//设置列名columnNames.add("学号");columnNames.add("名字");columnNames.add("性别");columnNames.add("年龄");columnNames.add("籍贯");columnNames.add("系别");//rowData可以存放多行rowData=new Vector();try{//加载驱动Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//System.out.print("1");//测试用的//得到连接ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=spdb1","s a","h123");//System.out.print("2");//测试用的ps=ct.prepareStatement(sql);//System.out.print("3");//测试用的rs=ps.executeQuery();//System.out.print("4");//测试用的while(rs.next()){Vector hang=new Vector();hang.add(rs.getString(1));hang.add(rs.getString(2));hang.add(rs.getString(3));hang.add(rs.getInt(4));hang.add(rs.getString(5));hang.add(rs.getString(6));//加入到rowDatarowData.add(hang);}//System.out.print("5");//测试用的}catch(Exception e){e.printStackTrace();}finally{try{if(rs!=null)rs.close();if(ps!=null)ps.close();if(ct!=null)ct.close();}catch(SQLException e){//TODO Auto-generated catch blocke.printStackTrace();}}}//通过传递的sql语句来获得数据模型public StuModel(String sql){init(sql);}//构造函数,初始化我们的数据模型public StuModel(){this.init(null);}public void addStu(String sql){//根据用户输入的sql语句完成添加任务.}@Overridepublic String getColumnName(int column){//TODO Auto-generated method stubreturn(String)this.columnNames.get(column);}@Override//得到共有多少列public int getColumnCount(){//TODO Auto-generated method stub//System.out.print("getColumnCount");//测试所用return this.columnNames.size();}@Override//得到共有多少行public int getRowCount(){//TODO Auto-generated method stubreturn this.rowData.size();}@Override//得到某行某列的数据public Object getValueAt(int rowIndex,int columnIndex){//TODO Auto-generated method stubreturn((Vector)this.rowData.get(rowIndex)).get(columnIndex);}}package com.test1;import java.awt.*;import java.awt.event.*;import java.sql.*;import javax.swing.*;public class StuAddDialog extends JDialog implements ActionListener{//定义我需要的swing组件JLabel jl1,jl2,jl3,jl4,jl5,jl6;JButton jb1,jb2;JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;JPanel jp1,jp2,jp3;//构造函数Frame代表父窗口口,title代表窗口的名字,model指定是模式窗口,还是非模式的窗口public StuAddDialog(Frame owner,String title,boolean model){super(owner,title,model);//调用父类构造方法,达到模式对话框效果jl1=new JLabel("学号");jl2=new JLabel("姓名");jl3=new JLabel("性别");jl4=new JLabel("年龄");jl5=new JLabel("籍贯");jl6=new JLabel("系别");jtf1=new JTextField();jtf2=new JTextField();jtf3=new JTextField();jtf4=new JTextField();jtf5=new JTextField();jtf6=new JTextField();jb1=new JButton("添加");jb2=new JButton("取消");jp1=new JPanel();jp2=new JPanel();jp3=new JPanel();//设置布局jp1.setLayout(new GridLayout(6,1)); jp2.setLayout(new GridLayout(6,1));//添加组件jp1.add(jl1);jp1.add(jl2);jp1.add(jl3);jp1.add(jl4);jp1.add(jl5);jp1.add(jl6);jp2.add(jtf1);jp2.add(jtf2);jp2.add(jtf3);jp2.add(jtf4);jp2.add(jtf5);jp2.add(jtf6);jp3.add(jb1);jp3.add(jb2);this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);//注册监听jb1.addActionListener(this);//展现this.setSize(300,200);this.setLocation(200,300);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){//TODO Auto-generated method stubif(e.getSource()==jb1){//对用户点击添加按钮后的响应动作//连接数据库Connection ct=null;PreparedStatement ps=null;try{//加载驱动Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//获取连接ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;d atabaseName=spdb1","sa","h123");//预编译的都是通过添加参数的方式来赋值ps=ct.prepareStatement("insert into student values (?,?,?,?,?,?)");ps.setString(1,this.jtf1.getText());ps.setString(2,this.jtf2.getText());ps.setString(3,this.jtf3.getText());ps.setInt(4,Integer.parseInt(this.jtf4.getText()));ps.setString(5,this.jtf5.getText());ps.setString(6,this.jtf6.getText());int i=ps.executeUpdate();if(i==1){System.out.print("添加成功ok");}else{System.out.print("添加失败");}}catch(Exception e1){//TODO Auto-generated catch blocke1.printStackTrace();}finally{try{ps.close();ct.close();}catch(SQLException e1){//TODO Auto-generated catch blocke1.printStackTrace();}}}}}/***修改学生界面*/package com.test1;import java.awt.*;import java.awt.event.*;import java.sql.*;import javax.swing.*;public class StudentUpdateDialog extends JDialog implements ActionListener{//定义我需要的swing组件JLabel jl1,jl2,jl3,jl4,jl5,jl6;JButton jb1,jb2;JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;JPanel jp1,jp2,jp3;//构造函数Frame代表父窗口口,title代表窗口的名字,model指定是模式窗口,还是非模式的窗口public StudentUpdateDialog(Frame owner,String title,boolean model,StuModel sm,int rownum){super(owner,title,model);//调用父类构造方法,达到模式对话框效果jl1=new JLabel("学号");jl2=new JLabel("姓名");jl3=new JLabel("性别");jl4=new JLabel("年龄");jl5=new JLabel("籍贯");jl6=new JLabel("系别");jtf1=new JTextField();jtf2=new JTextField();jtf3=new JTextField();jtf4=new JTextField();jtf5=new JTextField();jtf6=new JTextField();//初始化数据jtf1.setText((String)sm.getValueAt(rownum,0));jtf1.setEditable(false);jtf2.setText((String)sm.getValueAt(rownum,1));jtf3.setText((String)sm.getValueAt(rownum,2));jtf4.setText(sm.getValueAt(rownum,3)+"");jtf5.setText((String)sm.getValueAt(rownum,4));jtf6.setText((String)sm.getValueAt(rownum,5));jb1=new JButton("修改");jb2=new JButton("取消");jp1=new JPanel();jp2=new JPanel();jp3=new JPanel();//设置布局jp1.setLayout(new GridLayout(6,1));jp2.setLayout(new GridLayout(6,1));//添加组件jp1.add(jl1);jp1.add(jl2);jp1.add(jl3);jp1.add(jl4);jp1.add(jl5);jp1.add(jl6);jp2.add(jtf1);jp2.add(jtf2);jp2.add(jtf3);jp2.add(jtf4);jp2.add(jtf5);jp2.add(jtf6);jp3.add(jb1);jp3.add(jb2);this.add(jp1,BorderLayout.WEST);this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);//注册监听jb1.addActionListener(this);//展现this.setSize(300,200);this.setLocation(200,300);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){//TODO Auto-generated method stubif(e.getSource()==jb1){//对用户点击添加按钮后的响应动作//连接数据库Connection ct=null;PreparedStatement ps=null;try{//加载驱动Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//获取连接ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;d atabaseName=spdb1","sa","h123");//预编译的都是通过添加参数的方式来赋值ps=ct.prepareStatement("update student set stuName=?,stuSex=?,stuAge=?,stuJg=?,stuDept=?where stuId=?");ps.setString(1,this.jtf2.getText());ps.setString(2,this.jtf3.getText());ps.setInt(3,Integer.parseInt(this.jtf4.getText()));ps.setString(4,this.jtf5.getText());ps.setString(5,this.jtf6.getText());ps.setString(6,this.jtf1.getText());int i=ps.executeUpdate();if(i==1){System.out.print("修改成功ok");}else{System.out.print("修改失败");}}catch(Exception e1){//TODO Auto-generated catch blocke1.printStackTrace();}finally{try{ps.close();ct.close();}catch(SQLException e1){//TODO Auto-generated catch blocke1.printStackTrace();}}}}}第七十二讲:下面将前面的model1模式改成model2模式Model2模式的最大特点是:界面和后台操作是分离的,代码复用性高,可读性好,可维护性高;缺点是:复杂性高.现在大部分公司采用的是model2模式./***Model2模式*写成一个ming版的学生管理系统*1,查询任务*2,添加学生*/package com.test2;import java.awt.*;import java.awt.event.*;import java.sql.*;import javax.swing.*;public class StudentManagement extends JFrame implements ActionListener{ //定义一些控件JPanel jp1,jp2;JLabel jl;JButton jb1,jb2,jb3,jb4;JTable jt;JTextField jtf;JScrollPane jsp=null;StuModel sm=null;public static void main(String[]args){StudentManagement ta=new StudentManagement();}public StudentManagement(){jp1=new JPanel();jl=new JLabel("请输入名字:");jtf=new JTextField(20);jb1=new JButton("查询");//注册监听jb1.addActionListener(this);//把各个控件加入到jp1;jp1.add(jl);jp1.add(jtf);jp1.add(jb1);jp2=new JPanel();jb2=new JButton("添加");jb3=new JButton("修改");jb4=new JButton("删除");//注册监听jb2.addActionListener(this);jb3.addActionListener(this);jb4.addActionListener(this);jp2.add(jb2);jp2.add(jb3);jp2.add(jb4);//创建一个数据模型对象sm=new StuModel();//初始化JTablejt=new JTable(sm);//初始化jspjsp=new JScrollPane(jt);//吧jsp放进到JFramethis.add(jsp);this.add(jp1,BorderLayout.NORTH);this.add(jp2,BorderLayout.SOUTH);this.setSize(500,400);this.setLocation(200,200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){//TODO Auto-generated method stub//判断是那个按钮被点击//如果相应与监听在同一个类中也可以用下面方法.if(e.getSource()==jb1){//因为把表的数据封装到StuModel中,我们就可以比较简单地完成查询任务String name=this.jtf.getText().trim();//写一个sql语句String sql="select*from student where stuName='"+name+"'";//构建新的数据模型类并更新sm=new StuModel(sql);jt.setModel(sm);}//当用户点击添加else if(e.getSource()==jb2){//合理应该为模式的状态,否则,还没有插完就会执行下面的语句,导致无法更新.StuAddDialog sad=new StuAddDialog(this,"添加学生",true);//重新再获得新的数据模型sm=new StuModel();jt.setModel(sm);}else if(e.getSource()==jb3){System.out.print("aaaa");int rownum=this.jt.getSelectedRow();if(rownum==-1){//提示JOptionPane.showMessageDialog(this,"请选择一行");return;//代表不要再往下面走了,谁调用就返回给谁}//显示修改对话框new StudentUpdateDialog(this,"修改对话框",true,sm,rownum);}//当前用户点击删除else if(e.getSource()==jb4){//得到该学生的id//getSelectedRo会返回用户点击的行//如果一行都没选,则会返回-1int rownum=this.jt.getSelectedRow();if(rownum==-1){//提示JOptionPane.showMessageDialog(this,"请选择一行");return;//代表不要再往下面走了,谁调用就返回给谁}//得到学生的编号String stuId=(String)sm.getValueAt(rownum,0);//System.out.print(stuId);//测试用的StuModel temp=new StuModel();//创建一个sql语句String sql="delete from student where stuId=?";String[]paras={stuId};if(!temp.updateStudent(sql,paras)){//提示JOptionPane.showMessageDialog(this,"删除失败");}sm=new StuModel();//解决一次无用的查询jt.setModel(sm);}}}/***这是我的一个Student表的模型*可以把对student表的各种操作封装到该模型中*/package com.test2;import java.sql.*;import java.util.Vector;import javax.swing.JTable;import javax.swing.table.*;public class StuModel extends AbstractTableModel{Vector rowData,columnNames;JTable jt=null;//定义操作数据库需要的东西PreparedStatement ps=null;Connection ct=null;ResultSet rs=null;String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=spdb1"; String user="sa";String password="h123";//添加,删除,修改学生由于添加的参数不确定,因此用数组来传递参数public Boolean updateStudent(String sql,String[]paras){boolean b=true;try{//1加载驱动Class.forName(driver);//2得到连接ct=DriverManager.getConnection(url,user,password);//3创建ps对象ps=ct.prepareStatement(sql);//给ps的?赋值for(int i=0;i<paras.length;i++){//sql中给int传入String类型,dbms会自动转的.ps.setString(i+1,paras[i]);}//4执行操作if(ps.executeUpdate()!=1){b=false;}}catch(Exception e){b=false;e.printStackTrace();}finally{try{if(ps!=null)ps.close();if(ct!=null)ct.close();}catch(SQLException e){e.printStackTrace();}}return b;}public void init(String sql){if(sql==null){sql="select*from student";}//中间处理jt=new JTable();columnNames=new Vector();//设置列名columnNames.add("学号");columnNames.add("名字");columnNames.add("性别");columnNames.add("年龄");columnNames.add("籍贯");columnNames.add("系别");//rowData可以存放多行rowData=new Vector();try{//加载驱动Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//System.out.print("1");//测试用的//得到连接ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;d atabaseName=spdb1","sa","h123");//System.out.print("2");//测试用的ps=ct.prepareStatement(sql);//System.out.print("3");//测试用的rs=ps.executeQuery();//System.out.print("4");//测试用的while(rs.next()){Vector hang=new Vector();hang.add(rs.getString(1));hang.add(rs.getString(2));hang.add(rs.getString(3));hang.add(rs.getInt(4));hang.add(rs.getString(5));hang.add(rs.getString(6));//加入到rowDatarowData.add(hang);}//System.out.print("5");//测试用的}catch(Exception e){e.printStackTrace();}finally{try{if(rs!=null)rs.close();if(ps!=null)ps.close();if(ct!=null)ct.close();}catch(SQLException e){//TODO Auto-generated catch blocke.printStackTrace();}}}//通过传递的sql语句来获得数据模型public StuModel(String sql){init(sql);}//构造函数,初始化我们的数据模型public StuModel(){this.init(null);}public void addStu(String sql){//根据用户输入的sql语句完成添加任务.}@Overridepublic String getColumnName(int column){return(String)this.columnNames.get(column);}@Override//得到共有多少列public int getColumnCount(){//System.out.print("getColumnCount");//测试所用return this.columnNames.size();}@Override//得到共有多少行public int getRowCount(){return this.rowData.size();}@Override//得到某行某列的数据public Object getValueAt(int rowIndex,int columnIndex){ return((Vector)this.rowData.get(rowIndex)).get(columnIndex);}}package com.test2;import java.awt.*;import java.awt.event.*;import java.sql.*;import javax.swing.*;public class StuAddDialog extends JDialog implements ActionListener{//定义我需要的swing组件JLabel jl1,jl2,jl3,jl4,jl5,jl6;JButton jb1,jb2;JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;JPanel jp1,jp2,jp3;//构造函数Frame代表父窗口口,title代表窗口的名字,model指定是模式窗口,还是非模式的窗口public StuAddDialog(Frame owner,String title,boolean model){super(owner,title,model);//调用父类构造方法,达到模式对话框效果jl1=new JLabel("学号");jl2=new JLabel("姓名");jl3=new JLabel("性别");jl4=new JLabel("年龄");jl5=new JLabel("籍贯");jl6=new JLabel("系别");jtf1=new JTextField();jtf2=new JTextField();jtf3=new JTextField();jtf4=new JTextField();jtf5=new JTextField();jtf6=new JTextField();jb1=new JButton("添加");jb2=new JButton("取消");jp1=new JPanel();jp2=new JPanel();jp3=new JPanel();//设置布局jp1.setLayout(new GridLayout(6,1));jp2.setLayout(new GridLayout(6,1));//添加组件jp1.add(jl1);jp1.add(jl2);jp1.add(jl3);jp1.add(jl4);jp1.add(jl5);jp1.add(jl6);jp2.add(jtf1);jp2.add(jtf2);jp2.add(jtf3);jp2.add(jtf4);jp2.add(jtf5);jp2.add(jtf6);jp3.add(jb1);jp3.add(jb2);this.add(jp1,BorderLayout.WEST);this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);//注册监听jb1.addActionListener(this);//展现this.setSize(300,200);this.setLocation(200,300);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){ if(e.getSource()==jb1){//希望添加StuModel temp=new StuModel();String sql="insert into student values(?,?,?,?,?,?)";String[]paras={jtf1.getText(),jtf2.getText(),jtf3.getText(),jtf4.getText(), jtf5.getText(),jtf6.getText()};if(!temp.updateStudent(sql,paras)){//提示JOptionPane.showMessageDialog(this,"添加失败");}//关闭对话框,关闭添加对话框this.dispose();}}}/***修改学生界面*/package com.test2;import java.awt.*;import java.awt.event.*;import java.sql.*;import javax.swing.*;public class StudentUpdateDialog extends JDialog implements ActionListener{//定义我需要的swing组件JLabel jl1,jl2,jl3,jl4,jl5,jl6;JButton jb1,jb2;JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;JPanel jp1,jp2,jp3;//构造函数Frame代表父窗口口,title代表窗口的名字,model指定是模式窗口,还是非模式的窗口public StudentUpdateDialog(Frame owner,String title,boolean model,StuModel sm,int rownum){super(owner,title,model);//调用父类构造方法,达到模式对话框效果jl1=new JLabel("学号");jl2=new JLabel("姓名");jl3=new JLabel("性别");jl4=new JLabel("年龄");jl5=new JLabel("籍贯");jl6=new JLabel("系别");jtf1=new JTextField();jtf2=new JTextField();jtf3=new JTextField();jtf4=new JTextField();jtf5=new JTextField();jtf6=new JTextField();//初始化数据jtf1.setText((String)sm.getValueAt(rownum,0)); jtf1.setEditable(false);jtf2.setText((String)sm.getValueAt(rownum,1)); jtf3.setText((String)sm.getValueAt(rownum,2)); jtf4.setText(sm.getValueAt(rownum,3)+"");jtf5.setText((String)sm.getValueAt(rownum,4)); jtf6.setText((String)sm.getValueAt(rownum,5));jb1=new JButton("修改");jb2=new JButton("取消");jp1=new JPanel();jp2=new JPanel();jp3=new JPanel();//设置布局jp1.setLayout(new GridLayout(6,1));jp2.setLayout(new GridLayout(6,1));//添加组件jp1.add(jl1);jp1.add(jl2);jp1.add(jl3);jp1.add(jl4);jp1.add(jl5);jp1.add(jl6);jp2.add(jtf1);jp2.add(jtf2);jp2.add(jtf3);jp2.add(jtf4);jp2.add(jtf5);jp2.add(jtf6);jp3.add(jb1);jp3.add(jb2);this.add(jp1,BorderLayout.WEST);this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);//注册监听jb1.addActionListener(this);//展现this.setSize(300,200);this.setLocation(200,300);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e){//TODO Auto-generated method stubif(e.getSource()==jb1){String sql="update student setstuName=?,stuSex=?,stuAge=?,stuJg=?,stuDept=?where stuId=?";String[]paras={this.jtf2.getText(),jtf3.getText(),this.jtf4.getText(),this. jtf5.getText(),this.jtf6.getText(),this.jtf1.getText()};StuModel temp=new StuModel();temp.updateStudent(sql,paras);}}}第七十三讲:ADO模型:在函数里需要传值,但是在调用时却不需要传值,那么就可以传入null值,在函数内部先if判断是否为null如果不是再进行操作,为空的时候在进行为空的操作.或者第二种解决方法来自于:select*from student where1=1;可以在传入的参数中为1sql语句改为select*from student where1=?简而言之:还是第一个方法好。