1.Jar包:
2.Maven项目中h2数据库的简单使用:
h2数据库:
H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。H2 主要有如下三个用途:
第一个用途,也是最常使用的用途就在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。
第二个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。
第三个用途是作为缓存,即当做内存数据库,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。
使用:
导入依赖
<!-- H2 内存数据库 -->
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
web.xml
<!--Start -->
<!-- web应用启动时启动H2数据库,默认嵌入式连接(只可本地JDBC连接,与Web应用同进程) -->
<listener>
<listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>
<!-- 定义H2数据库的连接参数,用户与密码,并设置允许TCP远程连接。 -->
<context-param>
<param-name>db.url</param-name>
<!-- 如果数据库不存在,会创建 -->
<param-value>jdbc:h2:~/test</param-value>
</context-param>
<context-param>
<param-name>db.user</param-name>
<param-value>sa</param-value>
</context-param>
<context-param>
<!-- 不能是空密码,否则启动时报错 -->
<param-name>db.password</param-name>
<param-value>sa</param-value>
</context-param>
<context-param>
<param-name>db.tcpServer</param-name>
<param-value>-tcpAllowOthers</param-value>
</context-param>
<!-- H2控制台是一个独立的应用程序,包含自己的Web服务器,但它也可以用作servlet。 -->
<!-- 注意的是,h2数据库必须以服务器模式或混合模式启动 -->
<servlet>
<servlet-name>H2Console</servlet-name>
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>H2Console</servlet-name>
<url-pattern>/console/*</url-pattern>
</servlet-mapping>
<!--End -->
test
package cn.edu.dgut.sai.database.jdbc;
import java.sql.*;
/**
* @author Sai
* Created by Sai on 2019-03-25.
* <p>
* <p>
* <p>
* JDBC编程步骤:
* 0.加载数据库驱动程序
* 1.连接到数据库
* 2.创建SQL或MySQL语句
* 3.在数据库中执行SQL或MySQL查询
* 4.查看和修改记录
* <p>
* H2官方教程:
* http://www.h2database.com/html/tutorial.html
*/
@SuppressWarnings({"Duplicates", "unused", "SqlNoDataSourceInspection", "SqlDialectInspection"})
public class DBUtil {
// MySql的URL
// private static final String URL="jdbc:mysql://localhost:3306/demo_jdbc";
// private static final String DRIVER = "com.mysql.jdbc.Driver";
// H2
// 使用H2的本地嵌入式连接
// 这个模式会与
// 指定数据库文件:
// jdbc:h2:~/test
// jdbc:h2:file:/data/sample
// jdbc:h2:file:C:/data/sample (Windows only)
// 如果数据库不存在,会在用户目录创建一个数据库文件,缺省用户是sa,密码是空字符串
// 注意:下面的 ~ 是linus的路径格式,window改为绝对路径即可,参考jdbc:h2:file:C:/data/sample
private static final String URL = "jdbc:h2:~/test;MODE=MYSQL;DB_CLOSE_DELAY=-1";
// 本地连接的内存模式,程序模式时,应用程序结束后,数据库就被清除。
private static final String URL_MEM = "jdbc:h2:mem:test;MODE=MYSQL;DB_CLOSE_DELAY=-1";
// 使用H2的TCP连接模式
// 使用服务器模式连接,必须先独立运行H2的数据库服务器,参考开发环境文档的H2章节;
// java -jar h2*.jar
// java -cp h2*.jar org.h2.tools.Server
// 上面命令中的 -cp 参数,作用与 -classpath 一样,是指定类运行所依赖其他类的路径,即指定给解释器到哪里找到你的.class文件,通常是类库,jar包之类,需要全路径到jar包;
// 如果有多个jar包,可以用分隔符分隔,window上分号“;”分隔,linux上是分号“:”分隔。不支持通配符,需要列出所有jar包,用一点“.”代表当前路径。
private static final String URL_TCP = "jdbc:h2:tcp://localhost/~/test1;MODE=MYSQL;DB_CLOSE_DELAY=-1";
// 内存模式
private static final String URL_TCP_MEM = "jdbc:h2:tcp://localhost/mem:test1;MODE=MYSQL;DB_CLOSE_DELAY=-1";
private static final String DRIVER = "org.h2.Driver";
private static final String NAME = "sa";
private static final String PASSWORD = "";
public static void main(String[] args) {
// 1.加载驱动程序
// JDBC4.0以后,使用JDK的SPI机制自动加载驱动类,所以下面的代码块可以注释掉。
// 注:SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。
// 当服务的提供者提供了一种接口的实现之后,需要自己的jar中在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,
// 这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,
// 配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务实现的工具类是:java.util.ServiceLoader。
// 例如:使用的是H2数据库驱动,查看h2驱动的jar里有一个services/java.sql.Driver文件里,文件的内容是org.h2.Driver
//
// Java EE 7开始支持JDBC4.0
// try {
// Class.forName(DRIVER);
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// return;
// }
// 2.获得数据库的连接
// 使用JDK 7的try(){}资源句式:可以 try 一个或多个资源,使用try资源句式可以自动 close 资源。如:conn.close();
try (Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD)) {
/*
注意,Connection预设为自动“认可/提交”(Commit),也就是Statement执行SQL叙述完后,马上对数据库进行操作变更.
如果想要对Statement要执行的SQL进行除错,可以使用setAutoCommit(false)来将自动认可取消,在执行完SQL之后,再呼叫Connection的commit()方法认可变更,
使用Connection的getAutoCommit()可以测试是否设定为自动认可。
不过无论是否有无执行commit()方法,只要SQL没有错,在关闭Statement或Connection前,都会执行认可commit动作,对数据库进行变更。
*/
//3.通过数据库的连接操作数据库,实现增删改查
Statement stmt = conn.createStatement();
// 创建一个表
// 如果表不存在就建立这个表,那么可以直接用 create table if not exists tablename 这样的指令来建立,不需要先去查询表是否存在。
// 从模板表创建表:create table if not exists like old_table_name;
stmt.executeUpdate(
"CREATE TABLE IF NOT EXISTS `user` (" +
" `id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
" `name` varchar(100) NOT NULL," +
" `age` int(11) NOT NULL," +
" PRIMARY KEY (`id`)" +
");"
);
// 插入数据记录
// id主键是自动生成
stmt.executeUpdate(
"insert into `user` (`name`,`age`) values ('Jerry', 27);" +
"insert into `user` (`name`,`age`) values ('Angel', 25);"
);
ResultSet rs = stmt.executeQuery("select * from user");//选择import java.sql.ResultSet;
// 遍历每行记录
while (rs.next()) {
//如果结果集中有数据,就会循环打印出来
System.out.println(rs.getString("id") + "," + rs.getString("name") + "," + rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.IDEA中http client测试脚本:
可以构建请求:
GET http://localhost:8080/webapp-demo/hello
Cookie: Sai=dgut
###
GET http://localhost:8080/webapp-demo/json
###
POST http://localhost:8080/webapp-demo/json
Content-Type: application/json
{"姓名":"ll","工号":"2003066","注册日期":"15-03-2019","薪水":"1000.0","身份":"老师","邮件":"lizhx@dgut.edu.cn","部门":"网络空间安全 学院"}
###