JDBC

今天整理一下JDBC

1.数据的状态
(1)瞬时状态:存放在内存中的数据,程序运行时存在,停止丢失
(2)持久状态:存放在硬盘中的数据,程序运行与否都存在
2.持久化:数据在瞬时状态和持久状态转换的机制
(1)技术
① jdbc
② IO流
③ xml
(2)框架
① mybatis
② Hibernate
③ JPA:是一个标准
④ EJB
⑤ Jfinal
3.jdbc:java的数据库链接,用java语言编写的用于链接各种数据库的API(应用进程编程接口),使用持久化框架的基础
4.数据链接池:就是程序运行时创建n个链接,提供给用户使用,减少频繁创建链接的资源消耗,特别是在web项目中。类似于10086
5.jdbc的层次结构
在这里插入图片描述
a.JDBC API 对java程序提供类和接口方便统一操作数据库
b.JDBC Driver Interface:驱动接口 专门对接各种数据库,不需要关注
6.常用类和接口
(1)类
①SQLException:编译时异常
②DriverManager:驱动管理,负责根据用户提供的数据库地址,用户名和密码完成数据库的链接
(2)接口
①Connection:代表是根据数据库的链接(会话)
②Statement:执行SQL语句的对象,而是SQL语句传递给数据库并获取结果(运输队长)
③ResultSet:结果集,存放SQL语句查询的结果,可能没数据,但是一定有列信息
④PreparedStatement:执行预编译的SQL语句,SQL语句中带有“ ?”
⑤CallableStatement:用于执行存储过程和函数的SQL语句
7.操作数据库的步骤(三个准备和七个步骤)
(1)三个准备
①数据库
1)注意编码格式 utf8
2)创建表(是否需要修改引擎),采用合理的表结构存放数据
②添加数据库的驱动jar文件到项目中,自己创建一个lib目录进行存放
③把jar文件添加到类路径中
(2)七个步骤
①生命数据库链接需要的参数
String driver = “com.mysql.jdbc.Driver”;
String url = “jdbc:mysql://localhost:3306/DataBase_Name?userUnicode=true&characterEncoding=utf8”;
String user = “root”;
String password = “pwd”;
②加载驱动类:通过名称找对应的类,需要处理ClassNotFoundException
Class.forName(driver);//反射
③根据用户提供参数获取数据库的链接,需要处理SQLException异常
Connection conn = DriverManager.getConnection(url,user,password);
④编写SQL语句,根据功能编写SQL语句
CRUD
insert、delete、update都属于修改操作,返回影响的行数
select 查询操作返回查询的结果
⑤创建一个执行SQL语句的对象(把SQL语句发送给数据库DBMS并获取结果)
⑥执行SQL语句并处理结果
如果是insert、delete、update获取影响的行数
如果是select获取的是ResultSet
⑦释放资源

ReadUtil

package com.neu.util;

import java.util.ResourceBundle;

public final class ReadUtil {
    //绑定名称为 db 的资源文件
    //jdk提供的用于读取 资源文件的工具
    //资源文件必须放在src的目录中
    private static ResourceBundle rb=ResourceBundle.getBundle("db");
    public static String getDriver(){
        String str=rb.getString("driver");
        return str;
    }

    public static String getUrl(){
        String str=rb.getString("url");
        return str;
    }

    public static String getUser(){
        String str=rb.getString("user");
        return str;
    }

    public static String getPassword(){
        String str=rb.getString("password");
        return str;
    }

    public static void main(String[] args) {
        System.out.println(getUser());
    }
}

DBUtil

package com.neu.util;

import java.sql.*;
//静态引入,可以引入类中 被static修饰的内容
import static com.neu.util.ReadUtil.*;
/**
 * 只负责进行数据库的链接和关闭
 */
public final class DBUtil {

    private static final String driver=getDriver();
    private static final String url=getUrl();
    private static final String user=getUser();
    private static final String password=getPassword();

    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            //把异常信息抛出
            throw new RuntimeException(e);
        }
    }

    private DBUtil(){
    }

    public static Connection getConnection() throws SQLException {
        Connection conn= DriverManager.getConnection(url,user,password);
        return conn;
    }

    public static void close(ResultSet rst, Statement stmt,Connection conn){
        if(rst!=null){
            try {
                rst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                rst=null;
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                stmt=null;
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                conn=null;
            }
        }
    }
}

BaseDao

package com.neu.dao;

import com.neu.util.DBUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class BaseDao {
    protected Connection conn;
    protected PreparedStatement stmt;
    protected ResultSet rst;

    protected final void close(){
        DBUtil.close(rst,stmt,conn);
    }

    protected final void getConnection() throws SQLException {
        conn=DBUtil.getConnection();
    }

    /**
     * @param sql
     * @param args
     * @return
     */
    protected final int executeUpdate(final String sql,String...args){
        int row=0;
        try {
            getConnection();
            stmt=conn.prepareStatement(sql);
            if(args!=null){
                for(int i=0;i<args.length;i++){
                    stmt.setString(i+1,args[i]);
                }
            }
            row=stmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally{
            close();
        }
        return row;
    }

    /**
     *
     * @param sql
     * @param args
     * @return
     */
    protected final List<Map<String,Object>> executeQuery(final String sql,String...args){
        List<Map<String,Object>> list=new ArrayList<>();
        try {
            getConnection();
            stmt=conn.prepareStatement(sql);
            if(args!=null){
                for(int i=0;i<args.length;i++){
                    stmt.setString(i+1,args[i]);
                }
            }
            rst=stmt.executeQuery();
            ResultSetMetaData data=rst.getMetaData();
            int n=data.getColumnCount();
            //存放查询的列名,不是真正的列名可能是别名
            String[] names=new String[n];
            for(int i=0;i<n;i++){
                names[i]=data.getColumnLabel(i+1);
            }
            while(rst.next()){
                Map<String,Object> map=new HashMap<>();
                for(int i=0;i<n;i++){
                    String key=names[i];
                    Object value=rst.getObject(key);
                    map.put(key,value);
                }
                list.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return list;
    }
}

把以上三段代码打包成jar包,以后做项目把jar包导入到项目中,每个DaoImpl继承BaseDao,数据库链接文件在property文件中配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看到代码就头秃的秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值