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>
posted @ 2025-05-04 16:24  乘加法  阅读(7)  评论(0)    收藏  举报