JDBC基础学习笔记

千里之行,始于足下

 


正文

JDBC是允许便捷式访问底层数据库的应用程序接口,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。

 

1、注册驱动:

//反射机制
Class.forName("com.mysql.jdbc.Driver");

2、获取连接:

//可使用.properties配置文件来声明URL, USERNAME, PASSWORD
Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);

3、获取预编译数据库操作对象:

// Statement ps = con.createStatement();
String sql = "sql语句";
PreparedStatement ps =  con.prepareStatement(sql);

4、执行SQL:

ResultSet rs = ps.executeUpdate();

5、处理结果集

6、释放资源:(顺序执行)

rs.close();
ps.close();
con.close();

 

1、PreparedStatement对象所代表的SQL语句中的参数用问号(?)来表示,执行效率高,能够避免sql注入,更安全。

2、Statement对象所代表的SQL语句中的参数不使用占位符表示,执行效率低,有sql注入的风险,缺乏安全性。

 

1、SQL注入现象:

用户输入信息含有SQL语句的关键字,并且参与了sql的编译过程,导致sql语句原意扭曲。

2、解决办法:

采用PrepareStatement对sql语句框架进行预编译,再传值。

 

相关资料 密码:007j

1、调用工具类:

复制代码
//JDBC工具库

import java.sql.*;
// JdbcUtil obj = new JdbcUtil();  obj.getCon()
// JdbcUtil obj = new JdbcUtil();  obj.createStatement();
// JdbcUtil.getCon();
public class JdbcUtil {
    //final String URL="jdbc:mysql://localhost:3306/数据库名";
    final String URL="jdbc:mysql://localhost:3306/student";
    final String USERNAME="root";
    //final String PASSWORD="密码";
    final String PASSWORD="123456";
    PreparedStatement ps= null;
    Connection con = null;

    //注册驱动:将jar包中driver实现类加载到JVM中
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取连接:封装连接通道创建细节
    public  Connection   getCon(){

        try {
            con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    //获取预编译数据库操作对象:封装交通工具创建细节(预编译)
    public  PreparedStatement createStatement(String sql){

        try {
            ps =  getCon().prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ps;
    }
    //释放资源:ps与con销毁细节 insert,update,delete
    public  void close(){
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    //select: ps,con,rs
    public  void close(ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        close();
    }
}
复制代码

2、业务逻辑层:

复制代码
   //JDBC封装库
    private JdbcUtil util = new JdbcUtil();

    @Override
    //用户注册(SqlName:实体类)
    public int add(SqlName sqlName) {
        String sql = "insert into users(userName,pword)" + " values(?,?)";
        //预编译
        PreparedStatement ps = util.createStatement(sql);
        int result = 0;
        try {
            //获取参数
            ps.setString(1, sqlName.getUserName());
            ps.setString(2, sqlName.getPword());
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            util.close();
        }
        return result;
    }
复制代码

 

 

 

posted on   爱文(Iven)  阅读(57)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示

目录导航