MYSQL-jdbc java与数据库的链接

jdbc 用于java与数据库链接

1、链接数据库

package cn.xk.demoa;

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

/**
 * @author 马晶
 * @since 2022-04-10
 */
public class DemoA {
    public static void main(String[] args) {
        // 声明数据库连接
        Connection connection = null;
        try {
            // 1.注册驱动类(只做一次)
            Class.forName("com.mysql.jdbc.Driver");
            /**
             * 2.连接连接
             * getConnection(String url,String user, String password);
             * url: 连接字符串 (用于表述 要连接那台计算机的数据库    )
             * user :数据库账号
             * password: 数据库密码
             * url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
             * jdbc: 协议 mysql:子协议
             * localhost:3306 主机端口
             */
            String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
            String user = "root";
            String passwodr = "root";
            // 通过DriverManager的getConnection 方法 获取数据的连接
            connection = DriverManager.getConnection(url, user, passwodr);
            /**
             * Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
             * */
            System.out.println("数据库连接成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 释放资源
                if (null != connection) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

2、executeUpdate(String sql); 用于执行 insert delete update SQL语句

案例演示

package cn.xk.demoa;

import java.sql.*;

/**
 * @author 马晶
 * @since 2022-04-10
 */
public class DemoB {
    public static void main(String[] args) {
        // 声明数据库连接
        Connection connection = null;
        // 声明数据库操作对象
        Statement statement =null;
//        PreparedStatement  prepareStatement=null;
        try {
            // 1.注册驱动类(只做一次)
            Class.forName("com.mysql.jdbc.Driver");
            /**
             * 2.连接连接
             * getConnection(String url,String user, String password);
             * url: 连接字符串 (用于表述 要连接那台计算机的数据库    )
             * user :数据库账号
             * password: 数据库密码
             * url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
             * jdbc: 协议 mysql:子协议
             * localhost:3306 主机端口
             */
            String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
            String user = "root";
            String passwodr = "root";
            // 通过DriverManager的getConnection 方法 获取数据的连接
            connection = DriverManager.getConnection(url, user, passwodr);
            /**
             * Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
             * */
            System.out.println("数据库连接成功");
            //3.获取数据库操作对象
            statement = connection.createStatement();
//            connection.prepareStatement(String sql);
            //4.执行SQL语句
            String sql = "UPDATE grade SET gradeName='一年级' WHERE gradeID =1";
//            String sql ="INSERT INTO `grade` ( `gradeName`) VALUES ('四年级');";
//            String sql = "delete from grade where gradeID=4";
            // executeUpdate(String sql); 用于执行  insert delete update SQL语句
           int row = statement.executeUpdate(sql);
            System.out.println(row==1?"成功":"失败");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 释放资源   正用到关
                if(null!=statement){
                    statement.close();
                }
                if (null != connection) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

3、executeQuery(sql)方法 执行 查询语句

package cn.xk.demoa;

import cn.xk.entity.Student;

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

/**
 * @author 马晶
 * @since 2022-04-10
 */
public class DemoC {
    public static void main(String[] args) {
        // 声明数据库连接
        Connection connection = null;
        // 声明数据库操作对象
        Statement statement = null;
        //  声明 查询返回的结果集
        ResultSet resultSet = null;
//        PreparedStatement  prepareStatement=null;
        // 声明集合 用于保存 学生集
        List<Student> studentList = new ArrayList<>();
        try {
            // 1.注册驱动类(只做一次)
            Class.forName("com.mysql.jdbc.Driver");
            /**
             * 2.连接连接
             * getConnection(String url,String user, String password);
             * url: 连接字符串 (用于表述 要连接那台计算机的数据库    )
             * user :数据库账号
             * password: 数据库密码
             * url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
             * jdbc: 协议 mysql:子协议
             * localhost:3306 主机端口
             */
            String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
            String user = "root";
            String passwodr = "root";
            // 通过DriverManager的getConnection 方法 获取数据的连接
            connection = DriverManager.getConnection(url, user, passwodr);
            /**
             * Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
             * */
            System.out.println("数据库连接成功");
            //3.获取数据库操作对象
            statement = connection.createStatement();
//            connection.prepareStatement(String sql);
            //4.执行SQL语句
            String sql = "select * from student";
            // 通过statement 的executeQuery(sql)方法 执行 查询语句
            // ResultSet 结果集
            resultSet = statement.executeQuery(sql);
            // 遍历结果集 行 和 列 组成的结果集

            // 1、通过next() 方法判断是否存在数据
            while (resultSet.next()) {
                Student student = new Student();
//                int stuNo = resultSet.getInt("studentNo");
                //通过下标获取 虚拟结果集中的值  注意 下标从1开始 2 3 4 ....
                int stuNo = resultSet.getInt(1);
                student.setStudentNo(stuNo);
                // 通过列名 获取值
                String stuName = resultSet.getString("studentName");
                student.setStudentName(stuName);
                student.setLoginPwd(resultSet.getString("loginPwd"));
                student.setSex(resultSet.getString("sex"));
                student.setGradeId(resultSet.getInt("gradeId"));
                student.setPhone(resultSet.getString("phone"));
                student.setAddress(resultSet.getString("address"));
                student.setBornDate(resultSet.getTimestamp("bornDate"));
                // 将对象保存到集合中
                studentList.add(student);
//                System.out.println("学生编号:" + stuNo);
//                System.out.println("学生姓名:" + stuName);
            }
            System.out.println("-----------------");
            for (Student student : studentList)
                System.out.println(student);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 释放资源   正用到关
                if (null != resultSet) {
                    resultSet.close();
                }
                if (null != statement) {
                    statement.close();
                }
                if (null != connection) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

4、事务控制的演示

package cn.xk.demoa;

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

/**
 * @author 马晶
 * @since 2022-04-10
 *
 *  事务控制
 *
 */
public class DemoD {
    public static void main(String[] args) {
        // 声明数据库连接
        Connection connection = null;
        // 声明数据库操作对象
        Statement statement =null;
//        PreparedStatement  prepareStatement=null;
        try {
            // 1.注册驱动类(只做一次)
            Class.forName("com.mysql.jdbc.Driver");
            /**
             * 2.连接连接
             * getConnection(String url,String user, String password);
             * url: 连接字符串 (用于表述 要连接那台计算机的数据库    )
             * user :数据库账号
             * password: 数据库密码
             * url: jdbc:mysql://localhost:3306/数据库名称?参数名:参数值
             * jdbc: 协议 mysql:子协议
             * localhost:3306 主机端口
             */
            String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
            String user = "root";
            String passwodr = "root";
            // 通过DriverManager的getConnection 方法 获取数据的连接
            connection = DriverManager.getConnection(url, user, passwodr);
            /**
             * Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
             * */
            System.out.println("数据库连接成功");
            // 开启事务处理  关闭自动事务
            connection.setAutoCommit(false);
            //3.获取数据库操作对象
            statement = connection.createStatement();

            //4.执行SQL语句
            String sql = "UPDATE grade SET gradeName='二年级' WHERE gradeID =2";
            int row = statement.executeUpdate(sql);
            System.out.println(row==1?"成功":"失败");
            // 事务回滚   不成立
//            connection.rollback();
            // 事务成立  提交事务
            connection.commit();
        } catch (Exception e) {
            try {
//                事务回滚   不成立
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                // 释放资源   正用到关
                if(null!=statement){
                    statement.close();
                }
                if (null != connection) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

5、避免SQL注入攻击 引入占位符对sql语句

package cn.xk.demoa;

import java.sql.*;
import java.util.WeakHashMap;

/**
 * @author 马晶
 * @since 2022-04-12
 */
public class DemoE {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet =null;
        try {
            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/myschool?userUnicod=true&characterEncoding=utf8";
            String user = "root";
            String passwodr = "root";
            // 通过DriverManager的getConnection 方法 获取数据的连接
            connection = DriverManager.getConnection(url, user, passwodr);
            /**
             * Connection 它代表数据库的连接,客户端与数据库所有的交互都是通过Connection对象来完成的
             * */
            System.out.println("数据库连接成功");

            // SQL 注入 注入攻击  ' or 1=1 --
            //? :占位符  表示将要有一个值 在这里
            String sql = "SELECT * FROM student WHERE studentNo = ? AND loginPwd = ?";

            //3.获取数据库操作对象  获取prepareStatement 对象 》》 对SQL语句进行预加载  避免:SQL注入攻击 等等
            preparedStatement = connection.prepareStatement(sql);
            //  处理占位符  为SQL中的占位符赋值set值得类型
//            preparedStatement.setString(1,"' or 1=1 -- ");
//            preparedStatement.setString(2,"123");
            preparedStatement.setObject(1,"10001");
            preparedStatement.setObject(2,"123");

            // 通过preparedStatement 执行 executeQuery方法 不需要传入SQL  因为prepareStatement 已经预加载了
            resultSet = preparedStatement.executeQuery();

            while (resultSet.next()){
//                System.out.println(resultSet.getInt(1)+":"+resultSet.getString(3));
                System.out.println(resultSet.getInt("studentNo")+":"+resultSet.getString("studentName"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if(null!= resultSet)
                    resultSet.close();
                if(null!= preparedStatement)
                    preparedStatement.close();
                if(null!= connection)
                    connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

1、对上述操作封装演示

package demoa;

import javax.xml.transform.Result;
import java.io.File;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BaseDao {
    //声明数据库链接
    Connection conn = null;
    //声明数据库操作对象
    PreparedStatement ps = null;
    //声明查询 时 返回的结果集
    ResultSet rs = null;
    static String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/myschool2?userUnicod=true&characterEncoding=utf8";
    String user = "root";
    String password = "root";

    static {
        try {
            //静态块,运行一次
            Class.forName(driver);//注册驱动类(只做一次)
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取链接的方法
    public Connection getConnection() throws SQLException {
        conn = DriverManager.getConnection(url, user, password);
        return conn;
    }

    //更新方法  用于执行 增加 删除  修改SQL语句
    public int executeUpdate(String sql, Object... objects) {
        int row = 0;
        try {
            conn = getConnection();//获取数据的链接
            conn.setAutoCommit(false);//开启事务 关闭自动事务
            //获取数据库操作对象
            ps = conn.prepareStatement(sql);
            //为 ? 占位符赋值
            if (objects != null) {
                for (int i = 0; i < objects.length; i++) {
                    // prepareStatement 为?占位符 赋值 下标从1开始
                    // Object... objects 下标从0开始
                    ps.setObject(i + 1, objects[i]);
                }
            }
            //执行sql语句 返回影响行数
            row = ps.executeUpdate();
            conn.commit();//提交事务
        } catch (SQLException e) {
            try {
                conn.rollback(); //回滚
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            try {
                //释放资源
                closeAll(conn, ps, null);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return row;
    }

    public List<Object> executeQuery(Class<?> clazz, String sql, Object... objects) {
        List<Object> list = null;
        try {
            getConnection();
            ps = conn.prepareStatement(sql);
            //为?占位符赋值
            if(objects!=null){
                for (int i = 0; i < objects.length; i++) {
                    ps.setObject(i+1,objects[i]);
                }
            }
            rs=ps.executeQuery();
            //处理放置到集合当中
            list=handler(rs, clazz);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                closeAll(conn,ps,rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return list;
    }
    public List<Object> handler (ResultSet rs,Class<?> clazz){
        List<Object> list = new ArrayList<>();
        Object object=null;
        try {
            while (rs.next()){
                //获取Class类对象
                object = clazz.newInstance();
                //获取结果集的数据源
                ResultSetMetaData rsMeta = rs.getMetaData();
                //获取结果集字段数
                int count = rsMeta.getColumnCount();
                //循环去字段的名字 以及值
                //将作为赋值给对应的实体对象的属性
                for (int i = 0; i < count; i++) {
                    String columnName = rsMeta.getColumnName(i+1);
                    // 利用反射 将结果集中的字段名 与 实体对象中的属性名 对应
                    // 由于对象的属性都是私有的 所以想要访问必须使用
                    Field field = object.getClass().getDeclaredField(columnName);
                    field.setAccessible(true);
                    Object obj = rs.getObject(columnName);
                    // 判断 当前是否为Long
                    if(obj instanceof Long){
                        //强制类型转化
                       obj= Integer.parseInt(obj.toString());
                    }
                    field.set(object,obj);
                }
                list.add(object);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        return list;
    }
    //释放资源的方法
    public void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) throws SQLException {
        if (null != conn) {
            conn.close();
        }
        if (null != ps) {
            ps.close();
        }
        if (null != rs) {
            rs.close();
        }
    }

}

2、测试类

package demoa;

import java.util.List;

public class DemoE {
    public static void main(String[] args) {
        //用于执行 insert delete update SQL语句
        BaseDao baseDao = new BaseDao();
      /*  String sql="UPDATE grade SET gradeName=? WHERE gradeID=? ";
        int row = baseDao.executeUpdate(sql, "三年级",3 );
        System.out.println(row == 1 ? "接收成功" : "接收失败");*/
        //用于执行查语句
        String sql = "SELECT * FROM student WHERE studentName LIKE ?";
        List<Object> objects = baseDao.executeQuery(Student.class, sql, "%李%");
        for (Object student : objects) {
            System.out.println((Student) student);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值