JavaWeb-MyBatis


一、MyBatis入门

1.1 快速入门

1.1.1 创建SpringBoot-MyBatis工程

在这里插入图片描述

1.1.2 创建数据库

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80013
 Source Host           : localhost:3306
 Source Schema         : spingboot-mybatis-demo

 Target Server Type    : MySQL
 Target Server Version : 80013
 File Encoding         : 65001

 Date: 05/01/2024 10:29:12
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL,
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `gender` bigint(20) NULL DEFAULT NULL,
  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '张三', 55, 1, '18800000000');
INSERT INTO `user` VALUES (2, '李四', 45, 1, '18800000001');
INSERT INTO `user` VALUES (3, '王五', 38, 1, '18800000002');
INSERT INTO `user` VALUES (4, '赵六', 42, 2, '18800000003');
INSERT INTO `user` VALUES (5, '田七', 37, 1, '18800000004');
INSERT INTO `user` VALUES (6, '刘八', 48, 1, '18800000005');

SET FOREIGN_KEY_CHECKS = 1;

1.1.3 加载POM依赖

<!-- Mybatis的起步依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

<!-- MySQL启动包 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- Mybatis 单元测试依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter-test</artifactId>
    <version>3.0.3</version>
    <scope>test</scope>
</dependency>

1.1.4 配置Mytabis

# 数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# URL
spring.datasource.url=jdbc:mysql://localhost:3306/spingboot-mybatis-demo
# 用户名
spring.datasource.username=root
# 密码
spring.datasource.password=root

注意:如果properties文件中出现中文乱码

在这里插入图片描述

1.1.5 pojo:编写用户实体类

省略

1.1.6 service:编写查询用户信息的结构

@Mapper  // 在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
    /**
     * 查询全部用户信息
     */
    @Select("select * from user")
    public List<User> userList();
}

1.1.7 测试

@SpringBootTest  // springboot 整合单元测试的注解
class SpringbootMybatisApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testUserList() {
        List<User> users = userMapper.userList();
        users.forEach(user -> {
            System.out.println(user);
        });
    }
}

在这里插入图片描述

1.1.8 默认在MyBatis中编写SQL是没有提示的,可以做如下配置

在这里插入图片描述
如果编写的SQL语句表名报红,需要在IDEA中连接数据库

1.2 数据库连接池

  • 数据库连接池是一个容器,负责分配,管理数据库连接
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
  • 优点:
    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏
<!-- druid 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>

连接池配置

# 数据库连接池驱动
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
spring.datasource.druid.initial-size=10
# 最小连接池数量
spring.datasource.druid.min-idle=10
# 最大连接池数量
spring.datasource.druid.max-active=200
# 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置
spring.datasource.druid.max-wait=60000
# 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 验证数据库服务可用性的sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL
spring.datasource.druid.validation-query=SELECT 1
# 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun
spring.datasource.druid.test-while-idle=true
# 申请连接时直接检测连接是否有效.申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
spring.datasource.druid.test-on-borrow=false
# 归还连接时检测连接是否有效.归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
spring.datasource.druid.test-on-return=false
# 开启PSCache
spring.datasource.druid.pool-prepared-statements=true
# 设置PSCache值
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 连接出错后再尝试连接三次
spring.datasource.druid.connection-error-retry-attempts=3
# 数据库服务宕机自动重连机制
spring.datasource.druid.break-after-acquire-failure=true
# 连接出错后重试时间间隔
spring.datasource.druid.time-between-connect-error-millis=300000
# 异步初始化策略
spring.datasource.druid.async-init=true
# 是否自动回收超时连接
spring.datasource.druid.remove-abandoned=true
# 超时时间(以秒数为单位)
spring.datasource.druid.remove-abandoned-timeout=1800
# 事务超时时间
spring.datasource.druid.transaction-query-timeout=6000
# 连接池的过滤器的属性
spring.datasource.druid.filters=stat,wall,log4j2
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.use-global-data-source-stat=true
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connection-properties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000

1.3 LomBok

通过注解,自动生成构造器,getter/setter、equals、hashCode、toString等方法,并且可以自动化生成日志变量,简化Java开发、提高效率

在这里插入图片描述

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private Integer gender;
    private String phone;
}

二、MyBatis基础操作

在这里插入图片描述

2.1 删除

@Delete("delete from emp where id= #{id}")
public void deleteEmp(Integer id);

2.2 新增

注意:如果需要新增主键返回,需要增加@Options注解

@Options(keyProperty = "id", useGeneratedKeys = true)  // 主键返回
@Insert("INSERT INTO emp(username,password,name,gender,image,job,entrydate,create_time,update_time,dept_id) " +
       "VALUES(#{username}, #{password}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{createTime}, #{updateTime}, #{deptId})")
public void insertEmp(Emp emp);

2.3 修改

@Update("update emp set dept_id=#{deptId}, update_time=#{updateTime} where id=#{id}")
public void updateEmp(Emp emp);

2.3 查询

注意:如果存在驼峰命名的变量,需要开启Mybatis的驼峰命名封装

mybatis.configuration.map-underscore-to-camel-case=true

2.3.1 根据ID查询员工信息

@Select("select * from emp where id=#{id}")
public Emp selectEmpById(Integer id);

2.3.2 模糊查询

  • 方式一:${}

注意:模糊查询应该使用${}传递参数,而不是#{}

@Select("select * from emp where name like '%${name}%' and gender=#{gender}")
public List<Emp> selectEmpWhere(Emp emp);
  • 方式二:concat('%',#{},'%')【推荐使用】
@Select("select * from emp where name like concat('%', #{name}, '%') and gender=#{gender}")
public List<Emp> selectEmpWhere(Emp emp);

三、XML映射文件

3.1 规范

  • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
  • XML映射文件的namespace属性为Mapper接口全限定名一致
  • XML映射文件中SQL语句的ID与Mapper接口中的方法名一致,并保持返回类型一致。

在这里插入图片描述
XML文件约束

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
    ...
</mapper>

3.2 MybatisX

快速定位XML文件的位置

在这里插入图片描述

3.3 案例

<select id="selectEmpWhere" resultType="com.ming.pojo.Emp">
    select * from emp where name like concat('%', #{name}, '%')  and gender=#{gender} order by update_time desc
</select>
属性说明
resultType返回值类型:指的是单条记录所封装的类型

四、动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句,我们称之为动态SQL

4.1 IF语句

<select id="selectEmpWhere" resultType="com.ming.pojo.Emp">
    select * from emp
    <where>
        <if test="name != null">
            name like concat('%', #{name}, '%')
        </if>
        <if test="gender != null">
            and gender=#{gender}
        </if>
    </where>
    order by update_time desc
</select>
<update id="updateEmp">
    update emp
    <set>
        <if test="deptId != null">
            dept_id=#{deptId},
        </if>
        <if test="updateTime != null">
            update_time=#{updateTime}
        </if>
    </set>
    <where>
        <if test="id != null">
            id = #{id}
        </if>
    </where>
</update>

在这里插入图片描述

4.2 ForEach语句【批量删除】

<delete id="deleteEmps">
    delete from emp
    <where>
        id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </where>
</delete>
属性说明
collection遍历的集合
item遍历出来的元素
separator分隔符
open遍历之前拼接的SQL片段
close遍历结束后拼接的SQL片段

4.3 <sql><include>

SQL片段的抽取和引用,一般联合使用

<sql id="commonSelect">
    id,username,password,name,gender,image,job,entrydate,create_time,update_time,dept_id
</sql>
<select id="selectEmpWhere" resultType="com.ming.pojo.Emp">
    select
    <include refid="commonSelect"></include>
    from emp
</select>
  • 34
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面只是目标目录 ├─第1章-Shiro权限实战课程介绍 │ 1-1Shiro权限实战课程介绍.mp4 │ 1-2权限控制和初学JavaWeb处理访问权限控制.mp4 │ ├─第2章-大话权限框架核心知识ACL和RBAC │ 2-1权限框架设计之ACL和RBAC讲解.mp4 │ 2-2主流权限框架介绍和技术选型讲解.mp4 │ ├─第3章-ApacheShiro基础概念知识和架构讲解 │ 3-1Shiro核心知识之架构图交互和四大模块讲解.mp4 │ 3-2用户访问Shrio权限控制运行流程和常见概念讲解.mp4 │ ├─第4章-Springboot2.x整合ApacheShiro快速上手实战 │ 4-1SpringBoot2.x整合Shiro.mp4 │ 4-2快速上手之Shiro认证和授权流程实操上集.mp4 │ 4-3Shiro认证和授权流程和常用API梳理下集.mp4 │ ├─第5章-详细讲解ApacheShirorealm实战 │ 5-1Shiro安全数据来源之Realm讲解.mp4 │ 5-2快速上手之Shiro内置IniRealm实操.mp4 │ 5-3快速上手之Shiro内置JdbcRealm实操.mp4 │ 5-4ApacheShiro自定义Readl实战.mp4 │ 5-5深入Shiro源码解读认证授权流程.mp4 │ ├─第6章-Shiro权限认证Web案例知识点讲解 │ 6-1Shiro内置的Filter过滤器讲解.mp4 │ 6-2Shiro的Filter配置路径讲解.mp4 │ 6-3Shiro数据安全之数据加解密.mp4 │ 6-4Shiro权限控制注解和编程方式讲解.mp4 │ 6-5Shiro缓存模块讲解.mp4 │ 6-6ShiroSession模块讲解.mp4 │ ├─第7章-ApacheShiro整合SpringBoot2.x综合案例实战 │ 7-10使用ShiroLogout和加密处理.mp4 │ 7-1Shiro整合SpringBoot2.x案例实战介绍.mp4 │ 7-2基于RBAC权限控制实战之Mysql数据库设计.mp4 │ 7-3SpringBoot2.x项目框架和依赖搭建.mp4 │ 7-4案例实战之权限相关服务接口开发.mp4 │ 7-5案例实战之用户角色权限多对多关联查询SQL.mp4 │ 7-6案例实战自定义CustomRealm实战.mp4 │ 7-7项目实战之ShiroFilterFactoryBean配置实战.mp4 │ 7-8前后端分离自定义SessionManager验证.mp4 │ 7-9API权限拦截验证实战.mp4 │ ├─第8章-权限控制综合案例实战进阶 │ 8-1实战进阶之自定义ShiroFilter过滤器上集.mp4 │ 8-2实战进阶之自定义ShiroFilter过滤器下集.mp4 │ 8-3性能提升之Redis整合CacheManager.mp4 │ 8-4性能提升之Redis整合SessionManager.mp4 │ 8-5ShiroConfig常用bean类配置.mp4 │ ├─第9章-大话分布式应用的鉴权方式 │ 9-1单体应用到分布式应用下的鉴权方式介绍.mp4 │ 9-2Shiro整合SpringBoot下自定义SessionId.mp4 │ ├─第10章-Shiro课程总结 │ 10-1Apacheshiro从入门到高级实战课程总结.mp4 │ 10-2高级工程师到架构师-解决问题思路+学习方法.mp4 │ └─课件资料.zip
Java EE 项目的目录结构可以根据具体的需求进行灵活设计,但一般情况下,推荐使用以下的标准目录结构: ``` project ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ ├── controller │ │ │ ├── dao │ │ │ ├── entity │ │ │ ├── service │ │ │ └── util │ │ ├── resources │ │ │ ├── mapper │ │ │ └── db.properties │ │ └── webapp │ │ ├── WEB-INF │ │ │ ├── classes │ │ │ ├── lib │ │ │ └── web.xml │ │ ├── css │ │ ├── js │ │ ├── images │ │ └── index.jsp │ └── test │ ├── java │ └── resources ├── target ├── pom.xml └── README.md ``` 其中,各个目录的作用如下: - `src/main/java`:存放项目的 Java 源代码,按照包名分层,一般包括 `controller`、`dao`、`entity`、`service` 和 `util` 等包; - `src/main/resources`:存放项目的配置文件和资源文件,一般包括数据库连接配置文件 `db.properties`、MyBatis 的 mapper 文件等; - `src/main/webapp`:存放 Web 应用的 Web 资源,包括 JSP 页面、CSS 样式表、JavaScript 脚本等; - `src/test/java`:存放项目的测试代码; - `src/test/resources`:存放测试代码所需要的资源文件; - `target`:存放编译后的 .class 文件、打包后的 .war 文件等; - `pom.xml`:Maven 项目管理工具的配置文件; - `README.md`:项目说明文件。 以上是一种常见的 Java EE 项目目录结构,但并不是唯一的标准。在实际开发中,可以根据项目的具体需求进行合理的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monly21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值