MyBatis学习笔记(二) —— 搭建MyBatis项目
2、搭建MyBatis
2.1、开发环境
IDE:idea 2019.2
构建工具:maven 3.5.4
MySQL版本:MySQL 8
MyBatis版本:MyBatis 3.5.7
MySQL不同版本的注意事项
1、驱动类 driver-class-name
MySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.Driver
MySQL 8版本使用jdbc8驱动,驱动类使用:com.mysql.cj.jdbc.Driver
2、链接地址url
MySQL 5版本的url :
jdbc:mysql://localhost:3306/ssm
MySQL 8版本的url :
jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
否则运行测试用例报告如下错误:
java.sql.SQLException: The server time zone value ‘xxxx’ is unrecoginized or represents more
如果连接的数据库没有设置编码的,需要加上参数characterEncoding=utf-8。
mysql8版本中不需要设置编码的参数,因为mysql8编码中默认支持中文的。需要加入serverTimezone的参数。
2.2、创建maven工程
Name: 入门案例
GroupId:maven的坐标,比如:com.fan.mybatis
ArtifactId:工程名
Version:版本号
① 打包方式:jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fan.mybatis</groupId><artifactId>mybatis_helloworld</artifactId><version>1.0-SNAPSHOT</version><!-- 设置打包方式为jar包 --><packaging>jar</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties>
</project>
② 引入依赖
<dependencies><!-- Mybatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency></dependencies>
main目录:存放的是主程序
test目录:存放的是测试程序
main/java目录:放的是java类
main/resources目录:放的是配置文件
test/java目录:放的是测试的java类
2.3、数据库
表和实体类是有映射关系的。
mysql创建数据库 ssm
创建t_user
2.4、创建实体类
package com.fan.mybatis.pojo;/*** @Date: 2023/02/19* @Author: fan* @Description:*/
public class User {private Integer id;private String username;private String password;private Integer age;private String gender;private String email;public User() {}public User(Integer id, String username, String password, Integer age, String gender, String email) {this.id = id;this.username = username;this.password = password;this.age = age;this.gender = gender;this.email = email;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +", gender='" + gender + '\'' +", email='" + email + '\'' +'}';}
}
2.5、创建MyBatis的核心配置文件
习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是 src/main/resources目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置连接数据库的环境 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 引入mybatis的映射文件 --><mappers><mapper resource="mappers/UserMapper.xml"/></mappers>
</configuration>
建议把时区设置在mysql里设置,这样就不用重复设置了
environments 开发环境(测试、生产、开发) dataSource 数据库 mappers 业务SQL
2.6、创建mapper接口
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
package com.fan.mybatis.mapper;public interface UserMapper {}
2.7、创建MyBatis的映射文件
相关概念:ORM(Object Relationship Mapping) 对象关系映射。
- 对象:Java的实体类对象
- 关系:关系型数据库
- 映射:二者之间的对应关系。
Java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
1、映射文件的命名规则:
表所对应的实体类的类名+Mapper.xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
MyBatis映射文件存放的位置是src/main/resources/mappers目录下
2、MyBatis中可以面向接口操作数据,要保证两个一致:
a> mapper接口的全类名和映射文件的命名空间(namespace)保持一致。
b> mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!--mapper接口和映射文件要保持一致:1、mapper接口的全类名和映射文件的namespace一致2、mapper接口中的方法的方法名要和映射文件中的sql的id保持一致--></mapper>
2.8、通过junit测试功能
打开数据库,截断
清空是把表中的数据都删除掉。
截断是把表删掉,创建一个一模一样的表。表中的id会重新开始。
刷新数据表
MyBatisTest.java
package com.fan.mybatis.test;import com.atguigu.mybatis.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;/*** @Date: 2023/02/21* @Author: fan* @Description:*/
public class MyBatisTest {@Testpublic void testInsert() throws IOException {//获取核心配置文件的输入流InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//获取sql的会话对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取sql的会话对象SqlSession(不会自动提交事务),是MyBatis提供的操作数据库的对象//SqlSession sqlSession = sqlSessionFactory.openSession();//获取sql的会话对象SqlSession(会自动提交事务),是MyBatis提供的操作数据库的对象SqlSession sqlSession = sqlSessionFactory.openSession(true);//获取UserMapper的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用mapper接口中的方法,实现添加用户的信息的功能int result = userMapper.insertUser();//提供sql以及的唯一标识找到sql并执行,唯一标识是namespace.sqlId//int result = sqlSession.insert("com.atguigu.mybatis.mapper.UserMapper.insertUser");System.out.println("结果:" + result);//提交事务//sqlSession.commit();//关闭SqlSessionsqlSession.close();}
}
- SqlSession:代表Java程序和数据库之间的会话。(HttpSession 是Java程序和浏览器之间的会话)
- SqlSessionFactory:是“生产”SqlSession的“工厂”。
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
2.9、加入log4j日志功能
① 加入依赖
<!-- log4j日志 -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</denpendency>
② 加入log4j的配置文件
log4j的配置文件名为log4.xml,存放的位置是src/main/resources目录下
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>
日志的级别
FATAL(致命)>ERROR()错误>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
运行后控制台打印信息如下:
2.10、创建工具类 SqlSessionUtils
SqlSessionUtils.java
package com.fan.mybatis.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** @Date: 2023/02/22* @Author: fan* @Description:*/
public class SqlSessionUtils {public static SqlSession getSqlSession(){SqlSession sqlSession = null;try {//获取核心配置文件的输入流InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilderSqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//获取SqlSessionFactorySqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取SqlSession对象sqlSession = sqlSessionFactory.openSession(true);} catch (IOException e) {e.printStackTrace();}return sqlSession;}
}
2.11、测试新增用户
在实现mybatis的增删改查的过程中,比较麻烦,特别是获取SqlSession的过程。可以直接创建一个工具类 SqlSessionUtil。
UserMapper.java
package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;public interface UserMapper {/*** 添加用户信息* @return*/int insertUser();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!-- int insertUser() --><insert id="insertUser">insert into t_user values(null,'admin','123456',23,'男','123456@qq.com')</insert>
</mapper>
运行测试类,控制台打印输出:
结果:1
数据库中可以看到新增一条数据
2.11、测试修改用户
在实现mybatis的增删改查的过程中,比较麻烦,特别是获取SqlSession的过程。可以直接创建一个工具类 SqlSessionUtil。
UserMapper.java
package com.fan.mybatis.mapper;/*** @Date: 2023/02/20* @Author: fan* @Description:*/
public interface UserMapper {/*** 修改用户信息*/void updateUser();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!-- void updateUser() --><update id="updateUser">update t_user set username = 'root',password='123' where id = 3</update>
</mapper>
Junit测试修改
@Testpublic void testUpdate(){//获取SqlSession对象SqlSession sqlSession = SqlSessionUtils.getSqlSession();//获取当前mapper接口的代理实现类对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//执行mapper接口的修改方法mapper.updateUser();//关闭SqlSessionsqlSession.close();
}
控制台输出:
DEBUG 02-22 10:58:20,396==> Preparing: update t_user set username = ‘root’,password=‘123’ where id = 3 (BaseJdbcLogger.java:137)
DEBUG 02-22 10:58:20,412==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-22 10:58:20,417<== Updates: 1 (BaseJdbcLogger.java:137)
数据库
2.12、测试删除用户
UserMapper.java
package com.fan.mybatis.mapper;/*** @Date: 2023/02/20* @Author: fan* @Description:*/
public interface UserMapper {/*** 删除用户信息*/void deleteUser();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!--mapper接口和映射文件要保持一致:1、mapper接口的全类名和映射文件的namespace一致2、mapper接口中的方法的方法名要和映射文件中的sql的id保持一致--><!-- int insertUser() --><insert id="insertUser">insert into t_user values(null,'admin','123456',23,'男','123456@qq.com')</insert><!-- void updateUser() --><update id="updateUser">update t_user set username = 'root',password='123' where id = 3</update><!-- void deleteUser() --><delete id="deleteUser">delete from t_user where id = 3</delete>
</mapper>
Junit测试删除用户
MyBatisTest.java
//删除用户
@Testpublic void testDelete(){//获取SqlSession对象SqlSession sqlSession = SqlSessionUtils.getSqlSession();//获取当前mapper接口的代理实现类对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//执行mapper接口的删除方法mapper.deleteUser();//关闭SqlSessionsqlSession.close();
}
控制台打印输出
DEBUG 02-22 11:09:20,078==> Preparing: delete from t_user where id = 3 (BaseJdbcLogger.java:137)
DEBUG 02-22 11:09:20,095==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-22 11:09:20,101<== Updates: 1 (BaseJdbcLogger.java:137)
数据表中可以看到id为3的用户删除了
2.13、测试查询用户
UserMapper接口
package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** @Date: 2023/02/20* @Author: fan* @Description:*/
public interface UserMapper {/*** 根据id查询用户信息* @return*/User getUserById();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!-- User getUserById() --><!--resultType: 设置结果类型,即查询的数据要转换的java类型resultMap: 自定义映射,处理多对一或一对多的映射关系--><select id="getUserById" resultType="com.fan.mybatis.pojo.User">select * from t_user where id = 1</select>
</mapper>
MyBatisTest.java
//根据id查询用户@Testpublic void testGetUserById(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.getUserById();System.out.println(user);}
控制台打印输出:
DEBUG 02-22 12:25:03,700==> Preparing: select * from t_user where id = 1 (BaseJdbcLogger.java:137)
DEBUG 02-22 12:25:03,715==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-22 12:25:03,728<== Total: 1 (BaseJdbcLogger.java:137)
User{id=1, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘123456@qq.com’}
2.14、测试查询所有的用户
UserMapper接口
package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;import java.util.List;/*** @Date: 2023/02/20* @Author: fan* @Description:*/
public interface UserMapper {/*** 查询所有的用户信息* @return*/List<User> getAllUser();
}
UserMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><!-- List<User> getAllUser() --><select id="getAllUser" resultType="com.fan.mybatis.pojo.User">select * from t_user</select>
</mapper>
Junit测试查询所有的用户
MyBatisTest.java
@Testpublic void testGetAllUser(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> list = mapper.getAllUser();//循环输出list集合中的数据list.forEach(System.out::println);}
控制台打印输出:
DEBUG 02-22 12:39:06,403==> Preparing: select * from t_user (BaseJdbcLogger.java:137)
DEBUG 02-22 12:39:06,420==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-22 12:39:06,436<== Total: 3 (BaseJdbcLogger.java:137)
User{id=1, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘123456@qq.com’}
User{id=2, username=‘root’, password=‘123’, age=23, gender=‘男’, email=‘123456@qq.com’}
User{id=4, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘123456@qq.com’}
相关文章:

MyBatis学习笔记(二) —— 搭建MyBatis项目
2、搭建MyBatis 2.1、开发环境 IDE:idea 2019.2 构建工具:maven 3.5.4 MySQL版本:MySQL 8 MyBatis版本:MyBatis 3.5.7 MySQL不同版本的注意事项 1、驱动类 driver-class-name MySQL 5版本使用jdbc5驱动,驱动类使用…...

linux服务器上Docker中安装jenkins
前言 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 本文主要提供通过docker安装jenkins镜像,并配置nginx反向代理页面配置和使用。通过jenkins完成项目的自动部署。 我在安装之前…...

自考都有哪些科目?怎么搭配报考?
第一次自考科目搭配 先报理论课,熟悉学习和考试套路 参考搭配模式: 一、全报考公共课 公共课难度较低,通过率高,复习起来比较轻松。对于不确定考什么专业,后期想换专业的同学,考过公共课,…...

HIVE --- 高级查询
目录 CTE和嵌套查询 嵌套查询 关联查询(join) MapJoin MapJoin操作在Map端完成 开启MapJoin操作 MAPJOIN不支持的操作 union 数据交换(import/export) 数据排序 order by sort by distribute by cluster by CTE和嵌…...

【手撕源码】vue2.x双向数据绑定原理
🐱 个人主页:不叫猫先生 🙋♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门…...

Allegro如何显示层叠Options和Find操作界面
Allegro如何显示层叠Options和Find操作界面 Allegro常规有三大操作界面,层叠,Options和Find,如下图 软件第一次启动的时候,三大界面是关闭的,下面介绍如何把它们打开,具体操作步骤如下 点击菜单上的View点击Windows...

【数据结构】双向链表
目录 数据结构之双向链表:: List.h List.c 1.创建返回链表的头结点 2.双向链表初始化 3.双向链表打印 4.双向链表销毁 5.双向链表尾插 6.双向链表尾删 7.双向链表头插 8.双向链表头删 9.双向链表查找 10.双向链表在pos前插入 11.双向链表删除pos位置 12…...

Editor工具开发基础三:自定义组件菜单拓展 CustomEditor
一.创建脚本路径 创建脚本路径不再限制 一般写在自定义组件类的下边二.特性CustomEditor 定义主设计图面由自定义代码实现数组的编辑器。两个构造函数1.public CustomEditor(Type inspectedType);2.public CustomEditor(Type inspectedType, bool editorForChildClasses);参数意…...

拒绝摆烂!神仙网站Python自学,一路从入门闯到最后,边学边玩
前言给大家推荐3个边玩边学python的网站在刚接触编程,培养对其持续的兴趣是最最重要的事情辣!!!因为前期需要大量的基础代码知识积累,这个过程对于不少人来说还是挺枯燥的,很有可能学到一半就放弃了&#x…...

Linux基础命令-locate快速查找文件
文章目录 locate 命令介绍 语法格式 基本参数 参考实例 1)查找1.txt相关的文件 2)查找包含pass和txt都有的文件 3)只匹配文件名,有路径的情况下不进行匹配 4)匹配不区分大小写的文件 5&#…...

揭穿数据分析的六大谎言
目前许多企业在决策时仍沿用以往的个人经验,没有用数据说话,这在实际决策运行时会出现很多问题。在数据分析行业发展成熟的国家,90%的市场决策和经营决策都是通过数据分析研究确定的。用数据说话,重视定量分析,也逐渐成…...

LinkSLA智能运维技术派-Redis的监控
Redis是一个开源,内存存储的数据服务器,可用作数据库、高速缓存和消息队列代理等场景。 首先我们对内存进行监控,主要指标如下: - used_memory:使用内存 - used_memory_rss:从操作系统分配的内存 - mem_fragmentation_ratio:内…...

Hugging face 模型微调学习:T5-base的微调
最近想做一点文本生成的小实验,无意发现了NLPer应该了解到了一个网站:Hugging face。 Hugging face 在 github上开源了一个Transformers库,允许用户上传和下载的预训练的模型,并进行原有模型的基础上进行微调。如此,使…...

JavaScript 测试 Prototype
文章目录JavaScript 测试 Prototype引用 PrototypePrototype 描述测试 PrototypeJavaScript 测试 Prototype 测试 JavaScript 框架库 - Prototype 引用 Prototype 如需测试 JavaScript 库,您需要在网页中引用它。 为了引用某个库,请使用 <!DOCTYP…...

pnpm / yarn / npm管理依赖包
pnpm pnpm官网:https://pnpm.io/zh/ pnpm安装方式有很多,详见官网。 用最简单的npm来安装pnpm:npm install -g pnpm pnpm安装依赖包 pnpm install # 安装所有项目中的依赖包 pnpm install vue # 安装依赖到dependencies pnpm in…...

注意力机制详解系列(一):注意力机制概述
👨💻作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 🎉专栏推荐: 目前在写CV方向专栏,更新不限于目标检测、…...

搜索引擎 Elasticsearch 的三大坑
搜索引擎的坑 ES 搜索引擎系列文章汇总: 一、别只会搜日志了,求你懂点原理吧 二、ES 终于可以搜到”悟空哥“了! 三、1W字|40 图|硬核 ES 实战 本文主要内容如下: 搜索引擎现在是用得越来越多了&#…...

运营级手机直播平台源码 短视频直播带货APP源码
短视频直播带货APP源码 全开源原生直播APP源码 前端:原生APP 安卓端:Java 苹果端:OC 后台:PHP 数据库:Mysql 技术框架:Thinkphp5.1 系统特色功能包括:礼物系统;提现方式&#…...

http/HTTPS相关的一些知识
2、http和https HTTP,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。HTTP 是应用层协议,它以 TCP(传输层)作为底层协议,默认端口为 80。 http的通信过程:服务器在80端口等待客户的请…...

MySQL高可用 集群(MHA)
1. MHA集群概述 集群的定义:多台服务器一起提供相同的服务,如(web集群)等。常见集群的分类: LB(负载均衡集群):服务器共同平均分摊处理客户端的多次连接请求。 HA(高可用…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...