




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章数据库编程本章目录8.1JDBC基础8.2MySQL的使用8.3JDBC编程示例8.4数据库连接池技术8.5Web数据库编程8.6本章小结8.1 JDBC基础 JDBC(JavaDatabaseConnectivity)是Sun公司提供的一套数据库编程接口API(ApplicationProgrammingInterface)函数,它由一组用Java编程语言编写的类和接口组成。举例1:建库建表2:新建java工程3:编写程序,加载驱动4:建立连接5:发送sql语句6:获取结果集并读出。8.1 JDBC简单举例8.1 JDBC简单举例——准备:常用MySql命令进入命令行模式:Cmd启动mysql服务:netstartmysql登陆:mysql–u用户名-p(回车)再输入密码(前提是把mysql的路径加入环境变量path中)显示所有数据库:showdatabases;创建数据库:createdatabasedbtest;删除数据库:dropdatabasedbtest;删除表:droptableperson;转到要操作的数据库:use数据库名;显示所有表格:showtables;8.1 JDBC简单举例——1.建表CREATEDATABASEdbtestCHARACTERSETutf8createtableperson(idintunsignednotnullauto_increment,namevarchar(20) notnull,passwordvarchar(20)notnull,ageintunsigned,primarykey(id))defaultcharset=utf8;添加数据:insertintoperson(name,password,age) values("老大","1234",12),("老二","1234",11),("老三","1234",10),("老四","1234",9),("老五","1234",8);
insertintoperson(name,password,age) values(“lfirst","1234",12),(“second","1234",11),(“three","1234",10),(“four","1234",9),(“five","1234",8);insertintoperson(name,password,age) values("lfirst","1234",12),("second","1234",11),("three","1234",10),("four","1234",9),("five","1234",8);注意:字符集是utf8,不是utf-8解决mysql的中文乱码问题1:mysql5.1/my.ini,修改里面所有default-character-set=utf82:保证建库与建表都是用utf83:数据库连接时url:jdbc:Mysql://localhost:3306/dbtest?useUnicode=true&characterEncoding=utf-84:因为默认情况下,中文windows系统cmd.exe里的代码页是GBK,不能显示全部UTF8字符,所以在字符终端里看到乱码是正常现象,但通过程序的添加和查询可以看到数据能正常添加了。总之:把以上配置改成字符集gbk也可;8.1 JDBC简单举例-代码加载驱动 在项目下创建lib文件夹,拷贝mysqljdbc驱动进来,右击buildpath-addtobuildpath driver:com.mysql.jdbc.Driver url:jdbc:Mysql://localhost:3306/dbtest?useUnicode=true&characterEncoding=gbk课堂练习:代码:public
static
voidmain(String[]args){
try{Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:Mysql://localhost:3306/dbtest?useUnicode=true&characterEncoding=gbk";Stringname="root";Stringpassword="123456";Connectioncon=DriverManager.getConnection(url,name,password);Statementst=con.createStatement();ResultSetrs=st.executeQuery("select*fromperson");while(rs.next()){System.out.print(rs.getObject(1)+"");System.out.print(rs.getObject(2)+"");System.out.print(rs.getObject(3)+"");System.out.println(rs.getObject(4));}rs.close();st.close();con.close();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}实现添删改查(利用junit)Select*frompersoninsertintoperson(name,password,age)values('大哥','1234',34)updatepersonsetname='小弟'wherename='大哥'deletefrompersonwherename='小弟‘课堂练习:jdbc_teach/test/MysqlTest.java Java程序员通过调用JDBCAPI实现连接数据库、执行SQL语句并返回结果集等编程数据库的能力,它主要是由一系列的接口和类定义所构成。 如:DriveManager、Connection、Statement、PreparedStatement、ResultSet。
8.1.1JDBCAPIDriveManager类用于加载驱动,并创建与数据库的连接。1:加载驱动Class.forName("com.mysql.jdbc.Driver");Class.forname:显示的加载驱动程序类。2:建立连接
Connectionconn=DriverManager.getConnection(url,username,password);
8.1.1JDBCAPI-1.DriverManager
Stringurl="jdbc:MySql://localhost:3306/dbtest?useUnicode=true&characterEncoding=gbk";协议主机名和端口号(如果是本机是3306端口,可默认不写,变成jdbc:MySql:///dbtest?...)数据库名参数其中url用来标识数据库的位置。常用数据库URL地址写法:Oracle:"jdbc:oracle:thin:@localhost:1521:dbtest“SqlServer:"jdbc:sqlserver://localhost:1433;databaseName=dbtest“常用参数(最好要指定):useUnicode=true&characterEncoding=gbk如果程序数据是用gbk编码的,该属性保证不管数据库用的是什么编码保存数据,数据都能正确的保存与读取。其中&就是&的转义字符。8.1.1JDBCAPI—1.DriverManager补充解释:常用属性:useUnicode=true&characterEncoding=gbk如果mysql数据库用的是utf-8,项目用的是GBK1.存数据时:
数据库在存放项目数据的时候会先用GBK格式将数据解码成字节码,然后再将解码后的字节码重新使用UTF-8编码存放到数据库中。2.取数据时:
在从数据库中取数据的时候,数据库会先将数据库中的数据按UTF-8格式解码成字节码,然后再将解码后的字节码重新按GBK格式编码数据,最后再将数据返回给客户端。注意:在xml配置文件中配置数据库url时,要使用&的转义字符也就是&8.1.1JDBCAPI—1.DriverManager二、Connection接口代表与数据库之间的连接,客户端与数据库之间的交互都是通过connection对象完成的。Connectionconn=DriverManager.getConnection(url,username,password);
8.1.1JDBCAPI—2.Connectionstatement对象
Statement对象用于将sql语句发送到数据库管理系统中。它用于执行静态的sql语句(运行之前是确定了访问哪些表哪些列),返回执行的结果。创建statement方法:Statementstmt=con.createStatement();Statement接口提供了执行SQL语句的方法:
Stmt.executeQuery(“select*fromperson") 返回结果集resultset Stmt.executeUpdate(updatepersonsetage=24whereid=1) 用于执行添删改(返回影响的行数),及DDL(如:createtable或droptabled等,返回0)
Stmt.execute()
都可执行,但返回boolean值注意:sql注入式攻击select*frompersonwherename=''or1=1orname=''andpassword='1234'8.1.1JDBCAPI—3.statementPreparedStatement继承于statement,两者区别:代码的可读性和可维护性更好提高性能因其包含已编译的SQL语句,语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行.提高了安全,防止了sql注入式攻击。总之:始终以PreparedStatement代替Statement.
8.1.1JDBCAPI—4.Preparedstatement创建PreparedStatement对象
Stringstrsql="select*frompersonwhereid=?"; PreparedStatementpstmt=conn.prepareStatement(strsql);为PreparedStatement对象提供参数pstmt.setInt(1,1);第一个参数代表第几个”?”参数第二个参数代表参数的赋值。执行 ResultSetrs=pstmt.executeQuery();
executeQuery():返回结果集
executeUpdate():返回操作语句影响的行数,若是DDL返回0。课堂练习:把增删改查改成preparedstatement8.1.1JDBCAPI—4.Preparedstatement 一个ResultSet对象对应着一个查询结果集,我们可以将这个结果集看成一个表。遍历该结果集
while(rs.next()){…获得检索结果...}//ResultSet对象有一个指向当前行的指针,这个指针默认的初始位置指向第一行之前.Result.next()使这个指针向下移动一行,返回一个boolean型的值,该值若为true,,说明结果集中还存在下一条记录,并且指针已经成功指向该记录,可以对其进行处理;若返回值是false,则说明没有下一行记录,结果集已经处理完毕。获得检索结果
getXXX()方法可以从某一列中获得检索结果。其中XXX是JDBC中的Java数据类型,如int,、String、Date等,分两种:
getXXX(“列名”),getXXX(“列的索引int值,从1开始”)8.1.1JDBCAPI—5.resultSet8.1.1JDBCAPI小提示:Statement或PreparedStatement每次执行SQL语句都会关闭上一次得到的ResultSet结果集。因此,在重新执行SQL语句之前,请先完成对上次得到的ResultSet对象的处理。Tip:释放资源Jdbc程序运行完后,切记要释放程序在运行过程中创建的与数据库进行交互的对象,这些对象是:resultSet,Statement和connection(释放的顺序与创建的顺序相反),释放代码要放在finally语句中。举例:8.2做jdbcUtils8.4数据库连接池技术传统模式:创建数据库连接——SQL操作——断开连接缺点:要为每一次客户请求建立一个数据库连接,对于web应用来讲,如果短时间之内并发访问的连接数很多,对于服务器的系统开销是相当大的,会影响服务器的访问速度。数据库连接池可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。连接池的工作原理1.连接池在初始化时创建一定数量的数据库连接放到连接池中,这里的“一定数量”是指连接池的最小连接数。无论这些数据库连接是否被应用程序所使用,连接池都将一直保证至少有这么多的连接处于连接池中。2.当应用程序向数据库连接池发送连接请求时,只要连接池中有处于空闲状态的连接,就可以直接取出来使用。如果超过最小连接数了,连接池会创建新的连接。这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。3.当应用程序向连接池请求的连接已经超过了最大连接数时,这些请求将被加入到等待队列中,直到前面有使用完的连接被放回到连接池里,处于空闲状态,才可以继续使用这些连接。4.当数据库连接的空闲时间超过最大空闲时间,则由连接池来彻底释放这些连接,以此来避免因为没有释放而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。注意:1.最小连接数是连接池一直保持的数据库连接数,如果设置过大,而应用程序对数据库连接的使用量很小,那么将会有较多的数据库连接资源被浪费;如果设置过小,远小于日常的访问量,那么连接池将要频繁地创建新连接,浪费服务器资源。
2.最大连接数是连接池能容纳连接的最大数目,如果设置过小,而数据库连接请求数经常超过这个数目,那么将会经常有请求被加入到等待队列中,这会影响整个应用系统的访问效率;如果设置过大,超过服务器内存的负荷,反而可能导致服务器宕机。8.4数据库连接池技术Datasource简介Datasource负责建立与数据库的连接。DataSource对象通常是由servlet容器提供的,因此Java程序无需自己创建DataSource对象,而只要直接使用servlet容器提供的DataSource对象,那么Java程序如何获得Servlet容器提供的DataSource对象的引用,这要依赖JNDI(JavaNamingandDirectoryInterface)技术。JNDIJNDI:一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字绑定,外部程序可以通过名字来获得某个对象的引用。在javax.naming包中提供了context接口。bind(StringName,Objectobject);―将对象和名字绑定Objectlookup(StringsName)返回与指定的名字绑定的对象。1:建工程2:导包(mysql-connector-java-5.1.22-bin.jar)(记得不仅在项目里添加,tomcat的lib目录下也要添加)3:建立context.xml(在“WebRoot/META-INF”下,新建context.xml文件。
)<?xmlversion="1.0"encoding="UTF-8"?><Contextdebug="5"reloadable="true"><Resourcename="jdbc/mysql"auth="Container"type="javax.sql.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论