JDBC

头像
于影
    阅读 6 分钟
    1

    一、Navicat软件的使用

    1.新建连接:连接名随便起一个就可,主机名/IP地址,端口,用户名都是默认的,直接输入密码就ok
    2.新建数据库时,左边栏不显示新建的数据库,右键连接刷新即可
    3.如何导入/导出--java/web程序到Eclipse
        (1)导出:--想把文件发给别人,直接复制粘贴到桌面即可导出
        (2)导入:--新建一个同类型的的项目,名字后面加上-teacher(跟自己的不一样就可以)
                 然后复制目录下的src和WebContent到项目里即可
        Import导入:Import-General-Existing Projects into Workspace--select root directory
        选上Copy projects into workspace选项(就会自动保存在工作空间里一份)

    二、JDBC(Java DataBase Connectivity)-- Java数据库连接

    1.其实就是利用Java语言/Java程序连接并访问数据库的一门技术,开发中都是通过程序来连接数据库
      如果是Java语言通过程序连接数据库,就必须要学习JDBC这门技术
    2.如何通过Java程序连接mysql数据库-- 入门程序
        (1)课前资料的SQL脚本复制到Navicat软件中执行,创建jt_bd库,包含表(acc,account,user,stu)
        (2)创建一个CGB-JDBC-01项目
        (3)课前资料里找到mysql-connector-java-5.1.32.jar
        (4)如果是web项目:直接把文件复制到WebContent/WEB-INF/lib目录下 
           如果是Java基础项目:可以在项目中建一个lib目录,上面的jar文件复制到项目的lib下,在选中jar文件
           右键--> Build Path --> Add to Build Path..
        (5)创建一个测试类JdbcTest01,代码如下--查询:
            public class JdbcTest01 {
            -- 练习1:查询asscount表中的所有记录并输出到控制台
            @Test
            public void testFindAll() throws Exception {
                -- 1.注册数据库驱动--JDBC4.0之后会自动注册驱动,但最好加上,否则某些时候会报错
                Class.forName("com.mysql.jdbc.Driver");
                --  2.获取数据库连接
                Connection conn = DriverManager.getConnection(
                        "jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf-8",
                        "root", "root");
                --  3.获取传输器
                Statement st = conn.createStatement();
                --  4.发送SQL到服务器执行,并返回运行结果
                String sql = "select * from account";
                -- 查询用的是executeQuery(sql)返回的是一个表格
                -- 增删改用的是excuteUpdate(sql),返回的是int值,表示影响的行数
                ResultSet rs = st.executeQuery(sql);
                --  5.处理执行后的结果
                while (rs.next()) {
                -- 也可以传入数值,代表传入的是第一列 -- int id=ra.getInt(1);
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    Double money = rs.getDouble("money");
                    System.out.println(id + "," + name + "," + money);
                }
                --  6.释放资源
                rs.close();
                st.close();
                conn.close();
                System.out.println("ok");
            }
            (6)创建一个测试类JdbcTest02,代码如下--增加:
            /* 练习2:往account表中添加一条记录,名称为'john',金额是3500 */
            @Test
            public void testInsert02() throws Exception {
                Class.forName("com.mysql.jdbc.Driver");
                Connection conn = DriverManager.getConnection(
                "jdbc:mysql:///jt_db?characterEncoding=utf-8", "root", "root");
                Statement st = conn.createStatement();
                String sql = "insert into account values(null,'john',3500);";
                int rs = st.executeUpdate(sql);
                System.out.println("成功--影响行数为" + rs);
                st.close();
                conn.close();
            }
            修改和删除只需要改一下sql语句即可,就不举例了

    三、PreparedStatement对象

    1.模拟登录-- 代码详见E:/WS_CGB2008/工作空间下的/CGB-JDBC-01/cn.tedu.ps/LoginUser
    2.上面那样写会出现bug,用户名输入(张飞'#,张飞' or '1=1)或密码输入--' or '2=2都可以显示登录成功
    -- 这种bug叫做SQL注入攻击
    3.SQL注入攻击
        SQL注入攻击产生的原因: 由于后台执行的SQL语句是拼接而来的:其中的参数值(username和password的值)是用户提交过来的
        如果用户在提交参数时,在参数中掺杂了一些SQL关键字(比如or)或者特殊符号(#、-- 、' 等),就可能会导致SQL语句语义
        的变化,从而执行一些意外的操作(用户名或密码不正确也能登录成功)!
        delete from user where id=1 or 1 = 1; -- 这样是恶意攻击,这样user表的数据全被删除了
        3.1--解决SQL注入攻击:
            (1)可以对用户提交过来的参数进行校验,这种方式不推荐,需要自己手写代码
                通过正则表达式对用户名和密码进行校验,如果用户名和密码中有类似于or,#,-- 等符号,就不再登录
            (2)使用PreparedStatement对象来替代Statement对象。
                代码详见E:/WS_CGB2008/工作空间下的/CGB-JDBC-01/cn.tedu.ps/LoginUser2
                --原理--使用PreparedStatement对象是先将SQL语句的骨架(不包含参数)发送给服务器编译并确定下来
                    String sql = "select * from user where username = ? and password = ?";
                    PreparedStatement ps = conn.prepareStatement(sql);
                --再将SQL语句中的参数值传递给服务器
                    ps.setString(1, user);
                    ps.setString(2, psw);
                    -- 执行SQL语句,返回执行结果
                    ResultSet rs = ps.executeQuery();
                由于前面SQL语句的骨架已经确定了,因此SQL语句参数中即使再包含SQL关键字或者特殊符号
                也不会导致SQL语句的骨架或语义,只会被当作普通的文本来处理,因此可以防止SQL注入攻击!

    四、数据库连接池

    1.什么是连接池
        池:常量值、线程池、连接池等中的池就是一个容器,是指内存中的一片空间
        连接池:就是将一批连接资源存入到一个容器中,目的是为了实现连接的复用,减少连接创建和关闭的次数,以此来提高程序执行的效率
    2.为什么要使用连接池
        传统方式中,每次需要连接都是直接创建连接,在基于这个创建的连接去连接数据库,最后用完连接还要关闭!而每次创建连接和关闭连
        接相比使用连接要消耗大量的时间和资源,导致程序的执行效率非常低下,为了提高程序执行的效率,我们可以在程序一启动时,就创建
        一批连接放在一个容器中,供整个程序共享。当用户需要连接时,不需要再创建连接,而是直接从连接池中获取一个连接使用,用完连接
        后,也不需要关闭,而是直接将连接还回连接池中,这样一来,用来用去都是池中的这一批连接,实现了连接的复用,减少了连接创建和
        关闭的次数,从而提高了程序执行的效率!
    3.怎么使用C3PO连接池
        (1)导入jar包:--二阶段课件\unit06-jdbc\resource\c3p0下的c3p0-0.9.1.2.jar
        (2)在程序中创建一个连接池对象(就是存放连接的容器)
            ComboPooledDataSource pool = new ComboPooledDataSource();
        (3)设置连接数据库的基本信息(四个参数)
            方式1:将连接数据库的参数通过setXXX方法直接通过java,这种方式不推荐使用,代码如下:
                pool.setDriverClass("com.mysql.jdbc.Driver");
                pool.setJdbcUrl("jdbc:mysql:///jt_db?characterEncoding=utf-8");
                pool.setUser("root");
                pool.setPassword("root");
            这种方式不推荐
            方式2:将连接数据库的参数提取到c3p0.properties(文件名是固定的)文件中并且需要将这个文件放在源码目录中,代码如下:
                c3p0.driverClass=com.mysql.jdbc.Driver
                c3p0.jdbcUrl=jdbc:mysql:///jt_db?characterEncoding=utf-8
                c3p0.user=root
                c3p0.password=root
            再次强调:这个文件的位置和名字是固定的,因为底层c3p0会到指定的位置找指定的文件,如果没有按照要求去存放文件或者没有
            按照要求去指定文件名称,都会导致c3p0找不到文件,也就无法读取其中的配置信息,必然会导致连接不上数据库。
            方式3:将连接数据库的参数提取到c3p0-config.xml(文件名也是固定的)文件中并且需要将这个文件放在源码根目录下,代码如下:
                <?xml version="1.0" encoding="UTF-8"?>
                <c3p0-config>
                    <default-config>
                        <property name="driverClass">
                            com.mysql.jdbc.Driver
                        </property>
                        <property name="jdbcUrl">
                            jdbc:mysql:///jt_db?characterEncoding=utf-8
                        </property>
                        <property name="user">
                            root
                        </property>
                        <property name="password">
                            root
                        </property>
                    </default-config>
                </c3p0-config>
            再次强调:这个文件的位置和名字是固定的,因为底层c3p0会到指定的位置找指定的文件,如果没有按照要求去存放文件或者没有
            按照要求去指定文件名称,都会导致c3p0找不到文件,也就无法读取其中的配置信息,必然会导致连接不上数据库。
        (4)从连接池中获取一个连接对象进行使用
            Connection conn=pool.getConnection();
        (5)将用完的连接对象还回到连接池中
            conn.close;
        如果在程序中没有使用任何连接池,需要连接就通过DriverManager.getConnection获取(创建)一个连接,用完之后,调用conn.close()
        就是将连接资源关闭,如果使用了连接池,通过连接池对象调用getConnection方法获取一个连接对象,此时获取的连接对象已经被改造了
        用完之后,再调用conn.close()方法是将连接还回到连接池中,也就是说,
        

    于影
    7 声望10 粉丝

    下一篇 »
    练习集锦

    引用和评论

    0 条评论