本周学习了第十一章的内容:JDBC与MySQL数据库
我们知道,许多应用程序都在使用数据库进行数据的存储与查询,MySQL数据库管理系统是应用开发中的主流数据库管理系统之一,而且是开源的。本周这章内容要介绍的就是Java与MySQL的综合应用。
重点:创建数据源和掌握JDBC连接的方法;实现查询功能
难点:预处理,事务
知识点总结:
MySQL最初由瑞典MySQL AB公司开发,目前由Oracle 公司负责源代码的维护和升级。
一、连接MySQL数据库
1 应用程序为了能和数据库交互信息,必须首先和MySQL数据库服务器上的数据库建立连接。常用的连接方式是加载JDBC-数据库驱动(连接器)(用Java语言编写的数据库驱动称作JDBC-数据库驱动),如下图:
Java运行环境将JDBC-数据库驱动转换为DBMS所使用的专用协议来实现的特定的DBMS交互信息。
2 加载JDBC-MySQL数据库驱动
应用程序负责加载的JDBC-MySQL数据库驱动,代码如下:
try{Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){}
MySQL数据库驱动被封装在Driver类中,该类的包名是com.mysql.jdbc,该类不是Java运行环境中的类,所以需要放置在jre的扩展中。
3 连接数据库
应用程序要和MySQL数据库服务器管理的数据库students(假设已建立了该数据库)建立连接,而有权访问数据库students的用户id和密码分别是root和空,java.sql包中DriverManager类有两个用于建立连接的类方法(static):
Connection getConnection(java.lang.String,java.lang.String,java.lang.String)
Connection getConnection(java.lang.String)
此处使用Connection getConnection(java.lang.String)方法,代码如下:
Connection con;
String uri="jdbc:mysql://192.168.100.1:3306/students?user=root&password=&useSSL=true";
//如果root用户密码是99,将&password=更改为&password=99即可
try{
con = DriverManager.getConnextion(uri); //连接代码
}
catch(SQLException e){
System.out.println(e);
}
如果使用Connection(java.lang.String,java.lang.String,java.lang.String)方法连接数据库:
4 汉字处理
如果数据库表中的记录有汉字,那么在建立连接时需要额外多传递一个参数characterEncoding,并取值gb2312或utf-8:
String uri="jdbc:mysql://localhost/students?useSSL=true&characterEncoding=utf-8";
con = DriverManager.getConnection(uri,"root",""); //连接代码
二、查询操作
1 向数据库发送SQL查询语句:
try{Statement sql=con.createStatement();
}
catch(SQLException e){}
2 处理查询结果
SQL查询语句对数据库的查询操作将返回一个ResultSet对象,ResultSet对象是按“列”(字段)组织的数据行构成:
ResultSet rs =sql.executeQuery("SELECT * FROM students");//查询结果显示所有字段
对于ResultSet rs =sql.executeQuery("SELECT name,height FROM students");//内存的结果集对象rs列数只有两列,第一列是name列,第二列是height列
ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,获得一行数据后,ResultSet对象可以使用getXxx方法获得字段值,将位置索引(第一列使用1,第二列使用2等)或列名传递给getXxx方法的参数即可;无论字段是何种属性,总可以使用getSString(int columnIndex)或getString(String columnName)方法返回字段值的串表示。
3 关闭连接
应用程序在使用ResultSet对象中的数据时,就必须保持和数据库的连接,直到应用程序将ResultSet对象中的数据查看完毕;
如果在代码 ResultSet rs = sql.executeQuery("SELECT * FROM students");之后立刻关闭连接,则调用 con.close();程序将无法获取rs中的数据。
4 顺序查询
所谓顺序查询,指ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,next()方法最初的查询位置,即游标位置,位于第一行的前面。next()方法向下 (向后、数据行号大的方向)移动游标,移动成功后返回true,否则返回false。
5 控制游标
为了得到一个可滚动的结果集,需使用如下方法获得一个Statement对象
Statement stmt = con.createStatement(int type,int concurrency);
然后,根据参数type、concurrency的取值情况,stmt返回相应类型的结果集:
ResultSet re = stmt.executeQuery(SQL语句);
type的取值决定滚动方式,取值如下:
--ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下滚动
--ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变
--ResultSet.TYPE_SCROLL_SENSITIVE:返回可滚动的结果集,当数据库变化时,当前结果集同步改变
Concurrency取值决定是否可以用结果集更新数据库,取值如下:
--ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表
--ResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表
滚动查询经常用到ResultSet的下述方法:
--public boolean previous():将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时返回false
--public void beforeFirst():将游标移到结果集的初始位置,即在第一行之前
--public afterrLast():将游标移动到结果集最后一行之后
--public void first():将游标移到结果集的第一行
--public void last():将游标移到结果集的最后一行
--public boolean isAfterLast():判断游标是否在最后一行之后
--public boolean isBeforeFirst():判断游标是否在第一行之前
--public boolean isFirst():判断游标是否指向结果集的第一行
--public boolean isLast():判断游标是否指向结果集的最后一行
--public int getRow():得到当前游标所指向的行号,行号从1开始,如果结果集没有行,返回0
--public boolean absolute(int row):将游标移到参数row指定的行
如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,当移动到第一行前面或最后一行后面时,该方法返回false
6 条件与排序查询
where子语句
--字段值和固定值比较:select name,height from mess where name='李四'
--字段值在某个区间范围: select * from mess where height>1.6 and height<=1.8
--使用某些特殊的日期函数,如year、month、day:select * from mess where year(birthday)<1980 and month(birthday)<=10
--使用某些特殊的时间函数,如hour、minute、second:selecr * from time_list where second(shijian)=56;
排序
--用order子语句对记录排序:select * from mess where name like '%林%' order by name
三、更新、添加与删除操作
Statement 对象调用方法
public int executeUpdate(String sqlStatement);通过参数sqlStatement指定的方式实现对数据库中记录的更新、添加和删除操作。
1 更新
update 表 set 字段 = 新值 where <条件子句>
2 添加
insert into 表(字段列表) values(对应的具体的记录)
或 insert into 表 values(对应的具体的记录)
3 删除
delete from 表名 where <条件子句>
---当返回结果集后,没有立即输出结果集的记录,而接着执行了更新语句,那么结果集就不能输出记录了。要想输出记录就必须重新返回结果集。
四、使用预处理语句
1 预处理语句的优点
Connection和某个数据库建立了连接对象con,那么con就可以调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据底层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用下列方法都可以使得该底层内部命令被数据执行。
ResultSet executeQuery()
boolean execute()
int executeUpdate()
2 使用通配符
在对SQL进行预处理时可以使用通配符?(英文问号)来代替字段的值,只要在预处理语句执行之前再设置通配符所代表的具体值即可:
String str = "select * from where height<? anf name=?"
PreparedStatement sql = con.prepareStatement(str);
//在sql对象执行之前,必须调用相应的方法设置通配符?代表的具体值
sql.setFloat(1,1.76f);
sql.setString(2,"武泽");
预处理语句设置通配符?的值的常用方法有:
--void setDate(int parameterIndex,Date x)
--void setDouble(int parameterIndex,double x)
--void setFloat(int parameterIndex,float x)
--void setInt(int parameterIndex,int x)
--void setLong(int parameterIndex,long x)
--void setString(int parameterIndex,String x)
五、通用查询
通用查询的目的是编写一个类,只要用户将数据库名、SQL语句传递给该类对象,那么该对象就用一个二维数组返回查询记录;为了编写通用查询,需要知道数据库表的列的名字,特别是表的列数。
结果集ResultSet对象rs调用getMetaData()方法返回一个ResultSetMetaData对象(结果集的元数据对象):
ResultSetMetaData metaData = rs.getMetaData();
metaData调用getColumnCount()方法就可以返回结果集rs中的列的数目:
int columnCount = metaData.getColumnCount();
metaData调用getColumnName(int i)方法就可以返回结果集rs中的第 i 列的名字:
String columnName = metaData.getColumnName(i);
六、事务
1 事务由一组SQL语句组成,所谓事务处理指:应用程序保证事务中的SQL语句要么全部执行,要么一个都不执行。
2 JDBC事务处理步骤:
--用setAutoCommit(boolean b) 方法关闭自动提交模式
即关闭SQL语句的即时生效性。
--用commit()方法处理事务
--用rollbsck()方法处理事务失败
个人总结:
孰能生巧,多看多练多写程序。主要需要熟练连接数据库以及能够用Java语言进行查询操作。
学习进度条:
代码行数(新增/累计) | 博客量(新增/累计) | 学习时间(新增/累计) | |
目标 | 5000行 | 30篇 | 400个小时(24000分钟) |
第九周 | 763/2697 | 1/9 | 323/2487 |