你的位置:首页 > Java教程

[Java教程]JSP学习笔记(6)


1.连接MySQL数据库

1.1.JDBC

JDBC(Java Database Connectivity)提供了访问数据库的API,由一些Java类和接口组成,是Java运行平台核心库中的一部分。用Java语言编写的数据库驱动程序称为JDBC数据驱动程序。

也就是说使用JDBC可以达到通过JDBC实现应用程序操纵数据库的效果。

使用JDBC进行如下操作:

  • 与一个数据库建立连接
  • 向已经连接的数据库发送SQL语句
  • 处理SQL语句返回的结果

1.2.连接

JDBC可以调用本地的JDBC数据库驱动程序和相应的数据库建立连接,一般有如下步骤:

(1)加载JDBC数据库驱动程序

不同数据库厂商提供了不同的JDBC驱动程序,想要连接操作数据库时,就必须下载相应的JDBC。比如MySQL的JDBC可以去mysql的官网下载,将下载到的JDBC数据库驱动程序(mysql-connector-java*.jar)复制到Tomcat所使用的JDK的拓展目录中(../jre/lib/ext),或者复制到tomcat的安装目录/common/lib下。

//应用程序加载MySQL的JDBC数据库驱动程序代码try{   Class.forName("com.mysql.jdbc.Driver");}catch(Exception e){}

(2)与指定的数据库建立连接

Java.sql包中的DriverManager类中有两个用于建立连接的类方法(static方法):

Connection getConnection(java.lang.String,java.lang.String,java.lang.String)Connection getConnection(java.lang.String)

它们都会抛出SQLException异常。DriverManger类调用上面的方法可以和数据库建立连接,返回一个connection对象。

假设mysql服务正常启动,其服务器ip为192.3.4.5,使用默认端口3306,用户pinnsvin的密码是pinnsvin,并且对数据库test有所有权限,那么建立连接代码如下:

//使用三个参数的方法try{ String uri="jdbc:mysql;//192.3.4.5:3306/test"; String user="pinnsvin"; String password="pinnsvin"; con=DriverManager.getConnection(uri,user,pass);}catch(SQLException e){ System.out.println(e);}//使用一个参数的方法try{ String uri="jdbc:mysql://192.3.4.5:3306/test?user=pinnsvin&password=pinnsvin"; con=DriverManger.getConnection(uri);} catch(SQLException e){ System.out.println(e);}

1.3.乱码解决

(1)数据库和表使用中文支持的字符编码

关于在DBMS中设置编码方式可以参考MySQL设置字符编码一文.

(2)连接数据库支持中文编码

try{ Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){
 System.out.print(“忘记把mysql数据库的JDBC驱动程序复制到JDK的拓展目录或tomcat*/common/lib中了");
}
try{ String uri="jdbc:mysql://127.0.0.1/test?user=pinnsvin&password=pinnsvin&characterEncoding=utf8"; con=DriverManager.getConnection(uri);}catch(SQLException e){ System.out.print(e);}

2.查询记录

和数据库建立连接后,就可以使用JDBC提供的API与数据库交互信息,比如查询、插入、更新、删除数据库表中数据以及对标的操纵。

2.1.结果集与查询

数据库的查询结果会返回到一个Resquest对象中,习惯上称Request对象为结果集对象。

(1)SQL语句对象

使用Statement声明一个SQL语句对象,然后让已创建连接的对象con调用方法createStatement() 创建这个SQL语句对象,代码:

try{ Statement sql=con.createStatement();}catch(SQLException e){ System.out.print(e);}

(2)SQL语句对象调用方法查询数据

SQL语句对象可以调用相应的方法查询数据库中的表,并将查询结果放在一个Resquest结果集中。例如:

Resquest rs=sql.executeQuery(“SELECT name,sex FROM user”);

结果集对象rs有两列,第一列是name,第二列是sex。

Request结果集一次只能看一个数据行,使用next()方法走到下一行。

Request类常用方法

未标题-1

(3)获取结果集列的数目

ResultSetMetaData(结果集的元数据对象)

ResultSetMetaData md=rs.getMetaData();int colcount=md.getColumnCount();

(4)获取结果集第i列的名字

ResultSetMetaData md=rs.getMetaData();String colname=md.getColumnName(i);

2.2.随机查询

有时候我们需要一个可滚动的结果集,为了获取一个滚动的结果集,必须先获得一个Statement对象,然后根据参数type,concurrency的取值情况,返回相应的类型的结果集。

Statement stmt=con.createStatement(int type,int concurrency);Request 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能用结果集更新数据库中的表

滚动查询常用方法:

public boolean previous()将游标向上移动,当移动到结果集第1行的前面时返回false
public void beforeFirst()将游标移动到结果集的初始位置,第一行之前
public void afterLast()将游标移动到结果集最后一行之后
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取负值,就是倒数的行数

3.操纵数据

3.1.添加、更新、删除记录

使用SQL语句添加、更新、删除纪录。Statement对象调用public int executeUpdate(String sqlStatement)方法通过参数sqlStatement指定的方式实现向数据库表中添加、更新、删除纪录。

添加

executeUpdate("INSERT INTO user VALUES('007','邦德');

更新

executeUpdate("UPDATE user SET name='詹姆斯·邦德'");

删除

executeUpdate("DELETE FROM user WHERE id='007'");

3.2.用结果集操作数据库中的表

如果熟悉数据库的DML语句,不必使用这种方式,使用结果集操作数据库表必须先返回结果集。为了避免中文乱码,数据的连接方式中需要加入characterEncoding=uft8或gb2312或gbk。例如:

try{ Class.forName("com.mysql.jdbc.Driver");}catch(Exception e){ System.out.print("缺失JDBC驱动程序");}try{ String uri="jdbc:mysql://127.0.0.1/test?"+"user=pinnsvin&password=pinnsvin&characterEncoding=utf8"; //默认端口可以省略,使用+为了使代码清晰 con=DriverManager(uri); Statement sql=con.createStatement(ResultSet.TYPE_SCRO;;_SECSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs=sql.executeQuery("SELECT * FORM user");}catch(SQLException e){ System.out.print(e);}

3.2.1.更新

使用结果集更新数据库表中第n行记录中某列的值:

(1)使结果集rs的游标移动到第n行

          rs.absolute(n);

(2)结果集更新第n行第m列的值,可以使用下面的方法更新列值

updateInt(String columnName,int x)updateInt(int columnIndex,int x)
updateLong(String columnName,long x)updateLong(int columnIndex,long x)
updateDouble(String columnName,double x)updateDouble(int columnIndex,double x)
updateString(String columnName,String x)updateString(int cloumnIndex,String x)
updateBoolean(String columnName,Boolean x)updateBoolean(int columnIndex,Boolean x)
updateDate(String columnName,Date x)updateDate(int columnIndex,Date x)

(3)结果集调用updateRow方法用结果集中的第n行更新数据库中第n行记录

例:更新user表中第4行记录的name列的值

rs.absolute(4);rs.updateString(2,"杰森斯坦森");//也可rs.updateString("name","杰森斯坦森");rs.updateRow();

3.2.2.插入

(1)使用moveToInsertRow()方法将结果集rs的游标移动到插入行

(2)使用updateXxx()方法更新列值

(3)结果集调用insertRow()方法用结果集中的插入行向数据库表中插入一行新纪录

4.预处理语句

Java提供了更高效的数据库操作机制,就是PreparedStatement对象,也就是预处理语句对象。

4.1.为什么使用预处理语句呢?

当向数据库发送一个SQL语句,数据库库中的SQL解释器负责将SQL语句生成底层的内部命令,然后执行该命令,完成有关的数据操作。如果不断的向数据库发送SQL语句就会增加数据库中SQL解释器的负担,影响执行速度。如果应用程序能针对连接的数据库,事先将SQL语句解释为底层的内部命令,然后直接然数据库执行这个命令,这样会降低解释器的压力,并且提高访问速度。

4.2.如何使用预处理语句?

使用Connection连接对象调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象pre中,pre可以调用下面的方法执行内部命令:

ResultSet executeQuery()

boolean execute()

int executeUpdate()

4.3.使用通配符

在对SQL进行预处理时可以使用通配符“?”来代替字段的值,必须在语句执行前设置通配符代表的值。

prepareStatement pre=con.prepareStatement("SELECT * FROM user WHERE age<?");pre.setInt(1,18);//设置第一个通配符的值为18

5.事务

5.1.什么是事务?

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。事务是保证数据库中数据完整性与一致性的重要机制。

5.2.JDBC事务处理步骤

5.2.1.setAutoCommit(boolean autoCommit)方法

使用setAutoCommit(boolean autoCommit)方法关闭自动提交模式。

因为和数据库建立连接的对象con的提交模式是自动提交模式,即该连接con产生的Statement或PreparedStatement对象对数据库提交任何一个SQL语句操作会立即生效。为了能进行事务处理必须关闭con的自动提交模式(默认)。

con.setAutoCommit(false);

5.2.2.Commit()方法

con调用commit()方法可以让事务中的SQL语句全部生效。如果事务中任何一个SQL语句没有生效,就会抛出SQLException异常。

5.2.3.rollback()方法

在处理SQLException时,con必须调用rollback()方法,它的作用是:撤销引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commit()方法执行之前的状态。