第8章 JSP 中使用数据库

       

目录

8.1 MYSQL 数据库管理系统

8.1.1 下载、安装 MYSQL

8.1.2 启动 MYSQL

8.1.3 MYSQL 客户端管理工具

8.2 连接 MYSQL 数据库

8.4 更新、添加与删除记录

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

8.6 预处理语句   

8.7 事务

8.8 分页显示记录

8.9 连接 SQL Server 与 Access

8.9.1 连接 Microsoft SQL Server 数据库

8.10 使用连接池

8.10.1 连接池简介

8.10.2 建立连接池


        在许多 Web 应用中,服务器需要和用户进行必要的数据交互。例如,服务器需要将用户提供的数据永久、安全地保存在服务器端,需要为用户提供数据查询等,此时,Web 应用就可能需要和数据库打交道,其原因是数据库在数据查询、修改、保存、安全等方面有着其他数据处理手段无法替代的地位。许多优秀的数据库管理系统在数据管理,特别是在基于 Web 的数据管理方面在扮演着重要的作用。

8.1 MYSQL 数据库管理系统

        MYSQL 数据库管理系统,简称 MYSQL,是目前流行的开源数据库管理系统,其社区版是可免费下载的开源数据库管理系统。MYSQL 最初由瑞典 MYSQL AB 公司开发,目前由 Oracle 公司负责源代码的维护和升级。Oracle 将 MYSQL 分为社区版和商业版并开放源码。

8.1.1 下载、安装 MYSQL

        MYSQL 是开源项目,很多网站都提供免费下载。可以使用任何搜索引擎搜索关键字:“MYSQL 社区版下载”获得有关的下载地址,下载和安装就不过多进行讲解,详情可以查看百度教程进行下载、安装。

8.1.2 启动 MYSQL

1、初始化:

   执行初始化操作,首先进入mysql的bin目录,在cmd窗口中执行命令。

mysqld --initialize --console
初始化会生成一个data目录,如果data目录已经存在,则需要删除data目录后再执行命令。

在执行初始化操作过程中会显示一个临时生成的口令。

使用mysqld --install 将mysql添加到系统服务中,默认当机器启动时会自动启动mysql服务

2、启动数据库服务:

使用net start mysql启动数据库服务

使用命令mysql -uroot -p 打开客户端连接已经启动的数据库服务,这里需要输入上面生成的临时口令

修改口令alter user 'root'@'localhost' identified with mysql_native_password by '新口令'

3、关闭服务器net stop mysql

4、删除mysql系统服务mysqld --remove

8.1.3 MYSQL 客户端管理工具

        所谓 MYSQL 客户端管理工具,就是专门让客户端在 MYSQL 服务器上建立数据库的软件。可以下载图形用户界面的 MYSQL 管理工具,并使用该工具在 MYSQL 服务器上进行创建数据库、在数据库中创建表等操作,MYSQL 管理工具有免费的。读者可以在搜索引擎中搜索 MYSQL 客户端管理工具,选择一款 MYSQL 金额护短管理工具。

        MYSQL 管理工具必须和数据库服务器建立连接后,才可以建立数据库及相关操作。因此,在使用客户端管理工具之前须启动 MYSQL 数据库服务器。

1、命令行客户端 

        启动 MYSQL 数据库服务器后,也可以用命令行方式创建数据库。为了地洞命令行客户端,须打开一个新的命令行窗口,进去 MYSQL 安装目录下的 bin 子目录。执行 mysql.exe,即启动命令行客户端。执行格式为:

mysql -h ip -u root  -p

        对于本机调试,执行格式为:

mysql  -u  root  -p

        然后按要求输入密码即可。如果在远程的数据库服务器,建立数据库或管理数据库,执行格式为:

mysql  -h  192.168.0.0  -u  root  -p

然后按要求输入密码即可。

        成功启动命令行客户端后,MS-DOS 窗口出现“mysql>”字样效果。如果想关闭命令行客户端,输入 exit 即可。

2、创建数据库

        启动命令行客户端后就可以使用 SQL 语句进行创建数据库、建表等操作。在 MS-DOS 命令行窗口输入 SQL 语句需要用“;”号结束,在编辑 SQL 语句的过程中可以使用 \c 终止当前 SQL 语句的编辑。需要提醒的是,可以把一个完整的 SQL 语句命令分成几行来输入,最后用分号做结束标志即可。

        下面是用命令行客户端创建一个名字为 Book 的数据库。在当前命令行客户端的命令行窗口输入创建数据库的 SQL 语句:

create database bookDatabase;

如果数据库已经存在,将显示数据库已经存在,不再创建数据库,否则将创建数据库。如果删除已有数据库,比如数据库 bookDatabase,执行:

drop database bookDatabase;

3、建表

        创建数据库后就可以使用 SQL 语句在该库中创建表。为了在数据库中创建表,必须首先进入该数据库,命名格式是:“user 数据库名;”或“user 数据库名”。在当前命令行客户端管理工具占用的命令行窗口输入:

use bookDatabase

回车确认进入数据库。

4、删除数据库或表

        删除数据库的命令:drop databse<数据库名>,例如删除名为 tiger 的数据库:

drop databse tiger;

删除比哦的命令:drop table<表名>,例如使用 bookDatabase 数据库后,执行:

drop table bookList;

将删除 bookDatabase 数据库中的 bookList 表。

5、使用 Navicat for MYSQL

        使用图形用户界面的 MYSQL 客户端管理工具,可以更加方便地创建数据库、在数据库中创建表等。具体下载方式可以在搜索引擎中查找。

8.2 连接 MYSQL 数据库

        MYSQL 数据库服务器启动后,应用程序为了能和数据库建立连接、交互信息,需要获得数据库驱动,即连接器。

1、下载 JDBC-MYSQL 数据库连接器

        应用程序为了能访问 MYSQL 数据库服务器上的数据库,必须要保证应用程序所驻留的计算机上安装有相应的 JDBC-MYSQL 数据库连接器。直接在浏览器进行搜索可以下载配置。

2、加载 JDBC-MYSQL 数据库连接器

        应用程序负责加载的 JDBC-MYSQL 连接器,代码如下:

try{    class.forName("com.mysql.cj.jdbc.Driver");

}

catch(Exception e){}

        MYSQL 数据库驱动是 mysql-connector-java-8.0.18.jar 文件中的 Driver 类,该类的包名是 com.mysql.cj.jdbc.Driver。Driver 类不是 JAVA 运行环境类库中的类,是连接器 mysql-connector-java-8.0.18.jar 中的类。

3、连接数据库 

        java.sql 包中的 DriverManager 类有两个用于建立连接的类方法:

(1)Connection getConnection

                                                (java.lang.String,java.lang.String,java.lang.String)

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

        上述两个方法都可能抛出 SQLException 一场,DriverManager 类调用上述方法可以和数据库建立连接,即可返回一个 Connection 对象。

        为了能和 MYSQL 数据库服务器管理的数据库建立连接,必须保证该 MYSQL 数据库服务器已经启动,如果没有更改过 MYSQL 数据库服务器的配置,那么该数据库服务器占用的端口是3306.假设 MYSQL 数据库服务器所驻留的计算机的 IP 地址是 192.168.100.1 运行 ipconfig 可以得到当前计算机的 IP 地址。

        应用程序要和 MYSQL 数据库服务器管理的数据库 Book 建立连接,而有权访问数据库 Book 的用户的 id 和密码分别是 root 和空。建立连接的代码如下:

Connection con;
String url = 
"jdbc:mysql://192.168.100.1:3306/Book?useSSL = false&serverTimezone = GMT";
String user = "root";
String password = "";
try{
    con = DriverManager.getConnection(url,user,password);
}
catch(SQLException e){
    System.out.println(e);
}

应用程序和某个数据库建立连接之后,就可以通过 SQL 语句和该数据库中的表交互信息,比如查询、修改、更新表中的记录。

4、注意汉字问题

        需要特别注意的是,如果数据库的表中的记录有汉字,那么在建立连接时需要额外多传递一个参数 characterEncoding,并取值 GB2312 或 UTF-8:

String url = 
"jdbc:mysql://localhost/bookDatabase?"+
"useSSL = false&serverTimezone = GMT&characterEncoding = utf-8";
con = DriverManager.getConnection(url,"root","");

8.3 查询记录 

1.结果集与查询:
        让连接对象con调用方法createStatement()创建执行SQL语句的Statement对象:

Statement sql=con.createStatement();
sql对象就可以调用相应的方法,实现对数据库中表的查询和修改,并将查询结果存放在一个ResultSet类声明的对象中:

ResultSet rs=sql.executeQuery("SELECT * FROM product"); 
//product为表名

2、结果集的列名与列的数目
        程序查询的时候,希望知道数据库表的字段(列)的名字以及表的字段的个数,那么一个办法是使用返回到程序中的结果集来获取相关的信息。

(1) 得到元数据对象metaData
 ResultSetMetaData metaData = rs.getMetaData();
(2)得到结果集的列的个数,即共有几列
int columnCount = metaData.getColumnCount();
(3)结果集rs中的第i列的名字:
 String columnName = metaData.getColumnName(i);
3、随机查询
        使用Result的next()方法顺序地查询数据,为了得到一个可滚动的结果集,必须使用下述方法先获得一个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_UPDATETABLE:
能用结果集更新数据库中的表。
select… from 表 where 字段 满足的条件

4、条件查询

select * from product where price > 2000 and price<5000
select * from product where name = 'java'

模糊查询,使用“%”表示零个或多个字符,用“_”表示任意一个字符:

select * from  product where name like '李%' 
5、排序查询
        可以在SQL语句中使用ORDER BY子语句,对记录排序。

例如,按总成绩排序查询的SQL语句:

SELECT * FROM student ORDER BY 总分
6、更新、添加、删除记录
Statement对象调用方法:

public int executeUpdate(String sqlStatement);

实现对数据库表中记录的字段值的更新、添加和删除记录。

8.4 更新、添加与删除记录

        Statement对象调用方法:

public int executeUpdate(String sqlStatement);
实现对数据库表中记录的字段值的更新、添加和删除记录。

executeUpdate("UPDATE product SET price = 6866 WHERE name='海尔电视机'");
executeUpdate("INSERT INTO students VALUES ('012','神通手机’,'2015-2-26',2687)");
executeUpdate("DELETE  FROM product WHERE number = '888' ");

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

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

1、结果集rs的游标移动到第n行
rs.absolute(n);
2、结果集将第n行的某列的列值更新
例如 更新列名是columnName的日期值是x指定的值:
updateDate(String columnName, Date x);
3、更新数据库中的表
最后,结果集调用updateRow()方法用结果集中的第n行更新数据库表中的第n行记录。
以下代码片段更新product表中的第3行记录的name列(字段)的值。

rs.absolute(3);
rs.updateString("name", "IBM PC");
rs.updateRow();

使用结果集向数据库表中插入(添加)一行记录步骤是:

1、结果集rs的游标移动到插入行(用于构建要插入的行的暂存区域)
rs.moveToInsertRow();

2、更新插入行的列值
例如:

rs.updateString(1, “c002”);
rs.updateString(2, “IBM iPad”);
rs.updateDate(3,Date());
rs.updateDouble(4, 5356);

3、插入记录
最后,结果集调用 insertRow() 方法用结果集中的插入行向数据库表中插入一行新记录。


8.6 预处理语句   

        对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么 con就可以调用

prepareStatement(String sql)

那么pre 对象可以随时调用下列方法都可以使得该底层内部命令被数据库执行,提高了数据库的访问速度:

boolean execute()
int executeUpdate()
ResultSet executeQuery()

在对SQL进行预处理时可以使用通配符“?”来代替字段的值

prepareStatement pre=
con.prepareStatement("SELECT * FROM product WHERE price < ? ");

调用相应的方法设置通配符“?”,代表具体的值
pre.setDouble(1,6565);
指定上述预处理语句pre中第1个通配符“?”代表的值是 6565
预处理语句设置通配符“?”的值的常用方法有:

void setDate(int parameterIndex,Date x)
void setDouble(int parameterIndex,double x)
void setFloat(int parameterIndex,float x)

8.7 事务

        事务是保证数据库中数据完整性与一致性的重要机制。事务处理步骤如下:

1、连接对象使用setAutoCommit(boolean autoCommit)方法,
将参数autoCommit取值为false来关闭自动提交模式:
con.setAutoCommit(false);
2、commit()方法
con调用commit()方法就是让事务中的SQL语句全部生效。
3、rollback()方法
只要事务中任何一个SQL语句没有生效,就抛出SQLException异常。在处
理SQLException异常时,必须让con调用rollback()方法。


8.8 分页显示记录

        程序在查询的时候,为了代码更加容易维护,希望知道数据库表的字段的名字以及表的字段的个数,一个办法是使用返回到程序中的结果集来获取相关的信息。例如,对于 bookDatabase 数据库的 bookList 表,如果执行下列查询返回结果集 rs:

ResultSet rs = sql.executeQuery("select * from bookList");

        首先让 ResultSet 对象 rs 调用 getMetaData()方法返回一个 ResultSetMetaData 对象:

ResultSetMetaData metaData = rs.getMetaData();

        然后 ResultSetMetaData 对象方法就可以返回结果集 rs 中的第 i 列的名字:

String columnName = metaData.getColumnName(i);

对于 bookDatabase 数据库的 bookList 表,metaData.getColumnCount() 的值就是 4,metaData.getColumnCount(1)、metaData.getColumnCount(2)、metaData.getColumnCount(3、metaData.getColumnCount(4) 的值依次是 ISBN、name、price 和 publishData。

        如果执行下列查询返回结果集 rs:

ResultSet rs = sql.executeQuery("select name,price from bookList");

        可以使用二维数组 table 存放表的记录,即用二维数组 table 中的行存放记录。如果一个表中有许多记录,那么二维数组 table 就有多行。为避免长时间占用数据库的连接,应当将全部记录存放到二维数组中,然后关闭数据库连接。假设 table 存放了 m 行记录,准备每页显示 n 行,那么,总页数的计算公式是:

  • 如果 m 除以 n 的余数大于0,总页数等于 m 除以 n 的商加 1;
  • 如果 m 除以 n 的余数等于 0,总页数等于 m 除以 n 的商。

        如果准备显示第 p 页的内容,应当从 table 第(p-1)* n 行开始,连续输出 n 行。

8.9 连接 SQL Server 与 Access

8.9.1 连接 Microsoft SQL Server 数据库

1、Microsoft SQL Server 2012

        SQL Server 2012 是一个强大且可靠免费的数据库管理系统,它为轻量级网站和桌面应用程序提供丰富和可靠的数据存储。具体下载方式可在浏览器中自行查找。

2、建立数据库

        打开 SSMS 提供的“对象资源管理器”,创建好数据库后,就可以建立若干个表。如果准备在 webhouse 数据库中创建名字为 bookList 的表,那么可以单击“数据库”下的 warehouse 数据库,在bookDatabase 管理的“表”的选项上右点击,选择“新建表”选项,将出现相应的新建表界面。

3、SQL Server 的 JDBC 数据库连接器

        将 SQLServer 数据库的 JDBC-SQLServer 数据库连接器 sqljdbc42.jar 保存到 Tomcat 安装目录下的 lib 文件夹中,并重新启动 Tomcat 服务器。

        应用程序加载 JDBC-SQLServer 数据库连接器的代码如下:

try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

}

catch(Exception e){

}

4、建立连接

        假设 SQL Server 数据库服务器所驻留的计算机的 IP 地址是 192.168.100.1,SQL Server 数据库服务器占用的端口默认是 1433。应用程序要和 SQL Server 数据库服务器管理的数据库 bookDatabase 建立连接,而有权访问数据库 bookDatabase 的用户的 id 和密码分别是 sa、dog123456,那么建立连接的代码如下:

try{
String url = 
"jdbc:sqlserver://192.168.100.1:1433;DatabaseName = warehouse";
String user = "sa";
String password = "dog123456";
con = DriverManager.getConnection(url,user,password);
}
catch(SQLException e){
}

8.10 使用连接池

8.10.1 连接池简介

        连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。

8.10.2 建立连接池

1、连接池配置的文件

        为了让 Tomcat 服务器创建连接池,必须编写一个 XML 文件,Tomcat 服务器通过读取该文件创建连接池。XML 文件的名字必须是 context.xml。内容如下:

<?xml version = "1.0" encoding = "utf-8"?>
<Context>
    <Resource
        name = "gxy"
        type = "javax.sql.DataSource"
        deriverClassName - "com.mysql.cj.jbcb.Driver"
        url = "jdbc:mysql://127.0.0.1:3306/bookDatabase?useSSL = false
        &amp;serverTimezone = CST&amp;characterEncoding = utf-8"
        username = "root"
        password = ""
        maxActive = "15"
        maxIdle = "15"
        minIdle = "1"
        maxIdle = "1000"
    />
</Context>

将连接池配置文件保存在 context.xml 文件保存在 Web 服务目录的 META-INF 子目录中。

        连接池配置文件 context.xml 中的 Resource 标记通知 Tomcat 服务器创建数据源,Resource 标记中各个属性的意义如下:

(1)name:设置连接池的名字,例如 gxy,改密工资是连接池的 id,context.xml 文件中,如果有多个 Resource 标记,必须保证其中的 name 互不相同。

(2)type:设置连接池的类型,这里必须是 javax.sql.DataSource,即 Tomcat 服务器把创建的 Connection 对象存放在实现 DataSource 接口的对象中,即连接池是一个 DataSource 型对象。

(3) driverClassName:设置数据库连接器,即数据库驱动的类。不同版本的 MYSQL 其名称各不相同。

(4)url:设置连接数据库的 URL。需要注意的是对于 url 中的 & 字符要写成“&amp”,这是 XML 文件对特殊字符的一个特殊规定。

(5)username:给出可以访问数据库的用户名,例如 root。

(6)password:给出访问数据库的密码,用户默认是无密码。

(7)maxActive:设置连接池的大小,即连接池中处于活动状态 Connection 对象的数目。maxActive 取值不可以超过数据库系统允许的最大连接数目。

(8)maxIdle:设置连接池中可处于空闲状态的 Connection 对象的最大数目,取值非正整数,表示无限制,如果取正整数,那么空闲状态的 Connection 对象多余 6 个时,Tomcat 服务器会释放多余的 Connection 对象,即从连接池中删除多余的 Connection 对象。

(9)minIdle:设置连接池中保证处于空闲状态的 Connection 对象的最小数目。当连接池中仅仅剩下两个空闲状态 Connection 对象时,此刻如果同时有两个用户需要使用连接池中的 Connection 对象,那么二者只能有一个获得 Connection 对象,另一个用户必须等待。

(10)maxWait:设置连接池中没有空闲状态 Connection 对象可用时,用户请求获得连接池中 Connection 对象需要等待的最长时间,如果超出 maxWait 设置的时间,Tomcat 服务器将抛出一个 TimeoutException 给用户。取值负数,表示用户可以无限时等待。

2、使用连接池

        应用程序必须到 Tomcat 服务器中去获得连接池。步骤如下:

(1)Context 接口

        首先创建一个实现 Context 接口的对象:

Context context = new InitialContext( );

然后让 context 去寻找 Tomcat 服务器曾绑定在运行环境中的另一个 Context 对象:

Context contextNeeded = (Context)context.lookup("java:comp/env");

其中的 java:comp/env 是 Tomcat 服务器绑定这个 Context 对象时使用的资源标识符。

(2)得到连接池

        Tomcat 服务器通过连接池配置文件 context.xml 将连接池绑定在 Context 对象 contextNeeded 中。绑定用的资源标志符是连接池配置文件 context.xml 中 name 给的值。因此,从 contextNeeded 中或的代码池的代码是:

DataSource ds = (DataSource)contextNeeded.lookup("gxy");

(3)从连接池中获得连接

        获得连接池之后,就可以从连接池中获得 Connection 对象。连接池中都是已经创建好的 Connection 对象,连接池调用 getConnection()方法,如果有空闲的 Connection 对象,该方法就返回一个 Connection 对象,如果没有空闲的 Connection 对象,该方法将使得用户线程处于 warning 状态,即等待该方法返回 Connection 对象。代码如下:

Connection con = ds.getConnection();

(4)将连接返回连接池

        当 Web 应用程序不再需要 Connection 对象时,就让 Connection 对象调用 close()方法,这样就可以把这个 Connection 对象再放回连接池中,以便其他 Web 应用程序使用这个 Connection 对象。如果用户忘记 Connection 对象再返回连接池中,将可能很快导致连接池中无 Connection 对象可用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值