黑马旅游网-学习笔记Part03

YangeIT大约 28 分钟旅游项目TomcatNavicatMybatis

黑马旅游网-学习笔记Part03

今日目标

  • Mybatis介绍和核心概念Java操作数据库
  • Mybatis基本配置 🍐
  • 实操Mybatis的入门案例✏️
  • 结合Servlet项目完成登录案例和通过名字查询用户案例 ✏️
  • Redis入门
  • Nginx反向代理服务器

前置知识

  • 环境变量
    • jdk 8 +
    • MySQL 5.7以上
    • maven-3.6.1
    • IDEA
  • 知识要求
    • JDBC
    • MySQL
    • Java基础
    • Maven
    • Junit(单元测试)

1. Mybatis简介和入门案例

Mybatis简介和入门案例

MyBatis
MyBatis

MyBatis 是一个持久层框架,用于简化 Java 应用程序与关系型数据库的交互。它通过将 SQL 语句与 Java 代码进行映射,提供了一种方便且灵活的方式来访问和操作数据库

中文网open in new window

入门案例操作

  1. 创建 Maven 项目如果有Maven工程,可以直接用:创建一个新的 Maven 项目,并在 pom.xml 文件中添加 MyBatis 相关的依赖,例如 mybatis、mybatis-spring 等。
  2. 配置数据库连接:在配置文件中配置数据库连接信息,包括数据库驱动、连接 URL、用户名和密码等。
  3. 编写数据映射文件:创建一个 XML 文件,定义数据表与 Java 对象的映射关系,包括 SQL 语句、参数映射和结果映射等。
  4. 编写数据访问接口:创建一个 Java 接口,定义数据访问的方法,使用注解或 XML 配置与数据映射文件进行关联。
  5. 配置 MyBatis:在配置文件中配置 MyBatis 的相关信息,包括数据源、事务管理器、数据映射文件的路径等。
  6. 编写业务逻辑代码:编写业务逻辑的 Java 代码,调用数据访问接口来执行数据库操作。
  7. 测试和运行:编写测试代码,验证数据库操作的正确性,然后运行应用程序,观察结果是否符合预期。

目标1:查询用户id为22的用户信息 🎯

  1. 创建表格user表
  2. 往表中插入下列假数据
-- 删除原有数据库
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL DEFAULT '12345678',
  `age` int(10) NOT NULL,
  `hobby` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `department` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('8', '赵灵儿', '12345678', '20', '阵法、法术修炼', '纯真善良的女子,拥有强大的阴阳之力', '阴阳家');
INSERT INTO `user` VALUES ('9', '楚留香', '12345678', '32', '剑术、侠义行侠', '风流倜傥的豪客,以智慧和剑术征服江湖', '江湖人士');
INSERT INTO `user` VALUES ('10', '白浅', '12345678', '26', '宫廷舞蹈、仙法修炼', '美丽高贵的仙子,守护爱与正义的力量', '青丘派');
INSERT INTO `user` VALUES ('11', '苏明玉', '12345678', '29', '医术、家族事务', '聪明伶俐的女医生,心系家族兴衰', '苏家');
INSERT INTO `user` VALUES ('12', '陆雪琪', '12345678', '24', '法术、仙法修炼', '冷傲美丽的仙子,坚守本心与正义', '青云门');
INSERT INTO `user` VALUES ('13', '李逍遥', '12345678', '28', '剑术、侠义行侠', '潇洒自如的剑客,为爱与正义奋斗', '天墉城');
INSERT INTO `user` VALUES ('14', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('15', '程灵素', '12345678', '27', '仙法、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('16', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('17', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('18', '萧炎', '12345678', '25', '功夫、修炼', '机缘巧合下拥有强大火焰之力的少年', '草庙村');
INSERT INTO `user` VALUES ('19', '陆九淳', '12345678', '29', '家族事务、剑术修炼', '家族责任重于一切的江湖少年', '陆家');
INSERT INTO `user` VALUES ('20', '韩立', '12345678', '22', '灵力修炼、阵法研究', '机智聪明的年轻修士,掌握神奇的法术', '韩家');
INSERT INTO `user` VALUES ('21', '顾惜朝', '12345678', '28', '法术修炼、守护门派', '心地善良的女子,为守护门派而战', '古玄门');
INSERT INTO `user` VALUES ('22', '九霄真人', '12345678', '35', '仙法修炼、教导弟子', '威严正直的仙人,指导后辈修仙道路', '蓝霞宫');
INSERT INTO `user` VALUES ('23', '姬昌', '12345678', '33', '阴阳术、仙法修炼', '智勇双全的江湖人物,掌握阴阳之力', '太阴派');
INSERT INTO `user` VALUES ('24', '西门吹雪', '12345678', '30', '剑术、侠义行侠', '风流倜傥的剑客,执着追求剑道境界', '独孤家');
INSERT INTO `user` VALUES ('25', '夏冰', '12345678', '26', '魔法修炼、冰雪之力', '美丽神秘的女子,掌握冰雪之力', '幻冥宗');
INSERT INTO `user` VALUES ('26', '杨影枫', '12345678', '27', '暗器、侠义行侠', '冷酷无情的刺客,为正义而战', '影家');
INSERT INTO `user` VALUES ('27', '白素素', '12345678', '24', '文学创作、人界事务', '善良纯真的女子,用文字记录人间百态', '人界');
INSERT INTO `user` VALUES ('28', '独孤剑', '12345678', '32', '剑术、侠义行侠', '心系家族的剑客,剑法高超', '独孤家');
INSERT INTO `user` VALUES ('29', '楚九霄', '12345678', '28', '阵法、家族事务', '机智聪明的年轻人,心系家族荣耀', '楚家');
INSERT INTO `user` VALUES ('30', '谢晓峰', '12345678', '31', '拳脚功夫、江湖恩怨', '正直勇敢的江湖豪杰,忠于兄弟情义', '铁血帮');
INSERT INTO `user` VALUES ('31', '叶孤城', '12345678', '29', '剑术、侠义行侠', '冷酷无情的剑客,追求剑道极致', '武境城');
INSERT INTO `user` VALUES ('32', '李逸风', '12345678', '25', '修炼、探险', '热血青年,勇往直前探索未知世界', '蓝枫大陆');
INSERT INTO `user` VALUES ('33', '萧霜', '12345678', '27', '冰雪法术、守护宗门', '冷艳高傲的女子,守护冰霜宗的利益', '冰霜宗');
INSERT INTO `user` VALUES ('34', '楚玉峰', '12345678', '30', '家族事务、阵法修炼', '机智聪明的年轻人,家族责任重于一切', '楚家');
INSERT INTO `user` VALUES ('35', '陆雪琪', '12345678', '24', '法术、修行', '美丽冷傲的仙子,修炼法术追求修行境界', '青云门');
INSERT INTO `user` VALUES ('36', '明月心', '12345678', '26', '琴音、舞蹈', '温柔善良的女子,以音乐传递爱与希望', '云裳派');
INSERT INTO `user` VALUES ('37', '程灵素', '12345678', '27', '仙法修炼、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('38', '韩非', '12345678', '23', '学术研究、阵法修炼', '聪明睿智的年轻人,研究阵法和学术', '韩家');
INSERT INTO `user` VALUES ('39', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('40', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('41', '楚轩辕', '12345678', '28', '家族事务、剑术修炼', '家族责任重于一切的剑客', '楚家');
INSERT INTO `user` VALUES ('42', '秦王', '12345678', '35', '政务、战争', '智勇双全的帝王,统一六国的志向', '秦国');
INSERT INTO `user` VALUES ('43', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('44', '唐三藏', '12345678', '45', '佛法修行、西行取经', '慈悲心肠的高僧,带领徒弟西天取经', '大唐');
INSERT INTO `user` VALUES ('45', '吴青烟', '12345678', '26', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');

注意:如果出现了找不到包的情况,可以在maven中执行 mvn -U idea:idea 命令

目标2:完成用户和密码登录的功能需求 🎯

  1. 编写数据访问接口
public interface UserMapper {

    User selectByUserAndPassword(@Param("name") String name, @Param("password") String password);

}
  1. 编写数据映射文件

#{变量} 表示占位符,获取变量中的数据

<?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="cn.itcast.mapper.UserMapper">

    <select id="selectByUserAndPassword" resultType="cn.itcast.domain.User">

    SELECT  * from user where name=#{name} and password=#{password}

    </select>


</mapper>

目标3:完成查询姓韩的员工查询,如果传入null或者‘’返回全部员工 🎯

  1. 编写数据访问接口
public interface UserMapper {

    List<User> selectByName(@Param("name") String name);
}

  1. 编写数据映射文件,书写动态sql

if标签负责条件判断 where标签负责条件和去除多余的and 或者or字段


    <select id="selectByName" resultType="cn.itcast.domain.User">

    SELECT  * from user

    <where>
        <if test="name!=null and name != ''">

           and name like concat('%',#{name},'%')
        </if>

    </where>

    </select>





 
 
 
 
 
 
 


2. Redis简介和入门

前言

Redis
Redis

Redis是一个基于 内存key-value结构 数据库。Redis 是互联网技术领域使用最为广泛的存储中间件Enum

点击查看详细介绍

Jedis 是 Redis 的 Java 版本的客户端实现。

使用 Jedis 操作 Redis 的步骤:

  1. 启动Redis-Server
  2. 在工程中添加依赖
  3. 获取连接,执行操作,关闭连接
  4. 尝试其他数据类型

按照下述步骤,启动redis-server,在windows下不要关掉cmd窗口哦!!!

启动步骤
启动步骤

3. Redis缓存Mybatis数据

Redis缓存Mybatis数据

image
image

问题:上述场景非常普遍,受制于数据库性能,随着并发增加,系统IO压力非常大,用户体验下降!

解决方案 :因此,需要将热门数据缓存到Redis中,执行先查缓存,如果缓存存在,直接返回,如果缓存不存在,在查询数据库,并将数据存在缓存中,下一次查询将不会直接查数据库

点击查看思路图open in new window

代码操作

将性全部数据缓存到redis中,下次查的时候都不会进入数据库,减少数据库的压力

   public static void main(String[] args) throws IOException {
        //通过工厂类获得SqlSession
         SqlSession sqlSession = MybatisFactoryUtil.getSqlSessionFactory().openSession();
        //4.sqlSession获得UserMapper接口的代理实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //5.代理对象mapper对用其方法,查询数据库
        List<User> users = mapper.findAllUser();
       //6.打印结果
        users.stream().forEach(s-> System.out.println(s));
    }
image
image

MybatisFactoryUtil工具类代码:

public class MybatisFactoryUtil {
//    1. 在内存中只有一份实例----->单例模式(懒汉式和饿汉式)
    static  SqlSessionFactory build;

    static{
        InputStream resourceAsStream = null;
        try {
            resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        build = new SqlSessionFactoryBuilder().build(resourceAsStream);

    }

    /**
     * 饿汉式
     * @return
     */
    public static  SqlSessionFactory getSqlSessionFactory(){


        return build;

    }
}

4.Nginx服务器

前言

image
image

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强 ,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx的网站有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

官网:https://nginx.org/open in new window

负载均衡操作验证👇👇

1). 将资料中提供的两个jar包,上传到192.168.200.201服务器上

jar运行端口请求链接响应数据
image-20210831081023098
8080/hello8080
image-20210831081038807
8081/hello8081

我们在测试时,并没有那么多服务器,我们可以在一台服务器中启动多个服务,运行在不同的端口号上进行测试。