您的位置:首页 > 编程语言 > Java开发

JAVA 笔记-JDBC(五)

2016-01-26 15:13 211 查看
1、什么是jdbc?
     java database conectivity
     sun公司制订的一种用来访问数据库的通用的api,这些api由不同的数据库厂商来实现,这样,开发人员就可以使用相同的方式来访问不同的数据库。
2、如何使用jdbc?
     (1)三个重要的对象
          a, Connection: 负责建立连接(java程序与数据库之间
          的连接)
          b, Statement:负责发送sql给数据库(Statement由
          Connection来创建)
          c,  ResultSet: 负责封装数据库返回的查询的结果。
     (2)编程步骤
          step1, 加载驱动(需要事先将驱动程序对应的
          jar文件放到classpath对应的路径)
               驱动:就是不同的数据库厂商实现的api。
               Class.forName(驱动类名);
          step2,获得连接
               Connection conn =
               DriverManager.getConnection(url,user,pwd);
               url:数据库所在的机器在的ip,端口,sid
               user:用户名
               pwd:密码
          step3, 获得Statement
               Statement stat = conn.creatStatement();
          step4, 执行SQL
               a, 执行查询
                    ResultSet rst = stat.executeQuery(SQL);
               b,执行删除、更新、插入
                    int stat.executeUpdate(SQL);
          step5,如果是查询,需要遍历ResultSet
                    遍历: 将查询的结果一条一条取出来,获取其中的数据。
3、mysql
     (1)简单使用
          1)登录mysql(使用root用户)
               mysql -uroot;
          2)查看当前有哪些数据库
               show databases;
          3)创建一个数据库 (名叫jd1305db,缺省的
          字符集是utf8)
               create database jd1305db default
               character set utf8;
          4) 使用某个数据库
               use  jd1305db;
          5) 查看当前数据库有哪些表               show tables;
          6)  建表
               create table t_user(
                    id int primary key  auto_increment,
                    username varchar(50),
                    pwd varchar(30),
                    age int
               )type=innodb;
               insert into t_user(username,pwd,age)
               values('jetty','test',23);
          注意:
               auto_increment: 自增长列,即该列的值由数据库
               自动赋值,一般用于主健的生成。
               type=innodb:  表示该表支持事务。
4、使用jdbc访问数据库,常见的错误
     (1) 参数错误
     (2) 驱动程序(jar文件)不合适,或者没有放到
     classpath路径里面。              
     (3) sql语句错误
5、PreparedStatement (预编译的Statement)
          1)sql注入问题:
               通过刻意构造一些参数值,来改变系统原有sql语句的结构,从而达到破坏系统的目的(比如,非法获取系统敏感的数据,非法登录等等)
          2)PreparedStatement
               a,PreparedStatement是如何执行的?
                    step1, sql语句先发送给数据库,数据库会生成一个执行计划(预编译)
                    step2, 将参数值发送给数据库,执行sql。
               b,优点
                    b1: 防止sql注入因为PreparedStatement执行的sql语句结构是不会改变的。
                    b2:如果有多条结构相同的sql语句要执行,则PreparedStatement执行效率要比Statement高。
6、DAO (Data Access Object)

     (1)DAO是什么?

          封装了数据访问逻辑的一个模块。

     (2)如何写一个DAO?

          step1, 写一个实体类就是一个普通的java类,这个类与数据库的

          表对应:

               该类的属性与表的列对应(数据类型匹配),这些属性要有对应的get/set方法。

               实体类的作用,是为了将数据库中的记录封装成一个对应的java对象。

          step2, 写一个DAO接口

               在DAO接口中,要声明一系列用来访问数据库的方法。

               声明这些方法时,不要涉及任何具体的数据库访问技术。

          step3, 写一个DAO实现类

               既使用具体的数据库访问技术来实现DAO接口。
          step4, 写一个工厂类

               "工厂设计模式":
                    工厂负责为调用者提供一个符合接口要求的对象(该对象一般称之为产品)。
                    这样做的好处是:调用者不用了解对象的创建的细节,并且,当对象发生了改变,不会影响到调用者。

7、事务

     (1)什么是事务?

          将多个操作当做一个原子操作来进行。

     (2)jdbc如何控制事务?

          1)jdbc在默认情况下是自动提交事务,即一条sql语句执行之后,会立即提交事务。

          2)如果多个操作(即有多条sql语句要执行)要当做一个整体来执行,比如在“转帐”业务当中,需要执行两个sql: 一个sql用来对一个帐号进行扣除余额的操作(-1000),
               另外一个sql用来对另外一个帐号进行增加余额的操作(+1000),很显示,这两个操作要么同时成功,要么同时失败。

          3)三个方法

               //当flag为false时,表示禁止自动提交。

               connection.setAutoCommit(boolean flag);

               //提交事务

               connection.commit();

               //回滚事务

               connection.rollback();

     (3)事务的封装

               比如,要“转帐":

               从资金帐户(t_account表中的某条记录)扣掉200元,然后,股票帐户(t_stock表中的某条记录)增加价值200元的股票。

          create table t_account(

               id int primary key auto_increment,

               accountNo varchar(16),

               balance int

          )type=innodb;

          insert into t_account(accountNo,balance)

          values('6225881003192000',1000);

          create table t_stock(

               id int primary key auto_increment,

               stockNo varchar(6),

               qty int

          )type=innodb;

          insert into t_stock(stockNo,qty)

          values('600015',0);    

     (4)Threadlocal (线程局部变量)

          a,作用

               为每一个线程维护一个变量的副本。

          b,用途

               一个线程要访问多个方法,需要在多个方法之间共享同一个数据(比如,一个connection对象)。

                   

              

                
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jdbc