版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,Java入门,4 Java数据库技术,4.1 MySQL和JDBC 4.2 使用JDBC 4.3 实例,4.1 MySQL和JDBC概述,MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一,对于一般的个人使用者和中小型企业来说,MySQL提供的功能绰绰有余。,创建数据库test: create database test 创建表hero:
2、 CREATE TABLE hero ( id int(11) AUTO_INCREMENT, name varchar(30) , hp float , damage int(11) , PRIMARY KEY (id) ) DEFAULT CHARSET=utf8; 插入一条记录盖伦到表中:insert into hero values (null, 盖伦, 616, 100) 查询所有数据:select * from hero 统计表中有多少条数据:select count(*) from hero 显示前5条数据:select * from hero limit 0,5 修改:upda
3、te hero set hp = 818 where id = 1 删除:delete from hero where id = 1,操作语句,4.1 MySQL和JDBC,JDBC(Java Database Connection,Java数据库连接)是一种用于执行SQL语句的JavaAPI(应用程序设计接口),它由一些Java语言写的类和界面组成。JDBC提供了一种标准的应用程序设计接口,使得开发人员使用Java语言开发完整的数据库应用程序变得极为简单。通过JDBC,开发人员几乎可以将SQL语句传递给任何一种数据库,而无需为各种数据库编写单独的访问程序。JDBC可以自动将SQL语句传递给相
4、应的数据库管理系统。,访问MySQL数据库需要用到第三方的类,这些第三方的类,都被压缩在一个叫做Jar的文件里。为了代码能够使用第三方的类,需要为项目导入mysql的专用Jar包。mysql-connector-java-5.0.8-bin.jar通常都会把项目用到的jar包统一放在项目的lib目录下 导包步骤: 右键project-property-java build path-libaries-add external jars,package jdbc; public class TestJDBC public static void main(String args) /初始化驱动
5、try /驱动类com.mysql.jdbc.Driver /就在 mysql-connector-java-5.0.8-bin.jar中 /如果忘记了第一个步骤的导包,就会抛出ClassNotFoundException Class.forName(com.mysql.jdbc.Driver); System.out.println(数据库驱动加载成功 !); catch (ClassNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); ,初始化驱动 通过Class.forName(com.my
6、sql.jdbc.Driver);初始化驱动类com.mysql.jdbc.Driver就在 mysql-connector-java-5.0.8-bin.jar中,JDBC扩展了Java的功能,例如在Applet中应用JDBC,可以实现与远程数据库的连接,实现不同平台数据库之间的对话。简单地说,JDBC完成下面三个操作: (1) 与一个数据库建立连接。 Connection con = DriverManager.getConnection(jdbc:odbc:CallCenter,sa,); (2) 向数据库发送SQL语句。 stmt = con.createStatement(); rs
7、 = stmt.executeQuery(SELECT CID,CPin from tCustomer WHERE CID=z1);,(3) 处理数据库返回的结果。 while(rs.next() String theInt = rs.getString(CID); String str = rs.getString(CPin); . ,4.2 使 用JDBC,JDBC的接口分为两个层次:一个是面向程序开发人员的JDBC API;另外一个是底层的JDBC Driver API。JDBC API 被描述成为一组抽象的Java接口,应用程序可以对某个数据库打开连接,执行SQL语句并且处理结果。最重
8、要的接口如下: java.sql.DriverManager:处理驱动的调入并且对产生新的数据库连接提供支持。 java.sql.Connection:代表对特定数据库的连接。 java.sql.Statement:代表一个特定的容器,以对一个特定的数据库执行SQL语句。 java.sql.ResultSet:控制对一个特定语句的行数据的存取。,其中java.sql.Statement又有两个子类型: (1) java.sql.PreparedStatement:用于执行预编译的SQL语句。 (2) java.sql.CallableStatement:用于执行对一个数据库内嵌过程的调用。 J
9、DBC Driver API是指java.sql.Driver接口,封装了不同数据库的驱动程序(像Access、Foxpro、SQL Server等)。由于它是数据库底层处理,所以必须提供对java.sql.Connection、java.sql. Statement、java.sql.PreparedStatement和java.sql.ResultSet的实现。,package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class
10、 TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver); / 建立与数据库的Connection连接 / 这里需要提供: / 数据库所处于的ip: (本机) / 数据库的端口号: 3306 (mysql专用端口号) / 数据库名称 how2java / 编码方式 UTF-8 / 账号 root / 密码 admin,连接数据库,/接上面的代码 Connection c = DriverManager.getConnection( jdbc:mysql:/12
11、:3306/test?characterEncoding=UTF-8, root, admin); System.out.println(连接成功,获取连接对象: + c); catch (ClassNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,package jdbc; import java.sql.Connecti
12、on; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver);,Statement是用于执行SQL语句的,比如增加,删除,Connection c = DriverManager.getConnection( jdbc:mysql:/:3306/test?ch
13、aracterEncoding=UTF-8, root, admin); / 注意:使用的是 java.sql.Statement / 不要不小心使用到: com.mysql.jdbc.Statement; Statement s = c.createStatement(); System.out.println(获取 Statement对象: + s); catch (ClassNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (SQLException e) / TODO Au
14、to-generated catch block e.printStackTrace(); ,package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver); Connection c = DriverM
15、anager .getConnection( jdbc:mysql:/:3306/test?characterEncoding=UTF-8, root, admin);,s.execute执行sql语句执行成功后,用mysql-front进行查看,明确插入成功,Statement s = c.createStatement(); / 准备sql语句 / 注意: 字符串要用单引号 String sql = insert into hero values(null,+提莫+,+313.0f+,+50+); s.execute(sql); System.out.println(执行
16、插入语句成功); catch (ClassNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,执行SQL语句之前要确保数据库test中有表hero的存在,如果没有,需要事先创建表,在回收垃圾语句后面加上下面语句 finally / 数据库的连接时有限资源,相关操作结束后,养成关闭数据库的好习惯 / 先关闭Statement if (s !=
17、 null) try s.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); / 后关闭Connection if (c != null) try c.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,数据库的连接是有限资源,相关操作结束后,养成关闭数据库的好习惯先关闭Statement后关闭Connection,package jdbc; impo
18、rt java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); ,使用try-with-resource的方式自动关闭连接,try
19、 ( Connection c = DriverManager.getConnection(jdbc:mysql:/:3306/test?characterEncoding=UTF-8, root, admin); Statement s = c.createStatement(); ) String sql = insert into hero values(null, + 提莫 + , + 313.0f + , + 50 + ); s.execute(sql); catch (SQLException e) / TODO Auto-generated catch bloc
20、k e.printStackTrace(); ,String sql = insert into hero values(null, + 提莫 + , + 313.0f + , + 50 + ); String sql = delete from hero where id = 5; String sql = update hero set name = name 5 where id = 3;,增、删、改语句,package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res
21、ultSet; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); try (Connection c = DriverManager.getConnection(jdbc:mysql:/:3306/test?
22、characterEncoding=UTF-8, root, admin); Statement s = c.createStatement();) ,executeQuery 执行SQL查询语句,String sql = select * from hero; / 执行查询语句,并把结果集返回给ResultSet ResultSet rs = s.executeQuery(sql); while (rs.next() int id = rs.getInt(id);/ 可以使用字段名 String name = rs.getString(2);/ 也可以使用字段的顺序 float hp = r
23、s.getFloat(hp); int damage = rs.getInt(4); System.out.printf(%dt%st%ft%d%n, id, name, hp, damage); / 不一定要在这里关闭ReultSet,因为Statement关闭的时候,会自动关闭ResultSet / rs.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,在取第二列的数据的时候,用的是rs.get(2) ,而不是get(1). 这个是整个Java自带的api里唯二的
24、地方,package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); ,Pre
25、paredStatement 也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement除此之外,还能能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接,String sql = insert into hero values(null,?,?,?); try (Connection c = DriverManager.getConnection(jdbc:mysql:/:3306/test?characterEncoding=UTF-8,root, admin); / 根据sql语句创建Prep
26、aredStatement PreparedStatement ps = c.prepareStatement(sql); ) / 设置参数 ps.setString(1, 提莫); ps.setFloat(2, 313.0f); ps.setInt(3, 50); / 执行 ps.execute(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,使用参数设置,可读性好,不易犯错 有预编译机制,性能比Statement更快 防止SQL注入式攻击,package jdbc; impo
27、rt java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC public static void main(String args) try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); try (Connection c = DriverManager
28、.getConnection(jdbc:mysql:/:3306/test?characterEncoding=UTF-8,root, admin); Statement s = c.createStatement();) / 有事务的前提下 / 在事务中的多个操作,要么都成功,要么都失败,使用事务 在事务中的多个操作,要么都成功,要么都失败通过 c.setAutoCommit(false);关闭自动提交使用 mit();进行手动提交,c.setAutoCommit(false); / 加血的SQL String sql1 = update hero set hp = hp
29、+1 where id = 22; s.execute(sql1); / 减血的SQL / 不小心写错写成了 updata(而非update) String sql2 = updata hero set hp = hp -1 where id = 22; s.execute(sql2); / 手动提交 mit(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,package charactor; public class Hero /增加id属性 public int id; pu
30、blic String name; public float hp; public int damage; ,ORM=Object Relationship Database Mapping对象和关系数据库的映射简单说,一个对象,对应数据库里的一条记录 例:根据id返回一个Hero对象 先构建一个Hero类,package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql
31、.Statement; import charactor.Hero; public class TestJDBC public static Hero get(int id) Hero hero = null; try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); try (Connection c = DriverManager.getConnection(jdbc:mysql:/:3306/test?characterEncoding=
32、UTF-8,root, admin); Statement s = c.createStatement();) String sql = select * from hero where id = + id;,ResultSet rs = s.executeQuery(sql); / 因为id是唯一的,ResultSet最多只能有一条记录 / 所以使用if代替while if (rs.next() hero = new Hero(); String name = rs.getString(2); float hp = rs.getFloat(hp); int damage = rs.getIn
33、t(4); = name; hero.hp = hp; hero.damage = damage; hero.id = id; catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); return hero; public static void main(String args) Hero h = get(22); System.out.println(); ,package jdbc; import java.util.List; public interfa
34、ce DAO /增加 public void add(T t); /修改 public void update(T t); /删除 public void delete(int id); /获取 public T get(int id); /查询 public List list(); /分页查询 public List list(int start, int count); ,DAO=DatabaseAccessObject数据库访问对象实际上就是运用了练习-ORM中的思路,把数据库相关的操作都封装在这个类里面,其他地方看不到JDBC的代码,package jdbc; import java
35、.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import charactor.Hero; public class HeroDAO ,把驱动的初始化放在了构造方法HeroDAO里:因为驱动初始化值需要执行一次
36、,所以放在这里更合适,其他方法里也不需要写了,代码更简洁。 提供了一个getConnection方法返回连接,所有的数据库操作都需要事先拿到一个数据库连接Connection,以前的做法每个方法里都会写一个,如果要改动密码,那么每个地方都需要修改。 通过这种方式,只需要修改这一个地方就可以了。 代码变得更容易维护,而且也更加简洁。,public HeroDAO() try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); public Connection get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年高职office办公软件操作(数据可视化)试题及答案
- 吉林省长春市汽开区2026-2027学年数学四上期末考试试题含解析
- 工业园区综合安全风险评估报告
- 士官安置考试题型及答案
- 地下水监测井工程竣工验收报告
- 流感考试题及答案
- 中国地质调查局局属单位招聘笔试真题2025
- 蚌埠固镇县谷阳镇招聘村居后备人才笔试真题2025
- 和美乡村人居环境提升建设方案
- 森林防火视频智能识别技术方案
- 新闻采访与写作-马工程-第二章
- 湖北邮政公司招聘笔试题目
- 质量月报模板(案例)
- DZ-T 0270-2014地下水监测井建设规范
- 2022-2023学年海南省海口市华侨中学高一英语上学期期末试卷含解析
- 现代综合评价方法和案例-配套教材
- GB/T 4450-1995船用盲板钢法兰
- 人教版小学数学六年级下册电子教案(表格式)
- GB∕T 30430-2019 气相色谱仪测试用标准色谱柱
- 2022乡镇公务员面试题解析
- 数控铣加工参数自动计算表
评论
0/150
提交评论