JDBC笔记

为什么要使用JDBC?

JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范。
java语言操作数据库的一种技术(规范)
JDBC与数据库驱动的关系:接口与实现的关系。

这里写图片描述

JDBC规范(掌握四个核心对象):

DriverManager类:用于注册驱动 java.sql.DriverManager
Connection接口: 表示与数据库创建的连接 java.sql.Connection
Statement接口: 操作数据库sql语句的对象 java.sql.Connection
ResultSet接口: 结果集或一张虚拟表 java.sql.Connection

这里写图片描述

开发一个JDBC程序的准备工作:

这里写图片描述

开发一个JDBC程序

实现查询数据库中的数据显示在java的控制台中

1、创建数据库表,并向表中添加测试数据

create database day06;
use day06;

create table users(
    id int primary key auto_increment,
    name varchar(40),
    password varchar(40),
    email varchar(60),
    birthday date
)character set utf8 collate utf8_general_ci;

insert into users(name,password,email,birthday) values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday) values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','1979-12-04');

这里写图片描述

2、创建java project项目,添加数据库驱动(*.jar)

3、实现JDBC操作

    //1、注册驱动
    //2、创建连接
    //3、得到执行sql语句的Statement对象
    //4、执行sql语句,并返回结果
    //5、处理结果
    //6关闭资源

相关代码

Demo1.java

package com.sunny.jdbcdemo;

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

//使用jdbc技术实现查询数据库数据,并显示在控制台中
public class Demo1 {
    public static void main(String[] args) throws Exception{

        //注册驱动
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        //获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc://localhost:3306/jdbc","root","");

        //得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();

        //执行sql语句,并返回结果
        ResultSet rs = stmt.executeQuery("select password,email,birthday,id,name from users");

        //处理结果
        while(rs.next()){
            System.out.println(rs.getObject("password"));
            System.out.println(rs.getObject("id"));
            System.out.println(rs.getObject("name"));
            System.out.println(rs.getObject("birthday"));
            System.out.println(rs.getObject("email"));
            System.out.println("-----------------------");
        }

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

Demo2.java

package com.sunny.jdbcdemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import org.junit.Test;

public class Demo2 {
    @Test
    public void test1() throws Exception{
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
        //得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql语句,并返回结果
        ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
        //处理结果
        while(rs.next()){
            System.out.println(rs.getObject(1));
            System.out.println(rs.getObject(2));
            System.out.println(rs.getObject(3));
            System.out.println(rs.getObject(4));
            System.out.println(rs.getObject(5));
            System.out.println("-------------");
        }
        //关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }

    @Test
    public void test2() throws Exception{
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接Connection
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password","");

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",info);
        //得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql语句,并返回结果
        ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
        //处理结果
        while(rs.next()){
            System.out.println(rs.getObject(1));
            System.out.println(rs.getObject(2));
            System.out.println(rs.getObject(3));
            System.out.println(rs.getObject(4));
            System.out.println(rs.getObject(5));
            System.out.println("--------------------");
        }
        //关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }

    @Test
    public void test3() throws Exception{
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
        //得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql语句,并返回结果
        ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
        //处理结果
        while(rs.next()){
            System.out.println(rs.getObject(1));
            System.out.println(rs.getObject(2));
            System.out.println(rs.getObject(3));
            System.out.println(rs.getObject(4));
            System.out.println(rs.getObject(5));
            System.out.println("-------------------");
        }
        //关闭资源
        rs.close();
        stmt.close();
        conn.close();

    }

    @Test
    public void test4() throws Exception{
        //获取连接Connection
        Connection conn=null;
        //得到执行sql语句的对象 Statement
        Statement stmt = null;
        //执行sql语句,并返回结果
        ResultSet rs = null;
        try{
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select id,name,password,email,birthday from users");
            //处理结果
            while(rs.next()){
                System.out.println(rs.getObject(1));
                System.out.println(rs.getObject(2));
                System.out.println(rs.getObject(3));
                System.out.println(rs.getObject(4));
                System.out.println(rs.getObject(5));
                System.out.println("--------------------");
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //关闭资源
            if(rs!=null){
                try{
                    rs.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                rs=null;
            }
            if(stmt!=null){
                try{
                    stmt.close();

                }catch(Exception e){
                    e.printStackTrace();
                }
                stmt=null;
            }
            if(conn!=null){
                try{
                    conn.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                conn=null;
            }
        }
    }

}

测试结果:
这里写图片描述

JDBC增删查改

User.java

package com.sunny.entity;

import java.util.Date;

public class User {
    private int id;
    private String name;
    private String password;
    private String email;
    private Date birthday;
    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 getPassword(){
        return password;
    }
    public void setPassword(String password){
        this.password=password;
    }
    public String getEmail(){
        return email;
    }
    public void setEmail(String email){
        this.email=email;
    }
    public Date getBirthday(){
        return birthday;
    }
    public void setBirthday(Date birthday){
        this.birthday=birthday;
    }
    @Override
    public String toString(){
        return "User [id="+id+",name="+name+",password="+password+",email="+email+",birthday="+birthday+"]";

    }
}

TestCRUD.java

package com.sunny.jdbcdemo;

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

import org.junit.Test;

import com.sunny.entity.User;

public class TestCRDUD {

    // 查询表中所有数据
    @Test
    public void testSelect() throws Exception {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
        // 得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        // 执行sql语句,并返回结果
        ResultSet rs = stmt.executeQuery("select password,email,birthday,id,name from users");
        List<User> list = new ArrayList<User>();
        // 处理结果
        while (rs.next()) {
            User u = new User();
            u.setId(rs.getInt("id"));
            u.setName(rs.getString("name"));
            u.setPassword(rs.getString("password"));
            u.setEmail(rs.getString("email"));
            u.setBirthday(rs.getDate("birthday"));
            list.add(u);
        }
        // 关闭资源
        rs.close();
        stmt.close();
        conn.close();

        for (User user : list) {
            System.out.println(user);
        }
    }

    // 查询表中最后一条数据
    @Test
    public void testSelect1() throws Exception {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
        // 得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        // 执行sql语句,并返回结果
        ResultSet rs = stmt.executeQuery("select password,email,birthday,id,name from users");
        List<User> list = new ArrayList<User>();

        rs.afterLast();
        rs.previous();
        // 处理结果
        // while(rs.next()){
        User u = new User();
        u.setId(rs.getInt("id"));
        u.setName(rs.getString("name"));
        u.setPassword(rs.getString("password"));
        u.setEmail(rs.getString("email"));
        u.setBirthday(rs.getDate("birthday"));
        list.add(u);
        // }
        // 关闭资源
        rs.close();
        stmt.close();
        conn.close();

        System.out.println(u);

    }

    //增
    @Test
    public void testInsert() throws Exception {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
        // 得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        // 执行sql语句,并返回结果
        int i = stmt.executeUpdate("INSERT INTO users VALUES(5,'tom','123','tom@163.com','2015-09-28')");
        if (i > 0) {
            System.out.println("success");
        }

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

    //改
    @Test
    public void testUpdate() throws Exception {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
        // 得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        // 执行sql语句,并返回结果
        int i = stmt.executeUpdate("UPDATE users SET NAME='jerry',PASSWORD='333',email='jerry@163.com' WHERE id=3");
        if (i > 0) {
            System.out.println("success" + " 修改了" + i + "行");
        } else {
            System.out.println("修改了" + i + "行");
        }

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

    }

    //删
    @Test
    public void testDelete() throws Exception {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获取连接Connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
        // 得到执行sql语句的对象Statement
        Statement stmt = conn.createStatement();
        // 执行sql语句,并返回结果
        int i = stmt.executeUpdate("DELETE FROM users WHERE id=4");
        if (i > 0) {
            System.out.println("success");
        }

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

    }
}

JDBC常用的类和接口详解

1、java.sql.Drivermanager类 : 创建连接

a、注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因有2个:

导致驱动被注册2次。
强烈依赖数据库的驱动jar
解决办法:
Class.forName(“com.mysql.jdbc.Driver”);

b、与数据库建立连接
static Connection getConnection(String url, String user, String password)
试图建立到给定数据库 URL 的连接。

getConnection(“jdbc:mysql://localhost:3306/day06”, “root”, “root”);

URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/day06
协议 子协议 IP :端口号 数据库
mysql: jdbc:mysql://localhost:3306/day14 或者 jdbc:mysql:///day14(默认本机连接)
oracle: jdbc:oracle:thin:@localhost:1521:sid

    Properties info = new Properties();//要参考数据库文档
    info.setProperty("user", "root");
    info.setProperty("password","root");

getConnection(String url, Properties info)

getConnection(String url)
DriverManager.getConnection(“jdbc:mysql://localhost:3306/day14?user=root&password=root”);

2、java.sql.Connection接口:一个连接

接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。

Statement createStatement(); //创建操作sql语句的对象

3、java.sql.Statement接口: 操作sql语句,并返回相应结果的对象(小货车)

接口的实现在数据库驱动中。用于执行静态 SQL 语句并返回它所生成结果的对象。
ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;

4、java.sql.ResultSet接口: 结果集(客户端存表数据的对象)

a、封装结果集的。
提供一个游标,默认游标指向结果集第一行之前。
调用一次next(),游标向下移动一行。
提供一些get方法。

这里写图片描述

封装数据的方法
Object getObject(int columnIndex); 根据序号取值,索引从1开始
Object getObject(String ColomnName); 根据列名取值。

将结果集中的数据封装到javaBean中
java的数据类型与数据库中的类型的关系

Java数据库
bytetityint1个字节
shortsmallint2个字节
intint4个字节
longbigint8个字节
floatfloat
doubledouble
Stringchar varchar
Datedate
boolean next()  //将光标从当前位置向下移动一行
int getInt(int colIndex)    //以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel) //以int形式获取ResultSet结果集当前行指定列名值
float getFloat(int colIndex)    //以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel) //以float形式获取ResultSet结果集当前行指定列名值
String getString(int colIndex)  //以String 形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel)   //以String形式获取ResultSet结果集当前行指定列名值
Date getDate(int columnIndex);  
Date getDate(String columnName);
void close()    //关闭ResultSet 对象

b、可移动游标的方法

 boolean next()  //将光标从当前位置向前移一行。 
 boolean previous() //将光标移动到此 ResultSet 对象的上一行。 
 boolean absolute(int row) //参数是当前行的索引,从1开始根据行的索引定位移动的指定索引行。
 void afterLast() //将光标移动到末尾,正好位于最后一行之后。 
 void beforeFirst() //将光标移动到开头,正好位于第一行之前。 

5、释放资源
资源有限,要正确关闭。

@Test
    public void test4() throws Exception{
        //获取连接Connection
        Connection conn=null;
        //得到执行sql语句的对象 Statement
        Statement stmt = null;
        //执行sql语句,并返回结果
        ResultSet rs = null;
        try{
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select id,name,password,email,birthday from users");
            //处理结果
            while(rs.next()){
                System.out.println(rs.getObject(1));
                System.out.println(rs.getObject(2));
                System.out.println(rs.getObject(3));
                System.out.println(rs.getObject(4));
                System.out.println(rs.getObject(5));
                System.out.println("--------------------");
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //关闭资源
            if(rs!=null){
                try{
                    rs.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                rs=null;
            }
            if(stmt!=null){
                try{
                    stmt.close();

                }catch(Exception e){
                    e.printStackTrace();
                }
                stmt=null;
            }
            if(conn!=null){
                try{
                    conn.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
                conn=null;
            }
        }
    }

使用JDBC实现CRUD操作

User.java

package com.dgut.edu.entity;

import java.util.Date;

public class User {
    private int id;
    private String name;
    private String password;
    private String email;
    private Date birthday;

    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 getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString(){
        return "User [id="+id+",name="+name+",password="+password+",email="+email+",birthday="+birthday+"]";
    }
}

DBUtils.java

package com.dgut.edu.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ResourceBundle;

public class DBUtils {
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    static{
        //此对象是用于加载properties文件结构的
        ResourceBundle rb=ResourceBundle.getBundle("dbinfo");
        driverClass=rb.getString("driverClass");
        url=rb.getString("url");
        username=rb.getString("username");
        password=rb.getString("password");
        try{
            Class.forName(driverClass);
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    //得到连接的方法
    public static Connection getConnection() throws Exception{
        return DriverManager.getConnection(url,username,password);
    }

    //关闭资源的方法
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
        //关闭资源
        if(rs!=null){
            try{
                rs.close();
            }catch(Exception e){
                e.printStackTrace();
            }
            rs=null;
        }
        if(stmt!=null){
            try{
                stmt.close();
            }catch(Exception e){
                e.printStackTrace();
            }
            stmt=null;
        }
        if(conn!=null){
            try{
                conn.close();
            }catch(Exception e){
                e.printStackTrace();
            }
            conn=null;
        }
    }
}

dbinfo.properties

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbc
username=root
password=

TestCRUD.java

package com.dgut.edu.crud;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.dgut.edu.entity.User;
import com.dgut.edu.util.DBUtils;

public class TestCRUD {

    // 查
    @Test
    public void testSelect() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = DBUtils.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select * from users");
            List<User> list = new ArrayList<User>();
            while (rs.next()) {
                User u = new User();
                u.setId(rs.getInt(1));
                u.setName(rs.getString(2));
                u.setPassword(rs.getString(3));
                u.setEmail(rs.getString(4));
                u.setBirthday(rs.getDate(5));
                list.add(u);
            }
            for (User user : list) {
                System.out.println(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(rs, stmt, conn);
        }
    }

    // 增
    @Test
    public void testInsert() {
        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            conn = DBUtils.getConnection();
            stmt = conn.prepareStatement("INSERT INTO users VALUES(?,?,?,?,?)");
            stmt.setInt(1, 4);
            stmt.setString(2, "Sunny");
            stmt.setString(3, "666");
            stmt.setString(4, "Sunny@qq.com");
            // stmt.setDate(5, new java.sql.Date(System.currentTimeMillis()));
            stmt.setString(5, "2017-09-11");

            int i = stmt.executeUpdate();

            if (i > 0) {
                System.out.println("success");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(null, stmt, conn);
        }
    }

    // 改
    @Test
    public void testUpdate() {
        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            conn = DBUtils.getConnection();
            stmt = conn.prepareStatement("UPDATE users SET NAME=?,PASSWORD=?,email=? WHERE id=?");
            stmt.setString(1, "Barret");
            stmt.setString(2, "123666");
            stmt.setString(3, "Barret@qq.com");
            stmt.setInt(4, 5);

            int i = stmt.executeUpdate();

            if (i > 0) {
                System.out.println("success");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(null, stmt, conn);
        }
    }

    // 删
    @Test
    public void testDelete() {
        Connection conn = null;
        Statement stmt = null;

        try {
            conn = DBUtils.getConnection();
            stmt = conn.createStatement();

            int i = stmt.executeUpdate("DELETE FROM users WHERE id=4");

            if (i > 0) {
                System.out.println("success");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.closeAll(null, stmt, conn);
        }
    }

}

实现一个用户登录的功能

这里写图片描述

User.java

package com.itheima.entity;

import java.util.Date;

public class User {
    private int id;
    private String name;
    private String password;
    private String email;
    private Date birthday;
    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 getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", password=" + password
                + ", email=" + email + ", birthday=" + birthday + "]";
    }



}

DBUtils.java

package com.itheima.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

public class DBUtils {
    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;

    static{
        ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
        //给上面4个变量赋值
        driverClass = rb.getString("driverClass");
        url = rb.getString("url");
        user = rb.getString("user");
        password = rb.getString("password");
        try {
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    //得到连接
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);
    }

    //关闭资源 
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

DoLogin.java

package com.itheima.service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.itheima.entity.User;
import com.itheima.util.DBUtils;

public class DoLogin {

    /**
     * 根据用户名和密码查询用户对象信息
     * @param name
     * @param pwd
     * @return u
     */
    public User findUser(String name,String pwd){
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        User u = null;
        try {
            conn = DBUtils.getConnection();//得到连接对象Connection
            String sql ="SELECT * FROM users WHERE NAME=? AND PASSWORD=?";
            stmt = conn.prepareStatement(sql);//得到执行sql语句的对象Statement
            //给?赋值
            stmt.setString(1, name);
            stmt.setString(2, pwd);

            rs = stmt.executeQuery();//执行sql语句
            if(rs.next()){
                u = new User();
                u.setId(rs.getInt(1));
                u.setName(rs.getString(2));
                u.setPassword(rs.getString(3));
                u.setEmail(rs.getString(4));
                u.setBirthday(rs.getDate(5));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DBUtils.closeAll(rs, stmt, conn);
        }

        return u;
    }
}

Login.java

package com.itheima.client;

import java.util.Scanner;

import com.itheima.entity.User;
import com.itheima.service.DoLogin;

public class Login {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = input.nextLine();
        System.out.println("请输入密码:");
        String pwd = input.nextLine();

        DoLogin dl = new DoLogin();
        User user = dl.findUser(name, pwd);//调用查询用户的方法
        if(user!=null){
            System.out.println("欢迎你:"+user.getName());
        }else{
            System.out.println("用户名或密码错误!");
        }

    }

}

SQL注入问题:preparedStatement

preparedStatement:预编译对象, 是Statement对象的子类。
特点:
性能要高
会把sql语句先编译
sql语句中的参数会发生变化,过滤掉用户输入的关键字。

一、概述: JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 ODBC:基于C语言的数据库访问接口。 JDBC也就是Java版的ODBC。 JDBC的特性:高度的一致性、简单性(常用的接口只有4、5个)。 1.在JDBC中包括了两个包:java.sql和javax.sql。 ① java.sql 基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。 注:除了标出的Class,其它均为接口。 API 说明 java.sql.Connection 与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。 java.sql.Driver 每个驱动程序类必需实现的接口,同时,每个数据库驱动程序都应该提供一个实现Driver接口的类。 java.sql.DriverManager (Class) 管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。 java.sql.Statement 用于执行静态SQL语句并返回其生成结果的对象。 java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。 java.sql.ResultSet 指的是查询返回的数据库结果集。 java.sql.ResultSetMetaData 可用于获取关于ResultSet对象中列的类型和属性信息的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值