连接JDBC

 

    1)JDBC简介

        - JDBC就是Java中连接数据库方式

        - 我们可以通过JDBC来执行SQL语句。

 

    2)获取数据库连接

        - java.sql.Connection 数据库连接

        - 我们队数据库的一切操作都是从获取Connection开始

        - 获取数据库连接的四个参数:

            1.数据库的地址 url

                语法:jdbc:子协议:厂商内容

                MySQl的格式:jdbc:mysql://主机名:端口号/数据库名字

                例子:jdbc:mysql://localhost:3306/test

 

            2.用户名 user 连接数据库使用的用户名

            3.密码 password 数据库的密码

            4.数据库驱动全类名 driverClass

 

        - 基本步骤:

            1.导入数据库驱动的jar包

                mysql-connector-java-5.1.37-bin.jar

            2.准备四个参数

                - url

                - user

                - password

                - driverClass

            3.加载数据库驱动

                Class.forName(driverClass)

            4.通过DriverManager来获取数据库连接   

                static Connection getConnection(String url, String user, String password)           

 

        - 核心类:

            - java.sql.DriverManager

                - 数据库驱动的管理器,负责加载数据库的驱动获取数据库连接

                - static Connection getConnection(String url, String user, String password) 

                    - getConnection方法用来通过url地址,用户名,密码等参数来获取数据库连接的

 

            - java.sql.Connection

                - 数据库连接

                - Statement createStatement() 

                    - 创建一个Statement对象,通过Statement对象来执行SQL语句

 

            - java.sql.Statement

                - SQL语句的执行器

                    - boolean execute(String sql) 

                        - 执行一条SQL语句,并返回一个布尔值,执行成功返回true,执行失败返回false。用的不多

                    - ResultSet executeQuery(String sql) 

                        - 执行查询的SQL语句,并返回一个结果集

                    - int executeUpdate(String sql) 

                        - 执行修改数据的SQL语句(增删改),并返回受影响的行数

 

            - java.sql.ResultSet

                - 查询到的数据的结果集,我们通过JDBC查询数据库获得的数据,都封装在ResultSet中

                - boolean next() 

                    - 控制光标向下移动一行,如果光标当前位置是afterLast则返回false,告诉你没数据了,就别读了。

                        如果光标移动以后,没有在afterLast则返回true,可以读取数据。

 

                - 在ResultSet有很多getXxx(int),比如getString(),getInt(),getByte()。

                    通过这些方法可以读取当前行的数据,它们需要一个int值作为参数,

                        int指的是读取数据的列数。

                    列数是从1开始的。

 

                - 在ResultSet中还有很多getXxx(String),它和上边的方法的作用一致,

                    只不过它们需要的都是String类型的参数,参数代表的是当前的列名,

                        比如:我们要获取id的值

                            getInt("id")

                        要获取name的值

                            getString("name")

                    注意:如果查询的SQL使用了别名,则列名以别名为准。

 

    3)数据的增删改

        //创建一个SQL执行器

        Statement stat = conn.createStatement();

 

        //创建一个SQL语句

        String sql = "INSERT INTO t_stu(`name` , age) VALUES('沙僧',28)";

 

        //执行SQL语句

        //executeUpdate用来执行一条修改SQL的语句

 

        //它需要一个String类型sql作为参数,并会返回一个int型的值,该值表示SQL语句执行以后影响到的行数

        int count = stat.executeUpdate(sql);

 

    4)数据的查询

        //创建Statement对象

        Statement stmt = conn.createStatement();

        //创建一个SQL语句

        String sql = "SELECT id, name sname, age FROM t_stu WHERE id=2";

        //执行查询

        ResultSet rs = stmt.executeQuery(sql);

        //控制光标下移一行

        //如果当前行有数据,则读取

        if(rs.next()){

 

            //获取id,name,age

            int id = rs.getInt("id");

            String name = rs.getString("sname");

            int age = rs.getInt("age");

 

            System.out.println(id+"--"+name+"--"+age);

        }

 

        > 查询操作和修改的主要不同的是,查询使用executeQuery(),

            它会返回ResultSet结果集,我们需要对结果集进行读取。

 

        > 当我们只需要读取一个数据时,用if。

            当需要读取全部数据时,用while

 

        > 代码的规范:

            - Connection、Statement、ResultSet,这些资源都是需要和数据建立连接的

                这些资源我们并不是总需要使用,当我们不适用这些资源,需要将这些资源关闭。

            - 关闭资源顺序:

                从后往前关:

                    先关 ResultSet

                    在关 Statement

                    最后关 Connection

            - 示例代码:

                //定义三个变量

                Connection conn = null;

                Statement stmt = null;

                ResultSet rs = null;

 

                try{

 

                }catch(Exception e){

                    e.printStackTrace();

                }finally{

 

                    if(rs!=null){

                        //关闭ResulSet

                        try {

                            rs.close();

                        } catch (SQLException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                        }

                    }

 

                    if(stmt != null){

                        try {

                            stmt.close();

                        } catch (SQLException e) {

                            e.printStackTrace();

                        }

                    }

 

                    if(conn != null){

                        try {

                            conn.close();

                        } catch (SQLException e) {

                            e.printStackTrace();

                        }

                    }

 

                }

 

DAO(Data Access Object) 数据访问对象:

    在Java中使用DAO类,来去和数据库交互,而其他类不再需要编写JDBC相关的代码,

        而是直接调用DAO。

    在实际上开发中,我们所有的JDBC相关的代码都应该写在DAO中,

        java.sql这个包下的内容不应该出现在DAO以外的地方

 

    t_user

 

        CREATE TABLE t_user(

            id INT PRIMARY KEY AUTO_INCREMENT,

            username VARCHAR(100),

            `password` VARCHAR(100),

            email VARCHAR(100),

            nickname VARCHAR(50)

        )

 

    创建UserDao(负责User对象和数据库相关的操作)   

 

        User getUserByUsername(String username) --> 根据用户查找用户

 

        int saveUser(User user); --> 将用户对象插入进数据库

 

        User getUserByUsernameAndPassword(String username , String password) --> 根据用户名和密码查找用户

 

    登录:

        登录实际上就是这么一条SQL语句:

            SELECT * FROM t_user WHERE username='' AND password=''