JavaWeb入门到实战[狂神]-3
MVC的延续
JDBC
什么是JDBC,java连接数据库

1、导入数据库依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
2、IDEA中连接数据库
3、JDBC固定步骤
package JDBC;
import javax.servlet.ServletException;
import java.io.IOException;
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws ServletException, IOException, ClassNotFoundException, SQLException {
//配置数据库连接信息
//解决中文乱码问题
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "123456";
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.向数据库发送SQL的对象statement:CRUD
Statement statement = connection.createStatement();
//4.编写SQL语句
String query = "select * from users";
//5.执行SQL语句,返回一个ResultSet对象
//增删改都是用executeUpdate
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
System.out.println("id: " + resultSet.getObject("id") );
System.out.println("name: " + resultSet.getObject("name"));
System.out.println("email: " + resultSet.getObject("email"));
System.out.println("password: " + resultSet.getObject("password"));
System.out.println("birthday: " + resultSet.getObject("birthday"));
}
//6.关闭资源
connection.close();
statement.close();
resultSet.close();
}
}
JDBC事务
事务:要么都成功,要么都失败
ACID原则:保证数据的安全
开启事务
事务提交 commit
事务回滚 rollback
关闭事务
转账
A:1000
B:1000
A(900)--100--B(1100)一组事务
知识补充
Junit单元测试,加入这个依赖,不写main方法都可以启动
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
加入Test注解
public class TestJDBC3 {
@Test
public void test() {
System.out.println("test");
}
}
1、数据库语言,要创建一个事务
start transaction ;#开户事务
update account set money = money - 100 where name ='A';
update account set money=money+100 where name='B';
commit ;#提交事务
2、JAVA中的事务的创建,正常finally是要失败就得回滚,本案例没有体现回滚,如果事务的语言没有执行完,就要回滚,保证账户的准确性
package JDBC;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestJDBC3 {
@Test
public void test() throws ClassNotFoundException, SQLException {
//配置数据库连接信息
//解决中文乱码问题
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "123456";
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.通知数据库开启事务
connection.setAutoCommit(false);
//4.创建SQL语句
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();
//5.提交事务
connection.commit();
System.out.println("事务提交成功!");
}
}
smbms超市订单管理系统
1、搭建一个maven web项目
2、配置tomcat
3、测试tomcat是否能跑起来
4、导入项目会遇到的jar包(jsp,servlet,mysql,jstl,stand)
5、创建项目包结构

6、编写实体类
ORM映射:表-类映射
7、编写基础公共类
--数据库配置文件
driver=com.mysql.jdbc.Driver
# 在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
--编写数据库的公共类
package com.github.dao;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @Description: 操作数据库的公共类
*/
public class BaseDao {
private static String driver;
private static String url;
private static String username;
private static String password;
// 静态代码块,类加载时就初始化了
static{
Properties properties = new Properties();
// 通过类加载器读取对应的资源
InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try{
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
}
// 获取数据库的链接
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
// 编写查询公共类
public static ResultSet execute(Connection connection,PreparedStatement preparedStatement , ResultSet rs, String sql, Object[] params) throws SQLException {
// 预编译的SQL,在后面直接执行就行了
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
// setObject,占位符从1开始,但是数组是从0开始
preparedStatement.setObject(i+1,params[i]);
}
rs = preparedStatement.executeQuery();
return rs;
}
// 编写查询公共类
public static int execute(Connection connection, PreparedStatement preparedStatement, String sql, Object[] params) throws SQLException {
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
// setObject,占位符从1开始,但是数组是从0开始
preparedStatement.setObject(i+1,params[i]);
}
int updateRows = preparedStatement.executeUpdate();
return updateRows;
}
// 释放资源
public static boolean closeResult(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
boolean flag = true;
if(resultSet != null){
try {
resultSet.close();
// GC回收
resultSet = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if(preparedStatement != null){
try {
preparedStatement.close();
// GC回收
preparedStatement = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if(connection != null){
try {
connection.close();
// GC回收
connection = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
return flag;
}
}
--字符编码过滤
package com.github.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request,response);
}
public void destroy() {
}
}
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 字符编码过滤器 -->
<filter>
<filter-name>/characterEncodingFilter</filter-name>
<filter-class>com.cjj.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>/characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8、导入静态资源
登录流程实现
1、编写前端页面
2、设置首页
<!-- 设置欢迎页面 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
3。编写dao层登录用户的接口
package com.cjj.dao.user;
import com.cjj.pojo.User;
import java.sql.Connection;
public interface UserDao {
//得到要登录的用户
public User getLoginUser(Connection connection, String userCode);
}
4。编写dao接口的实现类
package com.cjj.dao.user;
import com.cjj.dao.BaseDao;
import com.cjj.pojo.User;
import java.sql.Connection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDaoImpl implements UserDao{
public User getLoginUser(Connection connection, String userCode) throws Exception {
PreparedStatement pstm = null;
ResultSet rs = null;
User user = null;
if(connection != null) {
String sql = "select * from smbms_user where userCode=?";
Object[] params = {userCode};
rs = BaseDao.execute(connection, pstm, rs, sql, params);
if(rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getTimestamp("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
}
BaseDao.closeResult(null,pstm,rs);
}
return user;
}
}
5。业务层接口
6。业务层实现类
代码案例参考
smbms密码修改实现
代码从底层往前端写

文件传输原理及介绍


下载两个包
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.18.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>

浙公网安备 33010602011771号