JDBC

一、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(文件名也是固定的)文件中并且需要将这个文件放在源码根目录下,代码如下:
            
            
                
                    
                        com.mysql.jdbc.Driver
                    
                    
                        jdbc:mysql:///jt_db?characterEncoding=utf-8
                    
                    
                        root
                    
                    
                        root
                    
                
            
        再次强调:这个文件的位置和名字是固定的,因为底层c3p0会到指定的位置找指定的文件,如果没有按照要求去存放文件或者没有
        按照要求去指定文件名称,都会导致c3p0找不到文件,也就无法读取其中的配置信息,必然会导致连接不上数据库。
    (4)从连接池中获取一个连接对象进行使用
        Connection conn=pool.getConnection();
    (5)将用完的连接对象还回到连接池中
        conn.close;
    如果在程序中没有使用任何连接池,需要连接就通过DriverManager.getConnection获取(创建)一个连接,用完之后,调用conn.close()
    就是将连接资源关闭,如果使用了连接池,通过连接池对象调用getConnection方法获取一个连接对象,此时获取的连接对象已经被改造了
    用完之后,再调用conn.close()方法是将连接还回到连接池中,也就是说,
    

你可能感兴趣的:(jdbc规范)