Java连接数据库-jbdc

Java连接数据库-jbdc

什么是jbdc

基本概念

在这里插入图片描述

关系图

在这里插入图片描述

操作步骤

在这里插入图片描述

jdbc 下载地址

jdbc驱动下载

bsq2

jdbc 使用步骤

获取连接器

在这里插入图片描述

项目中新建一个lib目录

在这里插入图片描述

设置lib 目录为库目录

让开放环境知道去哪里找相关文件
选中lib 目录右键它,选择 Add as Libary

在这里插入图片描述

注册驱动

在这里插入图片描述

获取连接对象

在这里插入图片描述

在这里插入图片描述

定义sql 语句和获取执行者

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

操作示例

在这里插入图片描述

实战编码



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

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/hpschool";
        Connection connection = DriverManager.getConnection(url, "root", "root");
        Statement statement = connection.createStatement();
        String sql = "INSERT INTO teacher VALUES(NULL,\"赵云\",\"龙胆\",\"2011-1-3\")";
        int i = statement.executeUpdate(sql);
        System.out.println(i);
    }
}

jdbc 操做详解

相关对象

在这里插入图片描述

注册驱动

在这里插入图片描述

获得连接对象

在这里插入图片描述

连接对象的常用方法

在这里插入图片描述

执行者对象的相关方法

在这里插入图片描述

演练

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查询结果集对象的使用

在这里插入图片描述

读取一行数据

在这里插入图片描述

读取所有行的数据

在这里插入图片描述

演练 查

在这里插入图片描述

import java.sql.*;

public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 获得连接对象
        String connStr = "jdbc:mysql://localhost:3306/db11070326";
        String user = "root";
        String pass = "root123";
        Connection conn = DriverManager.getConnection(connStr, user, pass);

        // 获取执行者
        Statement stmt = conn.createStatement();

        // 新建sql 语句
        String sql = "SELECT * FROM teacher;";

        ResultSet rs = stmt.executeQuery(sql);

        // 让指针往下走
        while(rs.next()){

            int id = rs.getInt("id");
            String name = rs.getString("name");
            String phone = rs.getString("phone");
            String skill = rs.getString("skill");

            String res = String.format("编号:%s,姓名:%s,电话:%s,专业:%s",id,name,phone,skill);
            System.out.println(res);

        }

        // 关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }
}


事务操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jbdc 工具类

分布代码

在这里插入图片描述

演练

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工具类编写

阶段一
方式一
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCUtils {
    public static Connection getConnection() {
        // 定义返回值
        Connection conn = null;

        try {
            // 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 准备数据,连接字符串,用户名,密码
            String connStr = "jdbc:mysql://localhost:3306/db11070326";
            String user = "root";
            String pass = "root123";
            // 获取连接对象
            conn = DriverManager.getConnection(connStr, user, pass);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

        // 返回连接对象
        return conn;
    }


}

方式二
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {
    public static Connection getConnection() throws IOException {
        // 获取双列集合
        Properties properties = new Properties();

        // 获得字符数据流对象
        FileReader fileReader = new FileReader("setting.properties");
        properties.load(fileReader);
        String connStr = properties.getProperty("url");
        String user = properties.getProperty("user");
        String pass = properties.getProperty("pass");
        
        // 关闭字符输入流对象
        fileReader.close();

        // 定义返回值
        Connection conn = null;

        try {
            // 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 准备数据,连接字符串,用户名,密码
            
            // 获取连接对象
            conn = DriverManager.getConnection(connStr, user, pass);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

        // 返回连接对象
        return conn;
    }


}

利用properties集合存数据
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class pro集合 {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();

        // 存值
        properties.setProperty("user","root");
        properties.setProperty("pass","root123");
        properties.setProperty("url","jdbc:mysql://localhost:3306/db11070326");

        // 定义个字符流
        FileWriter fileWriter = new FileWriter("setting.properties");

        //
        properties.store(fileWriter,null);
			properties. close();
    }
}

在这里插入图片描述

利用properties集合读数据
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

public class pro读数据 {
    public static void main(String[] args) throws IOException {
        // 实例化一个双列集合
        Properties properties = new Properties();

        // 字符输入流
        FileReader fileReader = new FileReader("setting.properties");

        // 加载数据
        properties.load(fileReader);

        String user = properties.getProperty("user");
        String pass = properties.getProperty("pass");
        String url = properties.getProperty("url");

        System.out.println(user+pass+url);

        fileReader.close();
    }
}

静态方法块

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

阶段二

快捷键:Ctrl + Ait +T

在这里插入图片描述

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {

    // 获取双列集合
    private static Properties properties = new Properties();

    static {

        try {
            // 获得字符数据流对象
            FileReader fileReader = new FileReader("setting.properties");
            properties.load(fileReader);

            // 关闭字符输入流对象
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection()  {


        // 定义返回值
        Connection conn = null;

        try {
            // 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 准备数据,连接字符串,用户名,密码
            String connStr = properties.getProperty("url");
            String user = properties.getProperty("user");
            String pass = properties.getProperty("pass");
            // 获取连接对象
            conn = DriverManager.getConnection(connStr, user, pass);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

        // 返回连接对象
        return conn;
    }


}

配置文件

#Thu Apr 07 16:14:58 CST 2022
pass=root123
user=root
url=jdbc\:mysql\://localhost\:3306/db11070326

安全执行者

安全问题 sql 注入

在这里插入图片描述
在这里插入图片描述

prepareStatement

在这里插入图片描述

模型

会出安全问题的代码

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

public class TestLogin {
    public static void main(String[] args) throws SQLException {
        // 扫描仪
        Scanner scanner = new Scanner(System.in);

        boolean isLosing = false;

        // 欢迎语句
        System.out.println("欢迎你");
        System.out.println("请输入用户名:");
        String user = scanner.next();
        System.out.println("请输入密码:");
        String pass = scanner.next();

        // 拿数据去查
        // 使用JDBC去查
        Connection conn = JDBCUtils.getConnection();

        // 获取执行者
        Statement stmt = conn.createStatement();
        String sql = String.format("SELECT * FROM `user` WHERE uname = '%s' AND pwd = '%s';", user, pass);
        ResultSet rs = stmt.executeQuery(sql);

        // 这里只做判断
        if (rs.next()) {
            System.out.println("登录成功");
            isLosing = true;
        } else {
            System.out.println("登录失败");
        }

        // 关闭资源
        JDBCUtils.close(conn, stmt, rs);

        Connection conn2 = JDBCUtils.getConnection();
        Statement stmt2 = conn2.createStatement();
        // 登录成功获取是失败
        if (isLosing){

            // 登录成功要做的事情
            sql = "SELECT s.name AS sname,s.gender,t.name AS tname,t.skill FROM student AS s INNER JOIN teacher AS t ON s.tid = t.id;";
            ResultSet rs2 = stmt2.executeQuery(sql);
            // 遍历
            while (rs2.next()){
                String sname = rs2.getString("sname");
                String gender = rs2.getString("gender");
                String tname = rs2.getString("tname");
                String skill = rs2.getString("skill");

                // 打印数据
                String con = String.format("姓名:%s,性别:%s,老师:%s,老师技能:%s",sname,gender,tname,skill);
                System.out.println(con);
            }
            // 关闭资源
            JDBCUtils.close(conn2, stmt2, rs2);
        }else {
            // 登录失败要做的事情
            System.out.println("获取失败");
        }





    }
}

修改后的代码

import java.sql.*;
import java.util.Scanner;

public class TestLogin {
    public static void main(String[] args) throws SQLException {
        // 扫描仪
        Scanner scanner = new Scanner(System.in);

        boolean isLosing = false;

        // 欢迎语句
        System.out.println("欢迎你");
        System.out.println("请输入用户名:");
        String user = scanner.next();
        System.out.println("请输入密码:");
        String pass = scanner.next();

        // 拿数据去查
        // 使用JDBC去查
        Connection conn = JDBCUtils.getConnection();

        // 获取执行者
        Statement stmt = conn.createStatement();
        // String sql = String.format("SELECT * FROM `user` WHERE uname = '%s' AND pwd = '%s';", user, pass);
        String sql = "SELECT * FROM `user` WHERE uname = ? AND pwd = ?";
        PreparedStatement ptmt = conn.prepareStatement(sql);
        // serString(?的下标,变量)
        ptmt.setString(1,user);
        ptmt.setString(2,pass);
        ResultSet rs = ptmt.executeQuery();

        // 这里只做判断
        if (rs.next()) {
            System.out.println("登录成功");
            isLosing = true;
        } else {
            System.out.println("登录失败");
        }

        // 关闭资源
        JDBCUtils.close(conn, stmt, rs);

        Connection conn2 = JDBCUtils.getConnection();
        Statement stmt2 = conn2.createStatement();
        // 登录成功获取是失败
        if (isLosing){

            // 登录成功要做的事情
            sql = "SELECT s.name AS sname,s.gender,t.name AS tname,t.skill FROM student AS s INNER JOIN teacher AS t ON s.tid = t.id;";
            ResultSet rs2 = stmt2.executeQuery(sql);
            // 遍历
            while (rs2.next()){
                String sname = rs2.getString("sname");
                String gender = rs2.getString("gender");
                String tname = rs2.getString("tname");
                String skill = rs2.getString("skill");

                // 打印数据
                String con = String.format("姓名:%s,性别:%s,老师:%s,老师技能:%s",sname,gender,tname,skill);
                System.out.println(con);
            }
            // 关闭资源
            JDBCUtils.close(conn2, stmt2, rs2);
        }else {
            // 登录失败要做的事情
            System.out.println("获取失败");
        }





    }
}

数据为连接池

模型

在这里插入图片描述

概念

在这里插入图片描述

DataSource 连接

具体操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实际演练

1 导包
在这里插入图片描述
2 配置文件
注意修改数据库和用户名密码
在这里插入图片描述
在这里插入图片描述
3 代码编写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
显示这个就成功了
在这里插入图片描述
这里把 ComboPooledDataSource 修改成 DataSource
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用自定义配置

在这里插入图片描述
在这里插入图片描述

Druid 数据库连接池技术

在这里插入图片描述
druid.properties 配置如下
在这里插入图片描述
在这里插入图片描述

实际操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

JDBC Template

在这里插入图片描述
在这里插入图片描述

JDBC Template入门

增删改

在这里插入图片描述
先导包在这里插入图片描述
减压
在这里插入图片描述
lib 目录要自己创建,前面有具体操作
在这里插入图片描述
如果识别成功前面会有小箭头,没有就重启软件

修改我们额工具类 添加一个获取数据源 getDataSource



import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    // 连接池
    private static DataSource ds = null;

    // 获取双列集合
    private static Properties properties = new Properties();

    static {
        Properties pro = new Properties();
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            pro.load(is);
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static Connection getConnection()  {


        // 定义返回值
        Connection conn = null;

        try {
            conn = ds.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }


        // 返回连接对象
        return conn;
    }

    // 获取数据源
    public static DataSource getDs(){
        return ds;
    }

    // 关闭连接对象
    public static void close(Connection conn){
        // 判断连接对象是否为空
        if (conn == null){
            return;
        }

        try {
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    // 关闭连接对象和执行者
    public static void close(Connection conn, Statement stmt){

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        close(conn);

    }

    // 关闭连接对象和执行者
    public static void close(Connection conn, Statement stmt, ResultSet rs){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        close(conn,stmt);

    }
}

使用效果
首先获得JDBCTemplate 的对象 括号里放一个数据源 ds(DataSource)

在这里插入图片描述
相比之前的操作少了好多代码

在这里插入图片描述

查操作

接下来是查操作
现在用安全执行者,查询的很麻烦
在这里插入图片描述

单个数据

实际操作

在这里插入图片描述

package D3;

import org.springframework.jdbc.core.JdbcTemplate;

import java.util.Map;

public class TestCHa {
    public static void main(String[] args) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
        String sql = "SELECT * FROM teacher WHERE id = ?";
        int n = 2;

        // 掉查询方法
        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql, n);

        System.out.println(stringObjectMap);

        Object id = stringObjectMap.get("id");
        System.out.println(id);

    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
多个数据就是 数组包列表

多个数据

在这里插入图片描述

效果

在这里插入图片描述

package D3;

import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;

public class TestCHa {
    public static void main(String[] args) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
        String sql = "SELECT * FROM teacher WHERE id > ?";
        int n = 0;

        // 掉查询方法
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, n);

        System.out.println(maps);

    }
}

获取集合中单个数据

在这里插入图片描述

关于Java bean

在这里插入图片描述

在这里插入图片描述
具体代码如下
注意:要提供类,类如下
类要提供属性封装、提供共有方法、提供构造方法和提供字符串显示输出

package D3;

public class Teacher {
    // 属性的封装
    private int id;
    private String name;
    private String phone;
    private String skill;

    public Teacher() {
    }

    public Teacher(int id, String name, String phone, String skill) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.skill = skill;
    }

    // 提供字符串显示

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }


    // 提供共有方法

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}

演练代码:

package D3;

import Zuoye02.JDBCUtils;

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

public class Test {
    public static void main(String[] args) {
        // 注意要修改数据库

        // 欢迎语句
        System.out.println("你好");

        // 获取连接对象
        Connection conn = Zuoye02.JDBCUtils.getConnection();
        // 定义sql 语句
        String sql = "SELECT * FROM teacher;";

        // 定义一个单列集合存放数据
        ArrayList<Teacher> teacherArrayList = new ArrayList<>();

        // 获取执行者
        try {
            System.out.println(conn);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String phone = rs.getString("phone");
                String skill = rs.getString("skill");


                Teacher teacher = new Teacher(id,name,phone,skill);
                teacherArrayList.add(teacher);
            }

            System.out.println(teacherArrayList.size());

            // 关闭连接对象
            JDBCUtils.close(conn,stmt,rs);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }



    }
}

在这里插入图片描述

JDBC 使用 Java Bean

在这里插入图片描述
在这里插入图片描述
先定义一个规则,然后利用这个规则查询

首先要有一个 类

public class Teacher {
    // 属性的封装
    private int id;
    private String name;
    private String phone;
    private String skill;

    public Teacher() {
    }

    public Teacher(int id, String name, String phone, String skill) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.skill = skill;
    }

    // 提供字符串显示

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }

    // 显示输出
    public void showInfo(){
        System.out.println(id+"\t"+name+"\t"+phone+"\t"+skill);
    }


    // 提供共有方法

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}

在定义一个规则

dingyi

import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

public class TeacherRowMapper implements RowMapper<Teacher> {
    @Override
    public Teacher mapRow(ResultSet resultSet, int i) throws SQLException {
        // 获取当前行的数据
        int id = resultSet.getInt("id");
        String name = resultSet.getString("name");
        String phone = resultSet.getString("phone");
        String skill = resultSet.getString("skill");

        // 实例化一个老师对象
        Teacher teacher = new Teacher();
        teacher.setId(id);
        teacher.setName(name);
        teacher.setPhone(phone);
        teacher.setSkill(skill);


        return teacher;
    }
}

测试

效果
在这里插入图片描述

import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        // 目标,得到对象集合

        // 得到对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());

        // 定义一个sql语句,查询所有
        String sql = "select * from teacher;";

        // 获取一个对象 关系映射对象
        TeacherRowMapper teacherRowMapper = new TeacherRowMapper();

        // 开始查询
        List<Teacher> teacherList = jdbcTemplate.query(sql, teacherRowMapper);

        System.out.println(teacherList);
        // [老师对象1,老师对象n]

        // 获取第0号数据
        Teacher t_zly = teacherList.get(0);
        t_zly.showInfo();

    }
}

简洁版本如下:

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class Test02 {
    public static void main(String[] args) {
        // 获得 jt
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());

        // SQL
        String sql = "select * from teacher";

        // 查询
        List<Teacher> teacherList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Teacher>(Teacher.class));

        System.out.println(teacherList);

    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

查询,总计录数

用户聚合函数的查询
在这里插入图片描述
在这里插入图片描述

import org.springframework.jdbc.core.JdbcTemplate;

public class TestShuJu {
    public static void main(String[] args) {
        // 获得 jt
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());

        // SQL
        String sql = "select count(1) from teacher";

        Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);

        System.out.println("一共有多少个老师:"+integer);
    }
}

小结

在这里插入图片描述
在这里插入图片描述

步骤1

在这里插入图片描述

import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

public class TeacherRowMapper implements RowMapper<Teacher> {
    @Override
    public Teacher mapRow(ResultSet resultSet, int i) throws SQLException {
        // 获取当前行的数据
        int id = resultSet.getInt("id");
        String name = resultSet.getString("name");
        String phone = resultSet.getString("phone");
        String skill = resultSet.getString("skill");

        // 实例化一个老师对象
        Teacher teacher = new Teacher();
        teacher.setId(id);
        teacher.setName(name);
        teacher.setPhone(phone);
        teacher.setSkill(skill);


        return teacher;
    }
}

在这里插入图片描述

自义定映射对象

步骤2

示例

在这里插入图片描述
查询的结果是对象集合

利用系统提供的自动映射对象

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SSOA6

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

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

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

打赏作者

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

抵扣说明:

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

余额充值