目录
- 1、数据库管理系统
- 2、MySQL
- 3、JDBC
- 4、数据库操作
- 4.1 查询
- 1.结果集与查询:
- 2.结果集的列名与列的数目
- 3.随机查询
- 4.条件查询
- 5.排序查询
- 4.2更新、添加、删除记录
- 5、 用结果集操作数据库中的表
- 6、预处理语句
- 7、事务
- 8、小结
- 9、登录检测实例
1、数据库管理系统
数据库是提供数据的基地,它能保存数据并能使用户方便的访问数据。
- DBMS是(Data Base Management System)的缩写,是管理数据库软件的集合。
- DBMS包含面向用户接口功能和面向系统维护功能。
- 面向用户接口功能是提供用户访问数据库的一些必要手段。
- 面向系统维护功能是为数据库管理者提供数据库的维护工具。
目前常见的数据库管理系统有:
- Oracle
- Sybase
- Informix
- Microsoft SQL Server
- MySQL
2、MySQL
MySQL数据库管理系统,简称MySQL,是世界上最流行的开源数据库管理系统。
目前许多Web开发项目都选用MySQL,其主要原因是MySQL的社区版是开源数据库管理系统、可以降低软件的开发和使用成本。
MySQL提供的监视器(MySQL monitor),允许用户使用命令行方式管理数据库。
需要再打开一个MS-DOS命令行窗口,并使用MS-DOS命令进入到bin目录中,然后使用默认的root用户启动MySQL监视器。命令如下:mysql –u root
可以使用navicat快速操作,详情见 点击阅读
3、JDBC
JDBC(Java DataBase Connectivity)提供了访问数据库的API,即由一
些Java类和接口组成,是Java运行平台的核心类库中的一部分。
我们经常使用JDBC进行如下的操作:
- 与一个数据库建立连接。
- 向已连接的数据库发送SQL语句。
- 处理SQL语句返回的结果。
JDBC-API中重要的接口和类(java.sql包中):
使用JDBC-数据库驱动程序方式和数据库建立连接需要经过2个步骤:
- 加载JDBC-数据库驱动程序
- 指定的数据库建立连接
借用菜鸟教程中的介绍:
jar 包:
MySQL 5 版本:mysql-connector-java-5.1.39-bin.jar
MySQL 8 版本:mysql-connector-java-8.0.19.jar
下载后把 mysql-connector-java-<对应版本>-bin.jar 拷贝到 tomcat 下 lib 目录。
MySQL 8.0 以上版本的数据库连接有所不同:
com.mysql.jdbc.Driver
更换为 com.mysql.cj.jdbc.Driver
需要注意:MySQL 8 + JDBC 8 + JDK 8 或者 MySQL 5 + JDBC 5 + JDK 7
String driverClass = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=UTC";
String urn = "root";
String psw = "123456";
Class.forName(driverClass);//加载驱动
Connection con = DriverManager.getConnection(url,urn,psw);//得到连接
4、数据库操作
4.1 查询
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:
能用结果集更新数据库中的表。
4.条件查询
select… from 表 where 字段 满足的条件
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 总分
4.2更新、添加、删除记录
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' ");
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()方法用结果集中的插入行向数据库表中插入一行新记录。
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)
7、事务
事务是保证数据库中数据完整性与一致性的重要机制。事务处理步骤如下:
- 1.连接对象使用setAutoCommit(boolean autoCommit)方法,
将参数autoCommit取值为false来关闭自动提交模式:
con.setAutoCommit(false); - 2.commit()方法
con调用commit()方法就是让事务中的SQL语句全部生效。 - 3.rollback()方法
只要事务中任何一个SQL语句没有生效,就抛出SQLException异常。在处
理SQLException异常时,必须让con调用rollback()方法。
8、小结
- JSP使用JDBC提供的API和数据库进行交互信息。使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。
- 当查询ResultSet对象中的数据时,不可以关闭和数据库的连接。
- 使用PreparedStatement对象可以提高操作数据库的效率
9、登录检测实例
//接收用户名和密码
String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
String password = request.getParameter("password");
String driverClass = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=UTC";
String urn = "root";
String psw = "123456";
Class.forName(driverClass);//加载驱动
Connection conn = DriverManager.getConnection(url,urn,psw);//得到连接
if(conn != null){
String sql = "select * from user_info where username='"+username+"' and password='"+ password + "'"; //验证账号密码
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next())
response.sendRedirect("home.html");//登录成功,转到主页
else
response.sendRedirect("fail.jsp");//登录失败,重新登录
}
conn.close();