1、jdbc是什么?
java database connectivity sun公司制订的一种通用的数据库访问接口, 该接口由不同的数据库厂商来实现,这样一来, 开发人员可以使用相同的方式来访问不同的数据库。 2、三个重要的接口 1)Connection 2)Statement 3)ResultSet 3、编程步骤 step1, 加载驱动 1)什么是驱动? 由不同的数据库厂商实现jdbc接口对应的 java类压缩之后生成的.jar文件。 也就是说,访问某个数据库,就必须使用 该数据库对应的驱动。 2)驱动要放到build path对应的路径里面。 3)代码: Class.forName(String classname); forname方法:jvm依据classname找到 类的字节码文件(.class文件),然后将字节 码文件的内容读到方法区,生成一个 class对象。 step2, 获得连接 Connection conn = DriverManager. getConnection(String url,String username, String pwd); 注意: 1)getConnection方法会返回一个符合Connection 接口要求的对象,称之为连接对象。 2)如果连接对象获得了,则表示连接已经建立 成功。 step3,创建Statement Statement stat = conn.createStatement(); 注意: 1) createStatement()方法会返回一个 符合Statement接口要求的对象,该对象 可以理解为一个执行sql的容器。 step4,执行sql //执行查询 ResultSet rst = stat.executeQuery(String sql); //执行插入、删除、修改 int stat.executeUpdate(String sql); 注意: 1)executeUpdate方法返回值是一个整数, 表示该sql执行成功之后,受到影响的记录的 个数。 2)executeQuery方法返回的是一个 ResultSet(结果集),需要遍历。 step5, 如果是查询,需要遍历 ResultSet有一个next()方法,每执行一次 该方法,会返回一个true/false,如果值为true, 表示还有记录。 while(rst.next()){ rst.get***方法(比如 getString("name")) } step6, 关闭资源 rst.close() stat.close() conn.close() 4、mysql的使用 1)登录mysql (以root用户登录mysql) mysql -uroot; 2)查看当前有哪些数据库 show databases; 3)创建一个新的数据库 //创建了一个名叫jsd1306db的数据库, //并且设置缺省的字符集为utf8 create database jsd1306db default character set utf8; 4) 使用某个数据库 use jsd1306db; 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('tom','test',22); insert into t_user(username,pwd,age) values('mickey','test',23); insert into t_user(username,pwd,age) values('jerry','test',24); 如果是oracle数据库 insert into t_user values(t_user_seq.nextval,'tom','test',22); 注意: a, type=innodb: 让该表支持事务。 b, auto_increment: 自增长列,即 由数据库自动为这个列赋值(当插入 记录时,数据库会生成一个唯一的值)。 练习: 使用jdbc访问oracle数据库上的一张表 (t_user表),输出该表中所有的记录。 5、sql注入(了解) 所谓"sql注入",指的是一些用户可以通过输入一些 刻意构造的参数来改变sql语句的结构,从而达到 破坏系统的目的。比如,非法登录。 6、PreparedStatement接口 (预编译的Statement) 预编译的Statement有两个优点: 优点1: 防止sql注入,因为sql语句会在执行之前 先发送给数据库,数据库会生成执行计划。这个 sql语句不会因为后面给参数赋值而改变。 优点2: 执行多个结构相同的sql效率要高于 Statement。 1、DAO(Data access object 数据访问对象) (1)什么是DAO 封装了数据访问逻辑的模块。 (2)如何写一个DAO? step1, 写一个实体类 实体类与表对应,是为了方便实现对表中的记录 进行访问而设计的一个简单的java类。 step2, 写一个DAO类,在该类里面, 提供相应的数据访问方法。 2、如何控制事务 (1)什么是事务? 将多个操作当做一个原子操作来进行,要么 全部成功,要么全部失败。 (2)事务的四个特性 a, 原子性:多个操作要当做一个整体来进行,要么 全部成功,要么全部失败。 b,一致性:事务不管成功还是失败,不应该破坏 完整性约束(比如,主键不能为空)。 c,隔离性:多个并发的事务不应该相互影响。 d,持久性:事务成功之后,结果应该永久保存。 (3)jdbc当中,如何控制事务。 //禁止自动提交 //默认情况下,jdbc驱动会自动提交事务。 conn.setAutoCommit(false); //提交事务 conn.commit(); //回滚事务 conn.rollback(); 3、批处理 (1)什么是批处理? 将多个要执行的sql语句一次性地发送给数据库去执行。 (2)如何批处理? addBatch(): 将要执行的参数添加到PreparedStatement 对象上。 executeBatch(): 将PreparedStatement对象上保存的 参数发送到数据库,然后一次性地执行多条sql语句。 clearBatch(): 清空PreparedStatement对象上保存的 参数。 1、事务的封装 "买股票" step1, 建表 create table t_account( id int primary key auto_increment, accountNo varchar(16) unique, balance int )type=innodb; create table t_stock( id int primary key auto_increment, stockCode varchar(6) unique, qty int )type=innodb; insert into t_account(accountNo,balance) values('6225881003192000',1000); insert into t_stock(stockCode,qty) values('600015',0); unique:唯一性约束 step2, 实体类 Account类 Stock类 step3,DAO AccountDAO StockDAO step4, StockService 1)事务应该由业务类来控制 比如,买股票涉及到对资金帐户和股票帐户的操作 (AccountDAO和StockDAO),那么,事务应该由 业务类StockService来控制。 2) Threadlocal (线程局部变量) a, Threadlocal是什么 为每一个使用某个变量的线程维护一个 该变量值的副本。 b, 什么时候使用Threadlocal 如果一个线程调用了多个方法,要在多个方法 之间共享相同的数据,可以考虑使用Threadlocal。 比如:买股票这个案例当中,一个线程 需要调用AccountDAO,StockDAO的多个方法, 为了控制事务,需要这些方法共享同一个Connection 对象。 2、分页 (1)什么是分页 就是依据两个参数(每页多少条记录, 第几页)查询数据库,返回有限的记录。 (2)为什么要分页 如果不分页,当数据库中的记录很多, 那么一次性地查询所有记录,会严重 影响系统的性能。 (3)如何分页? mysql: select * from t_user limit ?,? 其中,第一个参数表示记录的序号(从0开始) 第二个参数表示每页多少条记录。 oracle: select * from (select a.*,rownum rn from (select * from t_user) a where rownum < ?) where rn > ? public List<User> findAll2(int rowsPerPages, int pages); int start = rowsPerPages * (pages - 1) + 1; int end = start + rowsPerPages; prep.setInt(1, end); prep.setInt(2,start); prep.executeQuery();1、xml是什么 (可扩展的标记语言) (1)是一种基于文本的通用的数据保存格式 a,通用 使用xml格式保存的数据,是与平台无关的。 也就是说,所有的语言都支持xml。 比如,我们可以使用java语言将一个对象( Point)保存到一个xml文件里面,另外一个用 c语言写的程序,可以很方便地读取这个xml文件。 b,数据保存格式 xml使用标记加内容的方式来保存数据。 比如: <point> <x>10</x> <y>20</y> </point> (2)发展历史 html (超文本标记语言)。 xml使用了html的基本语法,但是,更严格,并 且可扩展,使用范围也更广泛。 xhtml: 对html按照xml语法来加以约束。 2、xml的基本语法 1)元素 a,什么是元素? 标记和标记之间的内容,统称为元素。 b,一个xml文档,只有一个根元素。 c,元素可以嵌套 d,元素必须有开始标记和结束标记,如果是空 元素,可以简写为 <标记/>。 比如: <a></a> 是一个空元素,可以简化为<a/> e,元素可以有属性 比如: <point type="normal"> </point> 2)属性 a,属性用来表示元素的特性 b,属性值必须用引号括起来。 c,属性必须写在开始标记里面。 3)实体 a,什么是实体 有一些特殊的字符,比如 <, >, &, ', ", 对xml解析器有特殊的含义,需要使用相应的 字符来代替,这些用来代替的字符称之为实体。 比如,使用 < 来代替 <。 比如: <question> 1+2<3? </question> 解析器会认为 "<"号是一个开始标记,因为没有 ">"结束,会解析出错。 正确的写法: <question> 1+2 < 3? </question> b,常见的实体 < < > > & & ' ' " " 4) CDATA段 <![CDATA[ 不需要解析器解析的内容 ]]> 5) xml大小写敏感 建议,标记用小写;另外,如果一个标记有 多个单词,建议使用"-"连接。 比如: <cust-name> 3、xml解析 1) 主要的解析方式 a, sax: sun公司提供的一套相对比较底层的用来 解析xml的api。一般作为其它的一些解析工具的 底层的解析方式。sax解析的优点是需要的系统资源 非常少。但是编程比较麻烦。 b,dom: dom解析需要将整个xml文档读入到内存, 对系统资源的占用比较大。编程也比较麻烦。 c,一些开源的工具 : DOM4J,Digest,pull等等。 这些开源的工具编程相对sax,dom要更方便。 2)如何将一个java对象转换成一个xml文档 step1,将dom4j的jar文件加到build path。 step2, 先设计好xml文档的结构 一般来说,一个java类对应一个元素。 简单的类型,比如string,既可以作为属性,也 可以作为子元素来设计。复杂类型只能作为子元素 来设计。 3)如何将一个xml文档转换成一个java对象 4、dtd 5、xpath