封装数据库工具类

本文主要演示如何封装数据库的工具类,通过MySQL中user表来进行。

一、先创建一个JAVA项目,要连接数据库必须导包,在项目中创建lib文件夹,把mysql-connector-java-5.1.22-bin.jar文件放入,右键-->build path,导包完成。在src目录下直接创建一个配置文件DBConfig.properties。

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbbj?useEncoding=true&characterEncoding=utf-8
username=root
password=123456
二、src目录下创建工具类包com.qf.utils,然后创建DBUtils.java文件。
package com.qf.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

public class DBUtils {
	private static String driverClass;
	private static String url;
	private static String username;
	private static String password;
	static {
		//获取配置文件内容,参数是配置文件的完整路径+文件名,src目录下,所以不用写路径
		ResourceBundle rb = ResourceBundle.getBundle("DBConfig");
		//调用getString方法通过key获取values
		driverClass=rb.getString("driverClass");
		url=rb.getString("url");
		username=rb.getString("username");
		password=rb.getString("password");
		//加载驱动
		try {
			Class.forName(driverClass);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//建立连接
	public static Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, username, password);
	}
	//关闭资源
	public static void closeAll(ResultSet rs,Statement stmt,Connection conn) {
		try {
			if(rs!=null) {
				rs.close();
			}
			if(stmt!=null) {
				stmt.close();
			}
			if(conn!=null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

三、在数据库中创建一个user表,包含id、username、password三列,加入一条数据(1,admin,123456),只为后续的演示要用。返回JAVA项目 ,src下创建com.qf.jdbc包,创建Demo01.java文件,主方法运行文件。

package com.qf.jdbc;

import java.util.Scanner;

import com.qf.bean.User;
import com.qf.db.DoLogin2;

public class Demo01 {
	public static void main(String[] args) {
		// 键盘录入用户名 和 密码 
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入用户名");
		String username = sc.nextLine();
		System.out.println("请输入密码");
		String password = sc.nextLine();
                //此时去创建User类(第四步),然后才能创建实体对象
                //封装对象
		User user = new User();
		user.setUsername(username);
		user.setPassword(password);
		//创建分层(第五步),具体要做的动作由该类实现
		//调用具体的业务处理层
		DoLogin login = new DoLogin();
		User user_back = login.findUser(user);
		if(user_back == null){
			System.out.println("登录失败");
		}else{
			System.out.println("登录成功 用户id 为"+user_back.getId());
		}
		sc.close();
	}
}
四、创建User类,在src下创建com.qf.bean包,创建User.java文件。
package com.qf.bean;

public class User {
	private int id;
	private String username;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
	
}
五、创建DoLogin
package com.qf.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.qf.bean.User;
import com.qf.utils.DBUtils;

//获取 Demo01 中的用户名 密码 连接数据库 进行查询
public class DoLogin {
	public User findUser(User user){
		User user_back = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			conn = DBUtils.getConnection();
			stmt = conn.createStatement();
			String sql = "select * from user where username='"+user.getUsername()+"' and password='"+user.getPassword()+"'";
			rs = stmt.executeQuery(sql);
			if(rs.next()){
				user_back = new User();
				user_back.setId(rs.getInt(1));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DBUtils.closeAll(rs, stmt, conn);
		}
		return user_back;
	}
}
        上述演示中,sql语句有安全隐患,当键盘输入为“ a' or '1'='1 ”这个时,也会提示登录成功,因为此时的sql语句为
select * from user where username='admin' and password='ddd' or '1'='1';

这个sql语句where后条件恒成立,所以一定会返回数据库的数据,这显然是不允许的。

        为此,需要使用另一个可以执行sql语句的类,PreparedStatement预编译,重写一个DoLogin类,然后在Demo01中改为调用该方法,就可以避免上述错误。

package com.qf.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.qf.bean.User;
import com.qf.utils.DBUtils;

public class DoLogin2 {
	public User findUser(User user){
		User user_back = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = DBUtils.getConnection();
			//创建PreparedStatement对象 封装sql 语句
			pstmt = conn.prepareStatement("select * from user where username=? and password=?");
			//给问号 赋值 参数索引从1开始
			pstmt.setString(1, user.getUsername());
			pstmt.setString(2, user.getPassword());
			
			//执行并返回结果集,调用方法无参数
			rs = pstmt.executeQuery();
			if(rs.next()){
				user_back = new User();
				user_back.setId(rs.getInt(1));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			DBUtils.closeAll(rs, pstmt, conn);
		}
		return user_back;
	}
}
附上使用PreparedStatement类,对数据库的增删改操作,创建Demo02文件。
package com.qf.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.junit.Test;

import com.qf.utils.DBUtils;

//使用PreparedStatement 完成 增删改操作
public class Demo_02 {

	//增加
	@Test
	public void testInsert(){
		try {
			Connection conn = DBUtils.getConnection();
			String sql = "insert into user(id,username,password) values(?,?,?)";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, 2);
			pstmt.setString(2, "张三");
			pstmt.setString(3, "321");
			int line = pstmt.executeUpdate();
			if(line>0){
				System.out.println("success");
			}else{
				System.out.println("error");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//修改
	@Test
	public void testUpdate(){
		try {
			Connection conn = DBUtils.getConnection();
			String sql = "update user set username=?,password=? where id=?";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "abc");
			pstmt.setString(2, "654");
			pstmt.setInt(3, 2);
			int line = pstmt.executeUpdate();
			if(line>0){
				System.out.println("success");
			}else{
				System.out.println("error");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//删除
	@Test
	public void testDelete(){
		try {
			Connection conn = DBUtils.getConnection();
			String sql = "delete from user where id=?";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, 2);
			int line = pstmt.executeUpdate();
			if(line>0){
				System.out.println("success");
			}else{
				System.out.println("error");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一种广泛应用的C++跨平台开发框架,它为开发人员提供了丰富的工具和类库来简化软件开发过程。Qt还提供了对数据库的支持,允许开发者使用数据库进行数据的存储和管理。为了进一步简化开发过程,我们可以封装一个数据库工具类数据库工具类的主要目的是封装数据库的操作,使其易于使用、可重用,并提供错误处理和异常处理机制。以下是一个可能的Qt数据库工具类的实现示例。 首先,我们需要一个类来代表数据库连接。我们可以创建一个名为Database的类,其中含连接数据库、断开数据库、执行查询等功能的成员函数。 其次,我们可以创建一个Table类,用于代表数据库中的表。Table类可以提供一些功能,如创建表、插入数据、更新数据、删除数据等。 我们还可以为每个表创建对应的模型类,用于与Qt的模型视图框架进行交互。模型类可以继承自Qt的QAbstractTableModel类,并实现一些必要的函数,如rowCount、columnCount、data等。这样,我们可以方便地将表中的数据展示在Qt的ListView或TableView等控件上。 在封装数据库工具类时,我们还可以考虑使用单例模式,确保整个应用程序中只有一个数据库实例存在。这样做可以避免重复创建数据库连接和占用过多资源。 总的来说,Qt数据库工具类封装可以大大简化数据库操作的编写过程,提高代码的可读性和可维护性。通过对数据库连接的封装,我们可以更方便地进行数据库操作,同时减少错误和异常处理的工作量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值