201711671229 《Java程序设计》第十周学习总结

本周学习了第十一章的内容: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/26971/9323/2487
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值