JavaWeb(10)JDBC

1. JDBC概念

1. JDBC概念:Java DataBase Connectivity(Java数据库连接)
2. JDBC本质:是官方(sun公司)定义的一套操作所有关系型数据库的规则(接口),各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
在这里插入图片描述

2. JDBC快速入门

1. 步骤
(1)导入驱动jar包:mysql-connector-java-5.1.37-bin.jar

1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library

(2)注册驱动
(3)获取数据库连接对象:Connection
(4)定义sql
(5)获取执行sql语句的对象:Statement
(6)执行sql,接受返回结果
(7)处理结果
(8)释放资源

2. 代码实现

/**
 * JDBC快速入门
 */
public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {
        //1.导入驱动jar包
        //2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
        //4.定义sql语句
        String sql = "update stu set age = 16 where id = 1";
        //5.获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        //6.执行sql
        int count = stmt.executeUpdate(sql);
        //7.处理结果
        System.out.println(count);
        //8.释放资源
        stmt.close();
        conn.close();
    }
}

3. JDBC的各个对象详解

1. DriverManager:驱动管理对象
(1)功能

1. 注册驱动:告诉程序该使用那一个数据库驱动jar
	static void registerDriver(Driver driver):注册与给定驱动的程序DriverManager
	写代码使用:Class.forName("com.mysql.jdbc.Driver")
	通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
	static {
			 try {
				 	 java.sql.DriverManager.registerDriver(new Driver());
			 } catch (SQLException E) {
				      throw new RuntimeException("Can't register driver!");
			 }
	}

2. 获取数据库链接
	方法:static Connection(String url,String user,String password)
	参数:
		url:指定的连接路径
				语法:jdbc:mysql://IP地址:端口号/数据库名称
				例如:jdbc:mysql://localhost:3306/db1
				简写为:jdbc:mysql:///db1(链接的是本机服务器,并且mysql的端口号为3306)
		user:用户名
		password:密码

2. Connection:数据库连接对象
(1)功能

1. 获取执行sql的对象
	Statement createStatment()
	PreparedStatement prepareStatement(String sql)
2. 管理事务
	开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
	提交事务:commit()
	回滚事务:rollback()

3. Statement:执行sql的对象
(1)功能

1. 执行sql
	1. boolean execute(String sql):可以执行任意的sql --了解
	2. int executeUpdate(String sql):执行DML(insert,update,delete)语句
										  DDL(create,alter,drop)语句
	3. ResultSet executeQuery(String sql):执行DQL(select)语句

(2)练习

/**
 * lol表:添加一条记录
 */
public class JDBCDemo02 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2. 获取Connection对象
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //3. 定义sql
            String sql = "insert into lol values(3,'tf',33)";
            //4. 获取执行sql的对象Statement
            stmt = conn.createStatement();
            //5. 执行sql
            int count = stmt.executeUpdate(sql);
            //6. 处理结果
            System.out.println(count);
            if(count > 0){
                System.out.println("添加成功");
            }else {
                System.out.println("添加失败");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //7. 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

===========================================================================================

/**
 * lol表:修改记录
 */
public class JDBCDemo03 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2. 链接获取对象
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //3. 定义sql
            String sql = "update lol set age = 11 where id = 1";
            //4. 获取执行sql的对象
            stmt = conn.createStatement();
            //5. 执行sql
            int count = stmt.executeUpdate(sql);
            //6. 处理结果
            System.out.println(count);
            if(count > 0){
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //7. 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

===========================================================================================

/**
 * lol表:删除记录
 */
public class JDBCDemo04 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2. 链接获取对象
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //3. 定义sql
            String sql = "delete from lol where id = 3";
            //4. 获取执行sql的对象
            stmt = conn.createStatement();
            //5. 执行sql
            int count = stmt.executeUpdate(sql);
            //6. 处理结果
            System.out.println(count);
            if(count > 0){
                System.out.println("删除成功");
            }else {
                System.out.println("删除失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //7. 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

===========================================================================================

/**
 * lol表:执行DDL
 */
public class JDBCDemo05 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2. 链接获取对象
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            //3. 定义sql
            String sql = "create table lol2(id int,name varchar(20))";
            //4. 获取执行sql的对象
            stmt = conn.createStatement();
            //5. 执行sql
            int count = stmt.executeUpdate(sql);
            //6. 处理结果
            System.out.println(count);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //7. 释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

4. ResultSet:结果集对象,封装查询结果
(1)功能

1. boolean next():游标向下移动一行,判断当前行是否到大最后一行末尾。如果是返回false,如果不是返回true
2. getXxx(参数):获取数据
	1. Xxx:代表数据类型。如getInt,getString
	2. 参数:
		1. int:代表列的编号,从1开始,如getInt(1)
		2. String:代表列名称,如getString("name")
3. 使用步骤
	1. 游标向下移动一行
	2. 判断是否有数据
	3. 获取数据 

(2)代码示例

/**
 * lol表:执行DQL
 */
public class JDBCDemo06 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            String sql = "select * from lol";
            stmt = conn.createStatement();
            //DQL执行executeQuery
            rs = stmt.executeQuery(sql);
            //处理结果
            //循环判断游标是否是最后一行末尾
            while(rs.next()){
                //获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                int age = rs.getInt("age");

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

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

5. 练习题
(1)需求:定义一个方法,查询lol表的数据并将其封装为对象,然后装载集合,返回

1. 定义Lol类
2. 定义方法:public List<Lol> findAll(){}
3. 实现方法:select * from lol

(2)代码实现

/**
 * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
 */
public class JDBCDemo07 {
    public static void main(String[] args) {
        List<Lol> list = new JDBCDemo07().findAll();
        System.out.println(list);   //[Lol{id=1, name='noc', age=11}, Lol{id=2, name='mf', age=18}]
        System.out.println(list.size());   //2
    }

    public List<Lol> findAll() {
        Connection conn = null;
        List<Lol> list = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
            String sql = "select * from lol";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

            //遍历结果集,封装对象,装载集合
            Lol lol = null;
            list = new ArrayList<Lol>();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");

                lol = new Lol();
                lol.setId(id);
                lol.setName(name);
                lol.setAge(age);

                list.add(lol);

            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }
}

=======================================================================================

/**
 * 封装lol表数据的JavaBean
 */
public class Lol {
    private int id;
    private String name;
    private int age;

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Lol{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

4. 编写JDBC工具类:JDBCUtils

1. 目的:简化书写
2. 分析:
(1)注册驱动也抽取
(2)抽取一个方法获取连接对象(配置文件)
(3)抽取一个方法释放资源
3. 代码实现

public class JDBCDemo08 {
    public static void main(String[] args) {
        List<Lol> list = new JDBCDemo08().findAll();
        System.out.println(list);   //[Lol{id=1, name='noc', age=11}, Lol{id=2, name='mf', age=18}]
        System.out.println(list.size());   //2
    }

    public List<Lol> findAll() {
        Connection conn = null;
        List<Lol> list = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
           /* Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");*/
            conn = JDBCUtils.getConnection();
            String sql = "select * from lol";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

            //遍历结果集,封装对象,装载集合
            Lol lol = null;
            list = new ArrayList<Lol>();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");

                lol = new Lol();
                lol.setId(id);
                lol.setName(name);
                lol.setAge(age);

                list.add(lol);

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            /*if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

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

            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }*/

            JDBCUtils.close(rs,stmt,conn);
        }
        return list;
    }
}

=======================================================================================

/**
 * JDBC工具类
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /**
     * 文件的读取,只需要读取一次即可拿到这些值,使用静态代码块
     */
    static {
        //读取资源文件,获取值
        try {
            //1. 创建Properties集合类
            Properties pro = new Properties();
            //获取src路径下文件的方式 --> ClassLoader类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();

            //2. 加载文件
            pro.load(new FileReader(path));

            //3. 获取数据,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");

            //4. 注册驱动
            Class.forName(driver);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return  连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

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

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

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

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

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

=======================================================================================

/**
jdbc.properties:配置文件
*/
url=jdbc:mysql:///db1
user=root
password=root
driver=com.mysql.jdbc.Driver

5. SQL注入的问题

1. 问题引入
(1)需求:用户通过键盘录入用户名和密码,判断用户是否登陆成功
(2)代码实现

public class JDBCDemo09 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.next();
        System.out.println("请输入密码");
        String password = sc.next();

        boolean flag = new JDBCDemo09().login(username, password);

        if (flag){
            System.out.println("登陆成功");
        }else {
            System.out.println("用户名或者密码输入错误");
        }
    }

    /**
     * 登录方法
     */
    public boolean login(String username,String password){
        if (username == null || password == null){
            return false;
        }

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = JDBCUtils.getConnection();
            String sql = " select * from user where username = '" + username +"' and password = '" + password +"' ";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,stmt,conn);
        }

        return false;
    }
}

2. SQL注入
(1)概念:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

1. 输入用户随便,输入密码:a' or 'a' = 'a
2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 

(2)解决sql注入问题:使用PreparedStatement对象来解决
(3)预编译的SQL:参数使用?作为占位符
(4)步骤

1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
		注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
6. 给?赋值:
		方法: setXxx(参数1,参数2)
			参数1:?的位置编号 从1 开始
			参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源

3. 改进后的防止sql注入的代码

public class JDBCDemo10 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.next();
        System.out.println("请输入密码");
        String password = sc.next();

        boolean flag = new JDBCDemo10().login(username, password);

        if (flag){
            System.out.println("登陆成功");
        }else {
            System.out.println("用户名或者密码输入错误");
        }
    }

    /**
     * 登录方法
     */
    public boolean login(String username,String password){
        if (username == null || password == null){
            return false;
        }

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = JDBCUtils.getConnection();
            String sql = " select * from user where username = ? and password = ?";
            //获取执行sql的对象
            pstmt = conn.prepareStatement(sql);
            //给?赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //执行sql语句,不需要传sql
            rs = pstmt.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,pstmt,conn);
        }

        return false;
    }
}
JavaWeb购物车JDBC是一种基于JavaWeb技术开发的电子商务网站,它实现了用户注册、登录、浏览商品、购物车结算、订单管理等一系列电子商务操作。JDBC是Java数据库连接技术,它可以实现与关系型数据库的连接与交互,为JavaWeb购物车提供了持久化存储功能。 JavaWeb购物车JDBC的实现过程主要包括以下几个步骤: 1.建立数据库连接:首先需要加载JDBC驱动程序,然后通过该驱动程序与数据库建立连接。 2.创建数据库表结构:为了实现购物车功能,需要创建商品表、用户表、订单表和订单详情表等数据库表。 3.编写JDBC代码:使用Java语言编写数据访问对象(DAO)类,通过这些类实现对数据库的增删改查操作。同时,需要实现购物车功能的业务逻辑,如添加商品到购物车、计算商品总价、生成订单等。 4.部署JavaWeb应用程序:将JavaWeb购物车JDBC部署到Web服务器上,如Tomcat或Jetty,通过浏览器访问网站进行测试。 JavaWeb购物车JDBC的优势在于它遵循Java开发语言的规范,具有可移植性和跨平台性。同时,JDBC技术支持多种数据库类型,如Oracle、MySQL、PostgreSQL等,方便开发者根据实际需求选择最适合的数据库。在开发过程中,使用JDBC技术可以提高代码的可读性和可维护性,减少耦合度,提高代码复用率。 总之,JavaWeb购物车JDBC是一种基于JavaWeb技术和JDBC技术的电子商务网站,它具有可移植性、跨平台性和可读性强等优势,可为JavaWeb开发者提供一个高效、可扩展的电商开发框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值