原始JDBC连接与封装后的JDBC

JDBC连接数据库

操作步骤:
准备jar包mysql-connector-java-5.1.0-bin.jar

  • 加载驱动Class.forName(“com.mysql.jdbc.Driver”);
  • 使用DriverManager获取数据库connection连接
  • 创建Statement对象 用于执行SQL语句
  • 执行SQL语句
  • 释放资源
1.jdbc连接数据库步骤

实现jdbc连接mysql,查询输出learn库下department的数据

Connection conn=null;
Statement stat=null;
ResultSet rs = null;
try {
    //				加载 驱动(方言)
    Class.forName("com.mysql.jdbc.Driver");
    //				数据库端口号默认为3306可以在数据库名后加~保证编码格式和时区
    //				?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
    String url="jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
    String uname="root";
    String upwd="bai123456";
    //				根据路径,用户名,密码获取connection连接
    conn=DriverManager.getConnection(url,uname,upwd);
    //				创建statement对象执行sql语句
    String sql="select * from department";
    stat = conn.createStatement();
    //				executQuery返回一个set结果集,execute返回一个bool,执行成功返回false,失败返回true,executUpdate返回一个int,受影响行数
    rs = stat.executeQuery(sql);
    while(rs.next()) {
        System.out.println("部门id:\t"+rs.getLong(1));
        System.out.println("部门名称:\t"+rs.getString("dName"));
    }
} catch (Exception e) {
    e.printStackTrace();
}finally {
    try {
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

2.PreparedStatement避免sql注入

使用PreparedStatement可以避免sql注入。(使用占位符?代替字符串拼接)字符串拼接可以利用sql注释来避免输入密码,安全系数很低。

public static void main(String[] args) {
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url="jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
			String uname="root";
			String upwd="bai123456";
			conn=DriverManager.getConnection(url,uname,upwd);
//			?为占位符,先对sql进行预编译,再对占位符注入值
			String sql="select * from department where did=? AND dName=?";		
			ps=conn.prepareStatement(sql);
//			第一个参数为位置,从1开始,第二个为注入值
			ps.setLong(1,2);
			ps.setString(2, "研发部");
			ResultSet rs = ps.executeQuery();
			while(rs.next()) {
				System.out.println("部门id:\t"+rs.getLong("did"));
				System.out.println("部门名称:\t"+rs.getString("dName"));
			}
					
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

封装JDBC

为什么封装jdbc?

普通的jdbc连接可读性差,不利于代码后期修改,复用性差,所以我们尝试_将数据库连接打开关闭封装成一个工具类,定义实体类传输数据,数据的增删改查定义为接口_来优化数据库连接。

什么是Dao层?

DAO(Date Access Object)起着转换器的作用,将数据在实体类和数据库记录之间进行转换,实现对持久化数据的访问。DAO层包含entiy包(实体类user),Dao接口(userDao),Dao实现类(userDaoImpl),工具类(负责数据库连接打开关闭)。
![image.png](https://img-blog.csdnimg.cn/img_convert/736512185d9a91c476aa4a0fc160065a.png#clientId=u4d911c19-0c68-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=163&id=u3c3f97cc&margin=[object Object]&name=image.png&originHeight=254&originWidth=1139&originalType=binary&ratio=1&rotation=0&showTitle=false&size=49414&status=done&style=none&taskId=u42f2d231-de79-4c21-996b-233446c3474&title=&width=728.96)

封装Jdbc

将开启数据库连接封装为方法getConn(),查询数据库为方法executQuery(String sql,Object objs[]),查询数据库信息方法exectueSql(String sql,Object objs[]),关闭数据库连接closeResourse()

package dao.pojo;

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

public class BaseDao {
	Connection conn=null;
	PreparedStatement ps=null;
	
	/**
	 * 开启jdbc连接
	 * @return 成功返回true,失败返回false
	 */
	public boolean getConn() {
		boolean bool=false;		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url="jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
			String username="root";
			String userpwd="bai123456";
			conn=DriverManager.getConnection(url,username,userpwd);
			bool=true;
			
		} catch (Exception e) {
			bool=false;   //未正常启动连接
			e.printStackTrace();
		}	
		 return bool;
	}
	
	/**
	 * 将对象的值注入到数据库(增删改)
	 * @param sql语句string
	 * @param obj存储改变数据库的对象
	 * @return 返回受影响行数
	 */
	public int exectuQuery(String sql,Object objs[]) {
		int res=0;   //0行为操作失败
		if(getConn()) {
			try {
				ps=conn.prepareStatement(sql);
				if(objs!=null) {
					for(int i=0;i<objs.length;i++) {
						ps.setObject(i+1,objs[i]);
					}
				}
				res=ps.executeUpdate();	
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return res;
	}
	/**
	 * 查询数据库内容
	 * @param sql
	 * @param objs
	 * @return 查询结果(以集合set返回)
	 */
	public ResultSet exectueSql(String sql,Object objs[]) {
		ResultSet rs=null;
		if(getConn()) {
			try {
			if(objs!=null) {
				for(int i=0;i<objs.length;i++) {				
						ps.setObject(i+1, objs[i]);
					} 
				}
			rs=ps.executeQuery();
			}catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return rs;
	}
	/**
	 * 关闭资源
	 */
	public void closeResourse() {
		try {
			if(ps!=null) {
				ps.close();
			}
			if(conn!=null) {
				conn.close();
			}
		} catch (Exception e) {	
			e.printStackTrace();
		}	
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值