JDBC编程之程序优化

首先下载 MySQL 的 JDBC 驱动,下载链接:

https://dev.mysql.com/downloads/connector/j/

  

  

  

  

mysql-connector-java-5.1.41.zip解压后一览:

  

  

  

  

  

工程名:JDBCTest

包名:com.siwuxie095.util、com.siwuxie095.entity、com.siwuxie095.dao、

com.siwuxie095.dao.impl、com.siwuxie095.test

类名:ConnectionFactory.java、StuIdEntity.java、StuInfo.java、StuPassword.java、

StuInfoDao.java、StuPasswordDao.java、StuInfoDaoImpl.java、

StuPasswordDaoImpl.java、DaoTest.java(主类)

  

  

点击选择src,右键->New->File,创建文件:dbconfig.properties

  

  

  

  

打开资源管理器,在工程 JDBCTest 文件夹下,创建一个文件夹:lib,

在其中放入:mysql-connector-java-5.1.41-bin.jar

  

  

选择mysql-connector-java-5.1.41-bin.jar,右键->Build Path->Add to Build Path

  

此时,工程结构目录一览:

  

  

  

  

  

ConnectionFactory.java:

  

package com.siwuxie095.util;

  

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.util.Properties;

  

  

//数据库连接工厂类

public class ConnectionFactory {

 

//四个成员变量用于保存从属性文件中读取到的数据库配置信息

private static String driver;

private static String dburl;

private static String user;

private static String password;

 

//定义ConnectionFactory类型的成员变量

private static final ConnectionFactory factory=new ConnectionFactory();

 

//定义Connection类型的成员变量,用于保存数据库连接

private Connection conn;

 

 

/**

*用 static声明一个静态代码块

*静态代码块用于初始化类,可以为类的属性赋值

*

*当JVM加载类时,会执行其中的静态代码块

*

*因为是在加载类的过程中执行的,所以静态代码块只会执行一次

*

*这里是从属性文件中读取相关的配置信息

*/

static{

 

/**

*创建一个 Properties对象,Properties在 java.util包中,

*继承自 Hashtable类,可以用来保存属性文件中的键值对,

* Properties的方法专门用于处理属性文件中的键值对

*/

Properties prop=new Properties();

 

try {

 

/**

*获取属性文件中的内容:

*首先获取当前类的类加载器,使用类加载器的getResourceAsStream()方法,

*读取属性文件中内容,并读取到一个输入流中

*/

InputStreamin=ConnectionFactory.class.getClassLoader()

.getResourceAsStream("dbconfig.properties");

 

//从输入流中读取属性列表,即键值对

prop.load(in);

 

}catch (Exception e) {

System.out.println("========配置文件读取错误========");

}

 

//将读取到的值赋值给成员变量

driver=prop.getProperty("driver");

dburl=prop.getProperty("dburl");

user=prop.getProperty("user");

password=prop.getProperty("password");

//属性文件的加载---编写完成

}

 

 

 

//定义一个默认构造方法(空的构造方法)

//构造方法私有化是单例化一个类的第一步

private ConnectionFactory(){

 

}

 

 

//定义getInstance()方法,用来获取一个ConnectionFactory的实例

//单例模式,保证在程序运行期间,只有一个ConnectionFactory实例存在

public static ConnectionFactory getInstance() {

return factory;

}

 

 

//创建一个获取数据库连接的方法 makeConnection()

public Connection makeConnection() {

 

try {

 

Class.forName(driver);

conn=DriverManager.getConnection(dburl,user,password);

 

}catch (Exception e) {

e.printStackTrace();

}

 

return conn;

 

}

 

}

  

  

  

StuIdEntity.java:

  

package com.siwuxie095.entity;

  

  

/**

*定义一个所有实体类(DTO)的父类:StuIdEntity

* StuIdEntity只有一个属性:stuId

*

*因为所有的表都会有一个没有业务含义的主键id:stu_id

* StuIdEntity类就是封装了这个非业务的主键信息

*

*同时 StuIdEntity.java也是抽象类,其子类为:

* StuInfo.java和 StuPassword.java

*

* StuInfo.java和 StuPassword.java也是两个DTO类,

*分别对应之前创建的stu_password表和stu_info表

*

* DTO即 Data Transfer Object,数据传输对象

*

* DTO主要用于远程调用等需要大量传输对象的地方

*

* DTO类一般只有成员变量、getter和setter方法、构造函数

*

* DTO不能包含业务逻辑

*

*/

public abstract class StuIdEntity {

 

protected String stuId;

  

public String getStuId() {

return stuId;

}

  

publicvoid setStuId(String stuId) {

this.stuId = stuId;

}

 

 

}

  

  

  

StuInfo.java:

  

package com.siwuxie095.entity;

  

/**

* StuInfo继承自 StuIdEntity

*即它也是一个 DTO类(实体类)

*

* @author siwux

*

*/

public class StuInfoextends StuIdEntity {

 

//这些属性和数据库中 stu_info 表中的字段对应

private String stuName;

private String stuSex;

private String stuAcademic;

private String stuMajor;

  

public String getStuName() {

return stuName;

}

  

publicvoid setStuName(String stuName) {

this.stuName = stuName;

}

  

public String getStuSex() {

return stuSex;

}

  

publicvoid setStuSex(String stuSex) {

this.stuSex = stuSex;

}

  

public String getStuAcademic() {

return stuAcademic;

}

  

publicvoid setStuAcademic(String stuAcademic) {

this.stuAcademic = stuAcademic;

}

  

public String getStuMajor() {

return stuMajor;

}

  

publicvoid setStuMajor(String stuMajor) {

this.stuMajor = stuMajor;

}

  

//覆盖toString()方法

@Override

public String toString() {

return"StuInfo [stuName=" + stuName +", stuSex=" + stuSex + ", stuAcademic="

+ stuAcademic +", stuMajor="+ stuMajor + ", stuId=" + stuId + "]";

}

  

}

  

  

  

StuPassword.java:

  

package com.siwuxie095.entity;

  

/**

* StuPassword继承自 StuIdEntity

*即它也是一个 DTO类(实体类)

*

* @author siwux

*

*/

public class StuPasswordextends StuIdEntity {

  

//stuPwd和数据库中 stu_password表中的字段对应

private String stuPwd;

  

public String getStuPwd() {

return stuPwd;

}

  

publicvoid setStuPwd(String stuPwd) {

this.stuPwd = stuPwd;

}

  

//覆盖 toString()方法

@Override

public String toString() {

return"StuPassword [stuPwd=" + stuPwd +", stuId=" + stuId + "]";

}

  

}

  

  

  

StuInfoDao.java:

  

package com.siwuxie095.dao;

  

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

  

import com.siwuxie095.entity.StuInfo;

  

/**

*创建两个 DAO类:StuInfoDao.java和 StuPasswordDao.java

*

*同时二者也是接口类,其实现类为:

* StuInfoDaoImpl.java和 StuPasswordDaoImpl.java

*

*

* DAO即 Data Access Object,数据访问对象

*

*用来封装对数据库的访问,通过它可以把数据库中的表转化为DTO类

*

*

*接口定义完毕,需要编写接口相应的实现:

* StuInfoDaoImpl.java和 StuPasswordDaoImpl.java

*

*

*接口:定义实现类的外观,即实现类的行为,相当于一份契约,根据外部应用需要的功能

*约定了实现类要实现的功能,具体的实现类除了要实现约定的功能外,还可以根据需要,

*实现一些其他的功能

*

*接口是系统可插拔性的保证,即只要接口不变,内部实现的变化,都不会影响到外部的应用,

*使得系统更加灵活,具有更好的扩展性和维护性

*

* @author siwux

*

*/

public interface StuInfoDao {

 

publicvoid save(Connection conn,StuInfo stuInfo)throws SQLException;

publicvoid update(Connection conn,StuInfo stuInfo)throws SQLException;

publicvoid delete(Connection conn,StuInfo stuInfo)throws SQLException;

public ResultSet get(Connection conn,StuInfo stuInfo)throws SQLException;

 

}

  

  

  

StuPasswordDao.java:

  

package com.siwuxie095.dao;

  

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

  

import com.siwuxie095.entity.StuPassword;

  

  

  

public interface StuPasswordDao {

 

publicvoid save(Connection conn,StuPassword stuPassword)throws SQLException;

publicvoid update(Connection conn,StuPassword stuPassword) throws SQLException;

publicvoid delete(Connection conn,StuPassword stuPassword) throws SQLException;

//根据stuId和stuPwd获取用户信息,返回信息为ResultSet

public ResultSet get(Connection conn,StuPassword stuPassword)throws SQLException;

 

}

  

  

  

StuInfoDaoImpl.java:

  

package com.siwuxie095.dao.impl;

  

import java.sql.Connection;

import java.sql.SQLException;

  

import com.siwuxie095.dao.StuInfoDao;

import com.siwuxie095.entity.StuInfo;

  

import java.sql.PreparedStatement;

import java.sql.ResultSet;

  

  

public class StuInfoDaoImplimplements StuInfoDao {

  

/**

*保存用户信息

*/

@Override

publicvoid save(Connection conn, StuInfo stuInfo)throws SQLException {

//PreparedStatement是JDBC用来执行SQL查询语句的API之一

//它用来执行参数化的查询,其中问号 ? 是占位符

PreparedStatement ps=conn

.prepareStatement("insert into stu_info(stu_id,stu_name,stu_sex,"

+"stu_academic,stu_major) values(?,?,?,?,?)");

 

//注意:索引从 1 开始

//将参数传入的 StuInfo类的对象stuInfo中的相关信息保存到数据库表中

ps.setString(1, stuInfo.getStuId());

ps.setString(2, stuInfo.getStuName());

ps.setString(3, stuInfo.getStuSex());

ps.setString(4, stuInfo.getStuAcademic());

ps.setString(5, stuInfo.getStuMajor());

ps.execute();

}

 

/**

*根据指定的stuId更新用户信息

*/

@Override

publicvoid update(Connection conn, StuInfo stuInfo)throws SQLException {

String updateSql="update stu_info set stu_name=?,stu_sex=?,stu_academic=?,"

+"stu_major=? where stu_id=?";

PreparedStatement ps=conn.prepareStatement(updateSql);

ps.setString(1, stuInfo.getStuName());

ps.setString(2, stuInfo.getStuSex());

ps.setString(3, stuInfo.getStuAcademic());

ps.setString(4, stuInfo.getStuMajor());

ps.setString(5, stuInfo.getStuId());

ps.execute();

}

  

/**

*删除指定用户信息

*/

@Override

publicvoid delete(Connection conn, StuInfo StuInfo)throws SQLException {

PreparedStatement ps=conn.prepareStatement("delete from stu_info where stu_id=?");

ps.setString(1, StuInfo.getStuId());

ps.execute();

}

  

 

/**

*查询用户信息

*/

@Override

public ResultSet get(Connection conn, StuInfo stuInfo)throws SQLException {

PreparedStatement ps=conn.prepareStatement("select * from stu_info where stu_id=?");

ps.setString(1, stuInfo.getStuId());

return ps.executeQuery();

}

  

}

  

  

  

StuPasswordDaoImpl.java:

  

package com.siwuxie095.dao.impl;

  

import java.sql.Connection;

import java.sql.SQLException;

  

import com.siwuxie095.dao.StuPasswordDao;

import com.siwuxie095.entity.StuPassword;

  

import java.sql.PreparedStatement;

import java.sql.ResultSet;

  

  

public class StuPasswordDaoImplimplements StuPasswordDao {

  

publicvoid save(Connection conn, StuPassword stuPassword) throws SQLException {

String insertSql ="insert into stu_password(stu_id,stu_pwd) values(?,?)";

PreparedStatement ps = conn.prepareStatement(insertSql);

ps.setString(1, stuPassword.getStuId());

ps.setString(2, stuPassword.getStuPwd());

ps.execute();

}

  

@Override

publicvoid update(Connection conn, StuPassword stuPassword) throws SQLException {

String updateSql ="update stu_password set stu_pwd=? where stu_id=?";

PreparedStatement ps = conn.prepareStatement(updateSql);

ps.setString(1, stuPassword.getStuPwd());

ps.setString(2, stuPassword.getStuId());

ps.execute();

}

  

@Override

publicvoid delete(Connection conn, StuPassword stuPassword) throws SQLException {

String deleteSql ="delete from stu_password where stu_id=?";

PreparedStatement ps = conn.prepareStatement(deleteSql);

ps.setString(1, stuPassword.getStuId());

ps.execute();

}

  

/**

*查询用户信息

*/

@Override

public ResultSet get(Connection conn, StuPassword stuPassword)throws SQLException {

PreparedStatement ps = conn.prepareStatement("select * from stu_password where "

+"stu_id=? and stu_pwd=?");

ps.setString(1, stuPassword.getStuId());

ps.setString(2, stuPassword.getStuPwd());

return ps.executeQuery();//直接返回查询结果

}

  

}

  

  

  

DaoTest.java(主类):

  

package com.siwuxie095.test;

  

import java.sql.Connection;

  

import com.siwuxie095.dao.StuInfoDao;

import com.siwuxie095.dao.StuPasswordDao;

import com.siwuxie095.dao.impl.StuInfoDaoImpl;

import com.siwuxie095.dao.impl.StuPasswordDaoImpl;

import com.siwuxie095.entity.StuInfo;

import com.siwuxie095.entity.StuPassword;

import com.siwuxie095.util.ConnectionFactory;

  

public class DaoTest {

  

public staticvoid main(String[] args) {

 

Connection conn = null;

  

try {

 

//使用ConnectionFactory来获取一个数据库连接

conn = ConnectionFactory.getInstance().makeConnection();

 

conn.setAutoCommit(false);//关闭事务的自动提交

 

StuInfoDao stuInfoDao =new StuInfoDaoImpl();

StuInfo stuInfo =new StuInfo();

 

stuInfo.setStuId("006");

stuInfo.setStuName("小黑");

stuInfo.setStuSex("男");

stuInfo.setStuAcademic("环境学院");

stuInfo.setStuMajor("大气学");

 

stuInfoDao.save(conn, stuInfo);

 

 

StuPasswordDao stuPasswordDao=new StuPasswordDaoImpl();

StuPassword stuPassword=new StuPassword();

 

stuPassword.setStuId("006");

stuPassword.setStuPwd("006");

 

stuPasswordDao.save(conn, stuPassword);

 

conn.commit();

  

}catch (Exception e) {

System.out.println("=======捕获到SQL异常=======");

e.printStackTrace();

try {

conn.rollback();

System.out.println("=======事务回滚成功=======");

}catch (Exception e2) {

 

e2.printStackTrace();

 

}finally {

try {

if (conn!=null) {

conn.close();

}

}catch (Exception e3) {

e3.printStackTrace();

}

}

}

}

}

  

  

  

先创建一个连接工厂类:ConnectionFactory,用于连接数据库(单例)

  

  

再创建DTO抽象类:StuIdEntity,它的两个子类:StuInfo 和 StuPassword,

分别对应数据库的两张表:stu_info 和 stu_password

  

「DTO:对象与数据库表的绑定,用于转换数据」

  

  

然后创建DAO接口类:StuInfoDao 和 StuPasswordDao,定义实现类的行为:

执行 SQL 语句,实现类为:StuInfoDaoImpl 和 StuPasswordDaoImpl

  

「DAO:封装对数据库的访问,用于访问数据」

  

  

最后创建主类:DaoTest 进行测试

  

  

  

注意:高版本的JDBC 驱动需要指明是否进行 SSL 连接

  

  

即加上:?characterEncoding=utf8&useSSL=false

  

或:

  

  

即加上:?useUnicode=true&characterEncoding=utf-8&useSSL=false

  

  

  

总结 JDBC 编程流程:

  

(1)加载驱动:加载JDBC 驱动程序

  

(2)打开连接:打开一个数据库连接

  

(3)执行查询:创建一个会话对象,执行增删改查等操作

  

(4)处理结果:处理查询的结果

  

(5)清理环境:关闭会话,关闭连接等操作,完成资源的清理工作

  

  

  

  

转载:https://blog.csdn.net/siwuxie095/article/details/70140222
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较复杂的问题,我会尽我所能回答你。首先,我们需要明确程序的功能和需求,然后再根据需求选择相应的技术进行编写。在这个问题中,程序需要实现综合GUI编程技术、I/O流技术、多线程技术、网络编程技术以及JDBC技术,因此我们需要按照模块进行设计和编写。 下面是一个可能的程序设计: 1. GUI模块 GUI模块可以使用Java Swing或JavaFX进行编写,主要实现用户界面的设计和交互功能。在这个程序中,我们可以设计一个主界面,包括菜单栏、工具栏、状态栏等,用于用户操作和显示程序状态。此外,我们还可以设计一些子界面,如登录界面、设置界面、数据显示界面等,用于特定的功能和操作。GUI模块可以使用MVC(Model-View-Controller)模式进行设计,将数据模型、视图和控制器分离,使程序结构更清晰、可维护性更高。 2. I/O流模块 I/O流模块主要实现文件读写、网络传输等功能。在这个程序中,我们可以使用Java标准库中的I/O类和网络类,如FileInputStream、FileOutputStream、Socket、ServerSocket等。通过这些类,我们可以实现文件的读写、网络的连接和数据的传输。此外,我们还可以使用Java NIO(New I/O)库,提供更高效的非阻塞I/O操作。 3. 多线程模块 多线程模块可以提高程序的并发性和响应性,适用于需要同时处理多个任务的场景。在这个程序中,我们可以使用Java多线程技术,如Thread、Runnable、Executor等。通过这些类,我们可以实现多个线程并发执行任务,提高程序的运行效率。此外,我们还可以使用Java并发包(java.util.concurrent),提供更高级的线程池、锁、队列等数据结构,使程序更加健壮和安全。 4. 网络编程模块 网络编程模块主要实现网络通信功能,包括客户端和服务器端的交互。在这个程序中,我们可以使用Java网络编程技术,如Socket、ServerSocket、URLConnection等。通过这些类,我们可以实现客户端和服务器端之间的数据传输,包括文本、图片、音频等数据格式。此外,我们还可以使用Java RMI(Remote Method Invocation)技术,实现分布式计算和远程调用功能。 5. JDBC模块 JDBC模块主要实现与数据库的交互功能,包括数据的增删改查等操作。在这个程序中,我们可以使用Java JDBC技术,如Connection、Statement、ResultSet等。通过这些类,我们可以实现数据库的连接、数据的读写和查询等操作。此外,我们还可以使用Java ORM(Object-Relational Mapping)框架,如Hibernate、MyBatis等,实现更高级的数据库操作。 以上是一个可能的程序设计,具体实现细节还需要根据具体需求进行调整和优化。希望我的回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值