编程新技术实验(一)---mysql & JDBC & JSP学习笔记

参考资料

https://www.cnblogs.com/dandeliongogo/p/6610569.html

http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html#d8

https://www.yiibai.com/jdbc/jdbc-create-tables.html

https://www.yiibai.com/jsp/jsp_quick_guide.html

.......

mysql基本操作

登录:mysql -h 主机名 -u  用户名 -p

-h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;

-u : 所要登录的用户名;

-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

 

创建/删除一个数据库

使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:

create database 数据库名 [其他选项];

例如我们需要创建一个名为 samp_db 的数据库, 在命令行下执行以下命令:

create database samp_db character set gbk;

为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。创建成功时会得到 Query OK, 1 row affected(0.02 sec) 的响应。

 

注意: MySQL语句以分号(;)作为语句的结束, 若在语句结尾不添加分号时, 命令提示符会以 -> 提示你继续输入(有个别特例, 但加分号是一定不会错的);

提示: 可以使用 show databases; 命令查看已经创建了哪些数据库。

删除数据库drop database 数据库名;

 

选择要操作的数据库

要对一个数据库进行操作, 必须先选择该数据库, 否则会提示错误:

ERROR 1046(3D000): No database selected

两种方式对数据库进行使用的选择:

一: 在登录数据库时指定, 命令: mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p

例如登录时选择刚刚创建的数据库: mysql -D samp_db -u root -p

二: 在登录后使用 use 语句指定, 命令: use 数据库名;

use 语句可以不加分号, 执行 use samp_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed

 

创建数据库表

使用 create table 语句可完成对表的创建, create table 的常见形式:

create table 表名称(列声明);

以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:

       create table students

      

              id int unsigned not null auto_increment primary key,

              name char(8) not null,

              sex char(4) not null,

              age tinyint unsigned not null,

              tel char(13) null default "-"

       );                   

对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中, 通过命令提示符下的文件重定向执行执行该脚本。

打开命令提示符, 输入: mysql -D samp_db -u root -p < createtable.sql

(提示: 1.如果连接远程主机请加上 -h 指令; 2. createtable.sql 文件若不在当前工作目录下需指定文件的完整路径。)

语句解说:

create table tablename(columns) 为创建数据库表的命令, 列的名称以及该列的数据类型将在括号内完成;

括号内声明了5列内容, id、name、sex、age、tel为每列的名称, 后面跟的是数据类型描述, 列与列的描述之间用逗号(,)隔开;

以 "id int unsigned not null auto_increment primary key" 行进行介绍:

"id" 为列的名称;

"int" 指定该列的类型为 int(取值范围为 -8388608到8388607), 在后面我们又用 "unsigned" 加以修饰, 表示该类型为无符号型, 此时该列的取值范围为 0到16777215;

"not null" 说明该列的值不能为空, 必须要填, 如果不指定该属性, 默认可为空;

"auto_increment" 需在整数列中使用, 其作用是在插入数据时若该列为 NULL, MySQL将自动产生一个比现存值更大的唯一标识符值。在每张表中仅能有一个这样的值且所在列必须为索引列。

"primary key" 表示该列是表的主键, 本列的值必须唯一, MySQL将自动索引该列。

下面的 char(8) 表示存储的字符长度为8, tinyint的取值范围为 -127到128, default 属性指定当该列值为空时的默认值。

 

提示: 1. 使用 show tables; 命令可查看已创建了表的名称; 2. 使用 describe 表名; 命令可查看已创建的表的详细信息。

 

向表中插入数据

insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:

insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

其中 [ ] 内的内容是可选的, 例如, 要给 samp_db 数据库中的 students 表插入一条记录, 执行语句:

insert into students values(NULL, "王刚", "男", 20, "13811371377");

按回车键确认后若提示 Query Ok, 1 row affected (0.05 sec) 表示数据插入成功。 若插入失败请检查是否已选择需要操作的数据库。

有时我们只需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:

insert into students (name, sex, age) values("孙丽华", "女", 21);

 

查询表中数据

select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:

select 列名称 from 表名称 [查询条件];

例如要查询 students 表中所有学生的名字和年龄,

输入语句 select name, age from students;

也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;

 

按特定条件查询

where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;

以查询所有性别为女的信息为例, 输入查询语句: select * from students where sex="女";

where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的, 例如 =、>、<、>=、<、!= 以及一些扩展运算符 is [not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询, 以后还会学到更加高级的条件查询方式, 这里不再多做介绍。

 

示例:

查询年龄在21岁以上的所有人信息: select * from students where age > 21;

查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";

查询id小于5且年龄大于20的所有人信息: select * from students where id<5 and age>20;

 

更新表中数据

update 语句可用来修改表中的数据, 基本的使用形式为:

update 表名称 set 列名称=新值 where 更新条件;

使用示例:

将id为5的手机号改为默认的"-": update students set tel=default where id=5;

将所有人的年龄增加1: update students set age=age+1;

将手机号为 13288097888 的姓名改为 "张伟鹏", 年龄改为 19: update students set name="张伟鹏", age=19 where tel="13288097888";

 

删除表中数据

delete 语句用于删除表中的数据, 基本用法为:

delete from 表名称 where 删除条件;

使用示例:

删除id为2的行: delete from students where id=2;

删除所有年龄小于21岁的数据: delete from students where age<20;

删除表中的所有数据: delete from students;

 

模糊查询

下面介绍mysql中模糊查询的四种用法:

1 %:

select * from table where name like '王%' 这个查出来姓王的人
select * from table where name like '%王%' 这个查出来名字有王的人

表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。

比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'

将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。

另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件

SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'

若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%猫%'

虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

2 _:

表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:

比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'

只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;

再比如 SELECT * FROM [user] WHERE u_name LIKE '三__'; 只找出“三脚猫”这样name为三个字且第一个字是“三”的;

3 [ ]:

表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。

比如 SELECT * FROM [user] WHERE u_name LIKE '[张李王]三' 将找出“张三”、“李三”、“王三”(而不是“张李王三”);

如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”

SELECT * FROM [user] WHERE u_name LIKE '老[1-9]' 将找出“老1”、“老2”、……、“老9”;

4 [^ ] :

表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

比如 SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三' 将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;

SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]'; 将排除“老1”到“老4”,寻找“老5”、“老6”、……

 

JDBC

JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。

JDBC库中所包含的API通常与数据库使用于:

  • 连接到数据库
  • 创建SQL或MySQL语句
  • 在数据库中执行SQL或MySQL查询
  • 查看和修改数据库中的数据记录

Java连接mysql

1. 导入包

在程序中包含数据库编程所需的JDBC类。大多数情况下,使用 import java.sql.* 就足够了,如下所示:

//STEP 1. Import required packages
import java.sql.*;

2. 注册JDBC驱动程序

需要初始化驱动程序,这样就可以打开与数据库的通信。以下是代码片段实现这一目标: 

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

3. 打开一个连接

使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接,如下所示:

//STEP 3: Open a connection
//  Database credentials
static final String USER = "root";
static final String PASS = "pwd123456";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);

注:用户名用root,则密码为自己设置的密码

String url = "jdbc:mysql://localhost:3306/samp_db";  //用于打开数据库连接,最后的/后面是数据库名(可更改)

4.执行一个查询

需要使用一个类型为StatementPreparedStatement的对象,并提交一个SQL语句到数据库执行查询。如下:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

如果要执行一个SQL语句:UPDATEINSERTDELETE语句,那么需要下面的代码片段:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);

完整的连接操作如下

private static Connection getConn()   //该函数实现连接的获取
	{
		//JDBC driver name and database URL
		String driver = "com.mysql.jdbc.Driver";  //driver代替后面那一串字符串,用于注册JDBC驱动程序
		String url = "jdbc:mysql://localhost:3306/samp_db";  //用于打开数据库连接,最后的/后面是数据库名(可更改)
		
		//Database credentials
		String username = "root";   //用户名..密码 
		String password = "xiaokang";
		Connection conn = null;
		
		try {
			Class.forName(driver);                      //classLoader,加载对应驱动
			conn = DriverManager.getConnection(url,username,password); //建立连接
		} catch(SQLException se)
		{
			se.printStackTrace();
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		
		return conn;
		
	}

5.从结果集中提取数据

这一步中演示如何从数据库中获取查询结果的数据。可以使用适当的ResultSet.getXXX()方法来检索的数据结果如下:

//STEP 5: Extract data from result set
while(rs.next()){
    //Retrieve by column name
    int id  = rs.getInt("id");
    int age = rs.getInt("age");
    String first = rs.getString("first");
    String last = rs.getString("last");

    //Display values
    System.out.print("ID: " + id);
    System.out.print(", Age: " + age);
    System.out.print(", First: " + first);
    System.out.println(", Last: " + last);
}

6.清理环境资源

在使用JDBC与数据交互操作数据库中的数据后,应该明确地关闭所有的数据库资源以减少资源的浪费,对依赖于JVM的垃圾收集如下:

//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();

 

PreparedStatement的使用

insert

private static int insert(Student student) {
    Connection conn = getConn();
    int i = 0;
    String sql = "insert into students (Name,Sex,Age) values(?,?,?)";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        pstmt.setString(1, student.getName());	//1表示第一个参数,即设置Name
        pstmt.setString(2, student.getSex());
        pstmt.setString(3, student.getAge());
        i = pstmt.executeUpdate();
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}

通过pstmt.setXXX设置参数,注意sql语句格式

设置完后要执行excuteUpdate()函数

update

private static int update(Student student) {
    Connection conn = getConn();
    int i = 0;
    String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        i = pstmt.executeUpdate();
        System.out.println("resutl: " + i);
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}

select

String sql = "SELECT * FROM users";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

小结:(参考网上的,感觉解释的不准确)

excuteQuery, excuteUpdate, excute……

execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况。(一般不要乱用)

excuteQuery用于产生单个结果集的语句,SELECT 语句几乎都是用这个。

excuteUpdate用于执行 INSERT、UPDATE 或 DELETE 语句

以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 

    使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。 

 

JSP基本操作

<%@ page language="java" import="java.sql.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":"
	+ request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SELECT DATABASE</title>
<base href="<%=basePath%>">

<style>
	table,table tr th, table tr td { border:1px solid #000000;}
	table{
		border-collapse:collapse;
		padding:0;
		width:400px;
	}
</style>
</head>
<body>
	<div align="center">
	<% 
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/lab2_db";	  //为lab2建立的数据库名为lab2_db 
		String db_username = "root";
		String db_password = "xiaokang";
		Connection conn = null;
		

			Class.forName(driver);
			conn = DriverManager.getConnection(url,db_username,db_password);
			
			String sql = "SELECT * FROM users";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			
			sql = "SELECT * FROM person";
			pstmt = conn.prepareStatement(sql);
			ResultSet rs2 = pstmt.executeQuery();
	%>		
	<h1 align="center">数据库表user信息</h1>
	<table>
		<tr>
			<td>username</td>
			<td>password</td>
		</tr>
		<%
			while(rs.next()) {
		%>
		<tr>
			<td>
				<%
					out.print(rs.getString(1));
				%>
			</td>
			<td>
				<%
					out.print(rs.getString(2));
				%>
			</td>
		</tr>
		<%
			}
		%>
		
	</table>
	<br/>
	<br/>
	<h1 align="center">数据库表person信息</h1>
	<table>
		<!-- <tr><td colspan="4" align="center">数据库表person信息</td></tr> -->
		<tr>
			<td>username</td>
			<td>name</td>
			<td>age</td>
			<td>telenum</td>
		</tr>
		<%
			while(rs2.next()) {
		%>
		<tr>
			<td>
				<%
					out.print(rs2.getString(1));
				%>
			</td>
			<td>
				<%
					out.print(rs2.getString(2));
				%>
			</td>
			<td>
				<%
					out.print(rs2.getString(3));
				%>
			</td>
			<td>
				<%
					out.print(rs2.getString(4));
				%>
			</td>
		</tr>
		<%
			}
		%>
	</table>
	<br/>
	<br/>
	<a href="JSP/DatabaseOperate.html">返回数据库操作界面</a> 
	</div>
</body>
</html>

上图的jsp实现的是连接数据库,获取并以表格的形式打印数据库中信息。

基本语法

小脚本语法
<% code fragment %>  
                    
JSP声明语法
<%! declaration; [ declaration; ]+ ... %>  

JSP表达式
<%= expression %>

JSP注释
<%-- This is JSP comment --%>

JSP指令
<%@ directive attribute="value" %>

Tips:

1.URL:Uniform Resource Locator

基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

https://baike.baidu.com/item/url/110640?fr=aladdin

2.掌握if语句,循环语句的写法

https://www.yiibai.com/jsp/jsp_quick_guide.html

3.JSP表单处理

<form action="DatabaseDelete.jsp" method="post">
	
	<table>
	<tr><td  colspan="2" align="center">数据库表users插入信息</td></tr> 
	<tr>
		<td>username</td>
		<td><input type="text" name="username"/></td>
	</tr>
	<tr>
		<td  colspan="2" align="center"><input type="submit" value="删除"/></td>
	</tr>
	</table>
</form>

post和get方法的区别?

4.Path和BasePath

<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":"
	+ request.getServerPort() + path + "/";
%>

设置绝对地址,防止地址错误?

5.meta设置

https://blog.csdn.net/qq_21792169/article/details/50636466

这玩意主要进行网页设置,与搜索引擎相关?

6.注意把数据库的jar包导入到WEB-INF的lib下(copy)

7.JavaBean实现数据存储于传输

以下是区分一个JavaBean与其他Java类的独有特性:

  • 它提供了一个默认的无参数构造函数。
  • 它应该是可序列化并实现Serializable接口。
  • 它可以有许多可被读出或写入属性。
  • 它可能有多个“getter”“setter”方法的属性。

一般格式:

如何在JSP页面使用JavaBean?

方法①:import导入相关包

使用该方法需要在代码中声明并实例化一个JavaBean对象(如图所示,这是与下面的方法的主要不同之处)

方法②:使用<jsp:useBean>指令

完整语法:

1.<jsp:useBean id="实例化对象名称" scope=“保存范围” class=“.类名称“/>

2.主要属性:

(1)id:表示实例化对象的名称

(2)scope:表示此对象保存的范围,一共有四种属性范围:pagerequestsessionapplication

(3)class:对象所对应的包.类名称

使用<jsp:userBean/>指令时,实际上会默认调用该类的无参构造方法实例化一个对象,当修改SimpleBean.java文件后,如果要想让其起作用,则需要重新启动服务器,我们可以通过在Tomcat中直接配置自动加载的操作,这样即使不重新启动服务器,JavaBean修改后也可以被立即加载进来。重新加载的配置如下:在Tomcat安装目录下conf/server.xml文件中进行配置

PS:如果在多个JSP页面使用该指令,id相同的话不会再创建而是使用已存在的javaBean?

另外似乎还有一种比较繁琐的使用方式 name为Bean的名字,property为成员?

这种使用方式需要在CLASSPATH中提供放入StudentsBean.class……

猜你喜欢

转载自blog.csdn.net/qq_37205708/article/details/86527742