本文转载自:https://blog.csdn.net/bell_love/article/details/105667638
并进行补充与校正
文章目录
6、Servlet
6.1、Servlet简介
6.2、HelloServlet
6.2、HelloServlet
6.3、Servlet原理
6.4、Mapping问题
6.5、ServletContext
1、共享数据
2、获取初始化参数
3、请求转发
6.6、HttpServletResponse
1、简单分类
2、下载文件
3、验证码功能
6.7、HttpServletRequest
获取参数,请求转发
7、Cookie、Session
7.1、会话
7.2、保存会话的两种技术
7.3、Cookie
7.4、Session(重点)
8、JSP
8.1、什么是JSP
8.2、JSP原理
8.3、JSP基础语法
JSP表达式
jsp脚本片段
JSP声明
8.4、JSP指令
8.5、9大内置对象
8.6、JSP标签、JSTL标签、EL表达式
9、JavaBean
10、MVC三层架构
10.1、以前的架构
10.2、MVC三层架构
11、Filter (重点)
12、监听器
13、过滤器、监听器常见应用
14、JDBC
什么是JDBC : Java连接数据库!
首先你有一个MySQL数据库和一个Oracle数据库,如果一个应用要去操纵数据库,无法直接连数据库,需要一个驱动(各自厂家的驱动)。如果更换数据库,需要更改程序中的代码,这样会非常麻烦。
所以增加了中间商,统一驱动JDBC,应用程序只需要面向这个统一驱动,所有的数据库厂商根据这个统一驱动编写接口就可以了。
学完JDBC就可以直接用JDBC获取对象就可以了,然后用JDBC中的URL去连接各种数据库(mysql.Driver/oracle.Driver)。
连接数据库需要jar包的支持:
- java.sql
- javax.sql
- mysql-conneter-java… 连接驱动(必须要导入)
实验环境搭建:
创建一个普通Maven项目。
创建一个数据库,字符集选择utf-8,数据库排序规则选择utf8_general_ci
Tip:关键字重复用 ` 代替
CREATE TABLE users(
id INT PRIMARY KEY,
`name` VARCHAR(40),
`password` VARCHAR(40),
email VARCHAR(60),
birthday DATE
);
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(1,'张三','123456','zs@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(2,'李四','123456','ls@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(3,'王五','123456','ww@qq.com','2000-01-01');
SELECT * FROM users;
现在要用IDEA去操作数据库
首先第一件事情:导包 即导入数据库依赖
mysql-connector-java包可能是需要手动导的
<!--mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
IDEA中连接数据库:
点击右侧database
+加号选择数据源
(备注,新版可能就不选这个driver了?)
写命令可以在这里写了:
JDBC 固定步骤:
-
加载驱动
-
连接数据库,代表数据库
连接数据库还是通过DriverManager,要连接数据库需要通过getConnection,需要三个参数,url,username,password,然后用它创建变量
可以用这个对象:close关闭数据库连接,commit提交事务,createStatement创建一个SQL执行的对象,getAutoCommit设置是否自动提交,isReadOnly是否只读,isClosed检查数据库是否关闭,prepareCall批处理的一些东西,rollback事务失败了是否回滚
-
向数据库发送SQL的对象Statement : 用它来做CRUD增删改查
addBatch增加批处理;execute执行;执行查询;执行连接;删除;关闭;getConnection获取连接;getMaxRows获取最大连接数;getResultSet获取结果集
-
编写SQL (根据业务,不同的SQL)
-
执行查询SQL,返回一个结果集ResultSet
注意:使用的是executeQuery
增删改的时候要用executeUpdate,返回的是int,代表受影响的行数
-
关闭连接,释放资源(先开的后关)
完整代码:
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//配置信息
//useUnicode=true&characterEncoding=utf-8 解决中文乱码
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.向数据库发送SQL的对象Statement,PreparedStatement : CRUD
Statement statement = connection.createStatement();
//4.编写SQL
String sql = "select * from users";
//5.执行查询SQL,返回一个 ResultSet : 结果集
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println("id="+rs.getObject("id"));
System.out.println("name="+rs.getObject("name"));
System.out.println("password="+rs.getObject("password"));
System.out.println("email="+rs.getObject("email"));
System.out.println("birthday="+rs.getObject("birthday"));
}
//6.关闭连接,释放资源(一定要做) 先开后关
rs.close();
statement.close();
connection.close();
}
}
预编译SQL
public class TestJDBC2 {
public static void main(String[] args) throws Exception {
//配置信息
//useUnicode=true&characterEncoding=utf-8 解决中文乱码
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.编写SQL
String sql = "insert into users(id, name, password, email, birthday) values (?,?,?,?,?);";
//4.预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,24);//给第一个占位符? 的值赋值为24;
preparedStatement.setString(2,"狂神说Java");//给第二个占位符? 的值赋值为狂神说Java;
preparedStatement.setString(3,"123456");//给第三个占位符? 的值赋值为123456;
preparedStatement.setString(4,"24736743@qq.com");//给第四个占位符? 的值赋值为1;
preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符? 的值赋值为new Date(new java.util.Date().getTime());
//5.执行SQL
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("插入成功@");
}
//6.关闭连接,释放资源(一定要做) 先开后关
preparedStatement.close();
connection.close();
}
}
小TIP:如果右侧的database和maven隐藏了,该如何调出来?
解决办法:View—>Tool Windows
或者点击左下角这个小东西
事务
要么都成功,要么都失败!
ACID原则(原子性、一致性、隔离性、持久性):保证数据的安全。
状态:
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
举例:
转账:
A:1000
B:1000
A(900) --100--> B(1100)
转账过程中,服务器崩坏怎么办?
Junit单元测试
如果没有main方法,但还想测试,此时可以用junit来测试
依赖
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
简单使用
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!
@Test
public void test(){
System.out.println("Hello");
}
失败的时候是红色:
搭建一个环境
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(40),
money FLOAT
);
INSERT INTO account(`name`,money) VALUES('A',1000);
INSERT INTO account(`name`,money) VALUES('B',1000);
INSERT INTO account(`name`,money) VALUES('C',1000);
此时先commit再rollback是没有用的
rollback放在commit前
@Test
public void test() {
//配置信息
//useUnicode=true&characterEncoding=utf-8 解决中文乱码
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
Connection connection = null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库,代表数据库
connection = DriverManager.getConnection(url, username, password);
//3.通知数据库开启事务,false是开启,true是关闭
connection.setAutoCommit(false);
String sql = "update account set money = money-100 where name = 'A'";
connection.prepareStatement(sql).executeUpdate();
//制造错误
//int i = 1/0;
String sql2 = "update account set money = money+100 where name = 'B'";
connection.prepareStatement(sql2).executeUpdate();
connection.commit();//以上两条SQL都执行成功了,就提交事务!
System.out.println("success");
} catch (Exception e) {
try {
//如果出现异常,就通知数据库回滚事务
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}