JavaWeb入门笔记

发布时间 2023-10-11 14:13:56作者: Cold的窝

1.JDBC

简介:JDBC就是使用Java语言操作关系型数据库的一套API

		//注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获得连接对象
        String url = "jdbc:mysql://127.0.0.1:3306/test";//?useSSL=false
        String username = "root";
        String password = "123";
        Connection conn = DriverManager.getConnection(url, username, password);
        //定义sql
        String sql = "update buzhu set B_jine = 800 WHERE B_name = '张三'";
        //获得执行sql对象
        Statement statement = conn.createStatement();
        //执行sql
        int count = statement.executeUpdate(sql);
        System.out.println(count);
		//释放资源
 		statement.close();
        conn.close();

1.1DriverManager

DriverManager(驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库连接

提示:
MySQL 5之后的驱动包,可以省略注册驱动的步骤自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

返回值 方法
static Connection getConnection (String url, string user, string password)

语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2.

示例: jdbc:mysql://127.0.0.1:3306/db1

细节:如果连接的是本机mysq服务器,并且mysq服务默认端口是3306,则ur可以简写为: jdbc:mysal://数据库名称?参数键值对.配置useSSL=false 参数,禁用安全连接方式,解决警告提示

1.1.1Connection对象

获取执行SQL的对象

普通执行SQL对象

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入(常用

PreparedStatement prepareStatement(sql)

执行存储过程的对象(不常用)

CallableStatement prepareCall(sql)

1.1.2MySQL 事务管理

开启事务: BEGIN;/START TRANSACTION;

提交事务: COMMIT;

回滚事务: ROLLBACK;

MySQL默认自动提交事务

1.1.3JDBC事务管理: Connection接口中定义了3个对应的方法

开启事务: setAutoCommit(boolean autoCommit); true为自动提交事务; false为手动提交事务,即为开启事务

提交事务: commit();

回滚事务: rollback();

1.1.4Statement

作用: 执行SQL语句

int executeUpdate(sql); //执行DML、DDL语句

数据操纵语言DML主要有三种形式:

  1. 插入:INSERT
  2. 更新:UPDATE
  3. 删除:DELETE

数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。DDL操作是隐性提交的!不能rollback

返回值: (1)DML语句影响的行数(2) DDL语句执行后,执行成功也可能返回 0

ResultSet executeQuery(sql); //执行DQL 语句

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>

返回值: ResultSet 结果集对象

1.1.5¥ResultSet

ResultSet(结果集对象)作用: 封装了DQL查询语句的结果

boolean next(); //(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行

返回值:
true:有效行,当前行有数据
false: 无效行,当前行没有数据

xxx getXxx(参数); //获取数据xxX

xxx: 数据类型;如: int getlnt(参数); String getString(参数)
参数:
int: 列的编号,从1开始
String:列的名称

//循环判断游标是否是最后一行末尾
while(rs.next(){
	//获取数据
	rs.getXxx(参数);
}

例子:

//获得执行sql的对象
String sql = "select * from buzhu";
        Statement statement = conn.createStatement();
        //执行sql获得查询结果对象
        ResultSet resultSet = statement.executeQuery(sql);

        while (resultSet.next()){
            int id = resultSet.getInt(1);
            int money = resultSet.getInt(2);
            String name = resultSet.getString(3);
            String status = resultSet.getString(4);

            System.out.println(id + ": "+ money + " " + name + " " + status);
        }
        //释放资源
        resultSet.close();
        statement.close();
        conn.close();

SQL注入(引出下文PreparedStatement)

原因:就是因为拼接字符串而导致,所以引入下一个知识点PreparedStatement

String url = "jdbc:mysql://127.0.0.1:3306/test";//?useSSL=false
        String username = "root";
        String password = "123";
        Connection conn = DriverManager.getConnection(url, username, password);


        String name = "4565";
        String pwd = "' or '1' = '1";

        String sql = "select * from user where username = '" + name + "' and password = '" + pwd + "'";

        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);

        if(resultSet.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

        resultSet.close();
        statement.close();
        conn.close();

1.1.6¥PreparedStatement

PreparedStatement作用: 预编译SQL并执行SQL语句

获得PreparedStatement对象:

String sql = "select * from tb_student where username = ? and password = ?";
PreparedStatement pstmt = conn.PreparedStatement(sql);

设置参数值:

PreparedStatement对象: setXxx(参数一, 参数二); 给?赋值
    Xxx:数据类型; 如setInt(参数一, 参数二);

参数:
    参数一:?的位置编号,从1开始
    参数二:?的值

执行SQL:

executeUpdate();

executeQuery();
//不需要在传递sql

PreparedStatement 原理

PreparedStatement 好处:

  • 预编译SQL,性能更高
  • 防止SQL注入: 将敏感字符进行转义

PreparedStatement 预编译功能开启:

useServerPrepStmts=true

配置MySQL执行日志(重启mysql服务后生效)

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:mysql_slow.log"
long_query_time=2

原理小结:

  1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
  2. 执行时就不用再进行这些步骤了,速度更快
  3. 如果sql模板一样,则只需要进行一次检查、编译

1.2Druid数据库连接池

数据库连接池简介:

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
  • 好处
    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏

数据库连接池实现

1.2.1标准接口: DataSource

  • 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。

  • 功能:获取连接

    Connection getConnection()
        
    //使用DataSource就不要用DriverManager来获得数据库连接的对象了
    

常见的数据库连接池

  • DBCP
  • C3PO
  • Druid

Druid(德鲁伊)

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是Java语言最好的数据库连接池之一
//因为在使用Druid时还要配置druid.properties文件,所以在写Java时要加载入Properties对象

//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));

//4. 获取连按池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

//5. 获取数据库连接 Connection
Connection connection = dataSource.getConnection():

System.out.printin(connection)

2.Maven

简介:

  • Maven是专门用于管理和构建Java项目的工具,它的主要功能有
  • 提供了一套标准化的项目结构
  • 提供了一套标准化的构建流程 (编译,测试,打包,发布......)
  • 提供了一套依赖管理机制

依赖管理:

依赖管理其实就是管理你项目所依赖的第三方资源(jar包、插件...)

没用maven前需要手动下载和导入jar包

使用maven导入jar包

本地仓库配置

<localRepository>D:\Maven\apache-maven-3.6.3\mvn_resp</localRepository>

阿里云私服配置

<mirror>
		<id>aliyunmaven</id>
		<name>aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		<mirrorOf>central</mirrorOf>
	</mirror>

2.1Maven 常用命令

  • compile: 编译
  • clean: 清理
  • test: 测试
  • package: 打包
  • install: 安装

推荐批量编译调试maven项目插件:Maven Helper

2.2依赖管理

3.MyBatis

3.1.介绍

什么是MyBatis?

  • MyBatis 是一款优秀的持久层框架,用于简化JDBC开发
  • MyBatis 本是 Apache 的一个开源项目iBatis,2010年这个项目由apache softwarefoundation 迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
  • 官网: https://mybatis.org/mybatis-3/zh/index.html

持久层

  • 负责将数据到保存到数据库的那一层代码
  • JavaEE三层架构: 表现层、业务层、持久层

框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

3.2.操作

3.2.1导入依赖坐标

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!--junit 单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加slf4j日志api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>
        <!-- 添加logback-classic依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- 添加logback-core依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

3.2.2 XML配置

在resources中创建mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
      <!--可以配置多个数据库,开发时会配置测试test的数据库如下 -->
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.driver"/>
        <property name="url" value="jdbc:mysql:///db_student"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
      </dataSource>
    </environment>
      <!-- test数据库 -->
       <environment id="test">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
      
  </environments>
    <!-- resource: 加载sql的文件  如2.2.2-->
  <mappers>
    <mapper resource="StudentMapper.xml"/>
  </mappers>
</configuration>

sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="空间名称">
  <select id="标识符" resultType="对应包装类的com地址">
    select * from Blog where id = #{id}
  </select>
</mapper>

3.3 Mapper代理开发

3.3.1创建Mapper接口

3.2将核心配置文件放到Mapper代理接口同一目录下


3.3将名称空间设为Mapper接口的com地址