JDBC

JDBC

​ jdbc是一个规范(一套接口),jdbc指的就是java数据库连接。

JDBC

​ 从两个角度:数据库厂家和开发人员,作为开发人员,可能会连接到很多种不同的数据库,根据业务不同,可能连接到Mysql、SqlServer,但是我们不需要关注数据库具体的实现类,我们关注的是jdbc这样的一套接口,因为这个接口提供了具体获取数据库对象的方法,还有相关执行增删改查的方法,还有相关事务提交、事务处理的方法,我们只需要关注接口中有哪些方法,方法具体的实现交由数据库的厂家去完成。

JDBC编程六步:

​ 使用try catch 语句块捕获异常,先设置对象为null

onnection connection =null;
Statement statement =null;
ResultSet resultSet =null;

1、注册驱动

//第一种方式 创建driver对象,加载数据库驱动
//Driver driver =new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

//第二种方式,通过Class把类先装载到java的虚拟机中,并没有创建Driver类的实例,加载数据库驱动,反射中的技术会使得类加载
//这样会避免重复的创建Driver实例
Class.forName("com.mysql.cj.jdbc.Driver");

//新版jdk mysql驱动com.mysql.cj.jdbc.Driver
//旧版 则是com.mysql.jdbc.Driver

注册驱动两种方式的比较:

  • 使用第一种方式,创建Driver对象加载数据库驱动,通过Driver类的源码可以看到,其内部是有一个静态代码块的,静态代码块内部也创建了一个Driver实例,这样就会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

    DriverManager.registerDriver(new Driver());
    

2、获取数据库连接对象

String url="jdbc:mysql://localhost:3306/databasename?serverTimezone=GMT";

String user = "root";
String password="password";

connection = DriverManager.getConnection(url, user, password);

3、获取数据库对象

//获取数据库对象,创建createStatement对象
statement=connection.createStatement();

4、编写sql、执行sql

String sql="select * from emp";
resultSet = statement.executeQuery(sql);

5、返回记录条数、获取结果集对象

//执行的查询操作,返回结果集,执行增删改 返回记录条数
//5、获取结果集对象 遍历结果集
 while (resultSet.next())
 {
     int empno = resultSet.getInt("EMPNO");
     String ename = resultSet.getString("ENAME");
     System.out.println("员工编号为"+empno+"员工姓名为"+ename);
 }

6、关闭资源

​ 关闭顺序:结果集对象、数据库操作对象、数据库连接对象

//资源的关闭放在finally语句块中,因为必须要执行资源的关闭
finally {
    //6、关闭资源

    //关闭结果集resultSet
    if (resultSet!=null) {
        try {
            resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //关闭statement
    if (statement!=null) {
        try {
            statement.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //关闭connection
    if (connection!=null) {
        try {
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

案例

  1. 向一个新建的user表中添加10条数据(username、password uid设置为自增)
public class JDBCCase {

    public static void main(String[] args) {
        Connection connection =null;
        Statement statement =null;
        try {

            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=GMT&characterEncoding=utf-8", "root", "123456");
            statement = connection.createStatement();
            String[] strings={
                    "insert into user(username,password) values ('张三1',1231)",
                    "insert into user(username,password) values ('张三2',1232)",
                    "insert into user(username,password) values ('张三3',1233)",
                    "insert into user(username,password) values ('张三4',1234)",
                    "insert into user(username,password) values ('张三5',1235)",
                    "insert into user(username,password) values ('张三6',1236)",
                    "insert into user(username,password) values ('张三7',1237)",
                    "insert into user(username,password) values ('张三8',1238)",
                    "insert into user(username,password) values ('张三9',1239)",
                    "insert into user(username,password) values ('张三10',12310)"
            };
            for (String string : strings) {
                int i = statement.executeUpdate(string);
                if (i==1)
                {
                    System.out.println("添加成功");
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (statement!=null) {
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (connection!=null) {
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }


    }

}
  1. 模拟登录情形,控制台输入用户名和密码,查询数据库,打印登录成功或者失败
public class Login {

    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet =null;
        try {

            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=GMT&characterEncoding=utf-8", "root", "123456");
            statement = connection.createStatement();

            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String s1=scanner.next();
            System.out.println("请输入密码:");
            String s2=scanner.next();
            String sql=null;
            sql=String.format("select password from user where username='%s'",s1);

            //或者直接  "select password from user where username='"+s1+"'"


            resultSet = statement.executeQuery(sql);

            //resultSet!=null 这句话保证确实执行了sql 否则如果resultSet==null
            // 而又resultSet.next() 那么空指针异常
            //resultSet.next()才是判断 结果集resultSet中是否有数据
            if ( resultSet!=null && resultSet.next()==false )
                System.out.println("用户名错误!");
            else {
                while (resultSet.next())
                {
                String password=resultSet.getString("password");
                System.out.println(password);
                if (s2.equals(password))
                    System.out.println("登录成功!");
                else System.out.println("登录失败!");
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (resultSet!=null) {
                try {
                    resultSet.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }

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

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

上述案例做校验是通过输入的user查询password,如果与输入的密码匹配则登录成功。

在Web项目里大都是查询出所有结果,创建集合返回给前端(ArrayList、HashMap)。

String sql="select * from user";
resultSet=statement.executeQuery(sql);
List<User> userList=new ArrayList<>();

if (resultSet!=null)
{
    while(resultSet.next())
    {
        int uid = resultSet.getInt("uid");
        String username = resultSet.getString("username");
        String password = resultSet.getString("password");

        User user=new User(uid,username,password);
        userList.add(user);
    }
}
上一篇:PreparedStatement 大数据查询


下一篇:JDBC