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类常用方法
(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()方法执行之前的状态。
原标题:JSP学习笔记(6)
关键词:JS