目录
参考资料
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.执行一个查询
需要使用一个类型为Statement或PreparedStatement的对象,并提交一个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语句:UPDATE,INSERT或DELETE语句,那么需要下面的代码片段:
//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:表示此对象保存的范围,一共有四种属性范围:page、request、session、application
(3)class:对象所对应的包.类名称
使用<jsp:userBean/>指令时,实际上会默认调用该类的无参构造方法实例化一个对象,当修改SimpleBean.java文件后,如果要想让其起作用,则需要重新启动服务器,我们可以通过在Tomcat中直接配置自动加载的操作,这样即使不重新启动服务器,JavaBean修改后也可以被立即加载进来。重新加载的配置如下:在Tomcat安装目录下conf/server.xml文件中进行配置
PS:如果在多个JSP页面使用该指令,id相同的话不会再创建而是使用已存在的javaBean?
另外似乎还有一种比较繁琐的使用方式 name为Bean的名字,property为成员?
这种使用方式需要在CLASSPATH中提供放入StudentsBean.class……