AI摘要 本文介绍了在MySQL 5.7中实现父子查询的方法。首先创建了`goods_metas`数据表，包含`id`、`name`、`type`和`parent`等字段以存储层级关系。接着，提供了一个SQL查询语句，该语句利用`FIND_IN_SET`函数和用户自定义变量，能够根据指定的父ID高效地查询出其所有子节点（即所有后代，不包含父节点自身）。文章还展示了查询结果示例。 此内容根据文章生成，仅用于文章内容的解释与总结 mysql5.7 sql语句实现父子查询1.数据表创建SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `goods_metas`; CREATE TABLE `goods_metas` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名', `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', `count` int(11) NULL DEFAULT 0 COMMENT '统计', `parent` int(11) NULL DEFAULT 0 COMMENT '父编号（只有class需要）', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `name`(`name`, `type`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; INSERT INTO `goods_metas` VALUES (1, '美甲', 'class', 0, 0); INSERT INTO `goods_metas` VALUES (2, '长甲', 'class', 0, 1); INSERT INTO `goods_metas` VALUES (3, '短甲', 'class', 0, 1); INSERT INTO `goods_metas` VALUES (4, '可爱', 'tag', 0, 0); INSERT INTO `goods_metas` VALUES (5, '简约', 'tag', 0, 0); INSERT INTO `goods_metas` VALUES (6, '测试', 'class', 0, 2); SET FOREIGN_KEY_CHECKS = 1;2.根据父id查所有子节点将{id}修改为查询的父id不包含父节点自身select * from goods_metas where id in (SELECT id FROM (SELECT * FROM goods_metas where type="class") goods_metas, (SELECT @pid := '{id}') pd WHERE FIND_IN_SET(parent, @pid) > 0 AND @pid := concat(@pid, ',', id));id=0查询结果+----+----------+-------+-------+--------+ | id | name | type | count | parent | +----+----------+-------+-------+--------+ | 2 | 长甲 | class | 0 | 1 | | 3 | 短甲 | class | 0 | 1 | | 6 | 测试 | class | 0 | 2 | +----+----------+-------+-------+--------+
Java MyBatis实体类属性名与数据库字段表名称不一致解决办法
AI摘要 MyBatis解决实体类属性名与数据库字段名不一致问题有两种方法。一是查询时使用别名，如`select 数据库字段 as 实体属性`，可结合SQL片段复用。二是使用`resultMap`进行映射，通过``将数据库字段映射到实体类属性。`resultMap`是更灵活且推荐的方式，尤其适用于复杂映射场景。 此内容根据文章生成，仅用于文章内容的解释与总结 MyBatis实体类属性名与数据库字段表名称不一致解决办法1. 查询字段时使用别名对不一样的列名起别名，让别名和实体类的属性名一样 select 数据库表字段名 as 实体类属性名 from user; 但是每次查询都需要重新定义一次别名使用sql片段的方式解决 数据库表字段名 as 实体类属性名 select <include refid="dataName" /> from user; 但是此方法缺点不灵活2.使用resultMap映射别名 select * from user; id作为主键映射，result作为一般字段映射
AI摘要 MyBatis代理开发通过定义Mapper接口和SQL映射文件实现。首先，创建与SQL映射文件同名的Mapper接口，并置于同一目录。将SQL映射文件的namespace设为Mapper接口的全限定名。在Mapper接口中定义与SQL语句id对应的方法，保持参数和返回值类型一致。配置mybatis-config.xml加载Mapper。最后，通过SqlSession的getMapper方法获取Mapper接口的代理对象，调用其方法执行SQL。也可使用包扫描简化Mapper加载。 此内容根据文章生成，仅用于文章内容的解释与总结 MyBatis代理开发0. 环境准备User.javapackage org.example; public class User { private Integer id; private String username; private String password; 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 String getAll(){ return "id=" + id + " username=" + username + " password=" + password; } } 1. 定义与SQL映射文件同名的Mapper接口，并且将Mapper接口和SQL映射文件放置在同一目录下创建UserMapper.java空接口创建UserMapper.xml文件(IDEA中resources创建目录使用/代替.)2. 设置SQL映射文件的namespace属性为Mapper接口全限定名UserMapper.xml<?xml version="1.0" encoding="UTF-8" ?> select * from user; 3. 在Mapper接口中定义方法，方法名就是SQL映射文件中sql语句的id，并保持参数类型和返回值类型一致UserMapper.javapackage org.example.mapper; import org.example.User; import java.util.List; public interface UserMapper { List<User> selectAll(); }mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?> <transactionManager type="JDBC"/> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/java?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"/> <property name="username" value="root"/> <property name="password" value="root"/> 4.编码：通过 SqlSession的 getMapper方法获取 Mapper接口的代理对象调用对应方法完成sql的执行主函数调用 public static void main(String[] args) throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取UserMapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.selectAll(); System.out.println(users.get(0).getAll()); sqlSession.close(); }执行结果id=1 username=admin password=1ed1252369b609c48a93ea80b57f52ed细节：如果Mapper接口名称和SQL映射文件名称相同，并在同一目录下，则可以使用包扫描的方式简化SQL映射文件的加载mybatis-config.xml <package name="org.example.mapper"/>
AI摘要 本文介绍了Java MyBatis快速入门流程：包括数据库准备、Maven依赖配置、编写MyBatis核心及映射配置文件、创建实体类，并最终通过SqlSession实现数据库查询操作。 此内容根据文章生成，仅用于文章内容的解释与总结 MyBatis 快速入门1.数据库准备1.1 数据库信息地址端口用户名密码localhost3306rootroot1.2 创建java数据库create database java;1.3 创建user数据表并且添加数据SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', `password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `user_username_unique`(`username`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, 'admin', '1ed1252369b609c48a93ea80b57f52ed'); SET FOREIGN_KEY_CHECKS = 1; 2.Java Maven项目2.1 配置pom.xml org.mybatis mybatis 3.5.6 mysql mysql-connector-java 8.0.28 junit junit 4.13.2 test org.slf4j slf4j-api 1.7.20 ch.qos.logback logback-classic 1.2.9 ch.qos.logback logback-core 1.2.9 2.2 在resources添加logback.xml文件（日志：可选）<?xml version="1.0" encoding="UTF-8"?> <property name="LOG_HOME" value="${catalina.base}/logs/" /> <property name="appName" value="u-plan"/> UTF-8 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 ${LOG_HOME}/${appName}.log ${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log 30 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 512MB </timeBasedFileNamingAndTriggeringPolicy> %d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [%logger{50} : %line ] - %msg%n <!-- logger主要用于存放日志对象，也可以定义日志类型、级别 name：表示匹配的logger类型前缀，也就是包的前半部分 level：要记录的日志级别，包括 TRACE < DEBUG < INFO < WARN < ERROR additivity：作用在于children-logger是否使用 rootLogger配置的appender进行输出，false：表示只用当前logger的appender-ref，true：表示当前logger的appender-ref和rootLogger的appender-ref都有效 --> <appender-ref ref="appLogAppender" /> <appender-ref ref="stdout" /> <appender-ref ref="appLogAppender" /> 2.3 在resources下创建mybatis-config.xml文件<?xml version="1.0" encoding="UTF-8" ?> <transactionManager type="JDBC"/> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/java?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"/> <property name="username" value="root"/> <property name="password" value="root"/> 2.4 创建数据表User实体类package org.example; public class User { private Integer id; private String username; private String password; 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 String getAll(){ return "id=" + id + " username=" + username + " password=" + password; } }2.5在resources下创建MyBatis的Sql映射文件UserMapper.xml<?xml version="1.0" encoding="UTF-8" ?> select * from user; 3. 运行效果主函数执行public class Main { public static void main(String[] args) throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> objects = sqlSession.selectList("user.selectAll"); System.out.println(objects.get(0).getAll()); } }执行结果id=1 username=admin password=1ed1252369b609c48a93ea80b57f52ed
PHP pdo连接mysql数据库查询中文字符为？记录解决
AI摘要 PHP使用PDO连接MySQL时，若查询结果出现中文乱码（显示为“？”），可通过在PDO连接参数中添加`PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"`来解决，确保数据库连接初始化时正确设置字符编码。 此内容根据文章生成，仅用于文章内容的解释与总结 PHP pdo连接mysql数据库查询中文字符为？记录解决php中，使用pdo连接mysql数据库，查询语句输出结果，中文字符为？解决方法在新建pdo连接中，数组加入对应参数PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"例如：new \PDO("$this->dbms:host=$this->host;dbname=$this->dbName", $this->user, $this->pass,[\PDO::ATTR_PERSISTENT => true,\PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"]);
AI摘要 本文介绍了网络安全靶场sqli-labs的搭建方法。由于PHP版本兼容性要求，需使用PHP 7以下版本。搭建步骤包括：下载源码并上传至服务器、配置网站根目录，以及修改`db-creds.inc`文件中的数据库连接信息。最后，通过访问网站并点击“Setup/reset Database for labs”完成数据库初始化。 此内容根据文章生成，仅用于文章内容的解释与总结 网络安全靶场--sqli-labs搭建安装注：因为mysql函数原因PHP版本必须<71.下载源代码https://github.com/Audi-1/sqli-labs2.新建站点，上传源代码并解压3.修改网站根目录为解压后的文件夹4.修改sql-connections文件夹下的db-creds.inc文件<?php //give your mysql connection username n password $dbuser ='root'; $dbpass ='root'; $dbname ="security"; $host = 'localhost'; $dbname1 = "challenges"; ?>进入网站点击选项安装数据库[Setup/reset Database for labs]
AI摘要 本文介绍了使用Docker Compose部署LAMP环境（CentOS 7、Apache、PHP 7.0、MySQL 5.7）的方法。通过编写Dockerfile构建包含Apache和PHP的自定义镜像，并配合docker-compose.yaml文件编排容器，实现了一键式快速部署与启动LAMP服务。 此内容根据文章生成，仅用于文章内容的解释与总结 docker-compose部署LAMP环境(centos7+httpd+mysql5.7+php7.0)Dockerfilecentos7+httpd(apache)+php7.0FROM centos:centos7.5.1804 MAINTAINER dao #配置yum源 centos源 RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum install -y wget vim net-tools #安装Apache和扩展包 RUN yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql #安装php RUN yum install -y \ https://repo.ius.io/ius-release-el7.rpm \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm --force --nodeps && yum -y install php70w-devel php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-pdo.x86_64 php70w-mysqlnd php70w-fpm php70w-opcache php70w-pecl-redis php70w-pecl-mongodb #编写启动脚本 RUN echo "#!/bin/bash" >> /start.sh && echo "php-fpm -R" >> /start.sh && echo "/usr/sbin/httpd -D FOREGROUND " >> /start.sh && \ chmod 777 /start.sh CMD ["sh", "-c", "source /start.sh"]镜像构建命令docker build -t 镜像名:镜像标签 .docker-compose.yaml文件version: '3.3' services: mariadb: image: mariadb:latest ports: - "3306:3306" restart: always environment: MYSQL_ROOT_PASSWORD: "root" #mysql的root密码 user: root php7.0: build: ./ # 也可以改成 image: 镜像名:镜像标签 user: root restart: always ports: - '80:80' - '443:443' - '9000:9000' - '8888:8888'容器启动命令docker-compose up -d打开服务器ip浏览即可
AI摘要 本文介绍了MySQL 5.7开启远程登录的方法。通过在MySQL中执行授权命令（grant all privileges）并刷新权限，允许指定用户从远程主机访问数据库。最后，通过获取服务器IP地址并使用远程登录命令进行验证，确保配置生效且本地登录正常。 此内容根据文章生成，仅用于文章内容的解释与总结 Mysql5.7开放远程登录1.进入mysql2.执行命令开放远程登录授权远程登录 grant all privileges on 数据库 to '用户'@'主机' identified by '密码'; *.*代表所有数据库 %代表除localhost以外的所有主机 刷新权限 flush privileges;3.查看当前网络ipwindows 命令 ipconfig linux 命令 ip a 其他自行百度我当前ip为：192.168.0.1064.通过当前ip登入mysql验证远程登入命令 mysql -u用户 -p密码 -h主机ip -P端口5.验证本地登录是否正常mysql -u用户 -p密码
AI摘要 本文介绍了MySQL 5.7的基础操作命令，涵盖了连接数据库、修改密码、刷新权限等系统管理操作，以及数据库与数据表的创建、删除、查看和修改等DDL常用指令，为MySQL初学者提供了实用的操作指南。 此内容根据文章生成，仅用于文章内容的解释与总结 mysql5.7基本命令1.数据定义语句(DDL)0.帮助命令多翻帮助多百度mysql --help1.连接mysqlmysql -u用户 -p密码 [-h地址 -P端口]2.修改密码set password for 用户@主机 = password('新密码'); 主机：localhost、%、自定义主机3.刷新权限flush privileges;4.数据库操作查看所有数据库show databases;创建数据库create database 数据库名; 如果不存在才创建 create database if not exists 数据库名;删除数据库drop database 数据库名;选择使用数据库use 数据库名;5.数据表操作查看当前数据库的所有表show tables;创建数据表create table [if not exists] 表名( 字段名 类型 [选项], 字段名 类型 [选项], 字段名 类型 [选项], primary key (字段名) ); if not exists 如果不存在才执行 primary key 设置字段为主键 选项： not null 非空 auto_increment 自增 default 空值时默认内容 comment 注释删除表drop table 表名;查看表定义desc 表名;查看表创建show create table 表名 [\G] \G: 内容结构旋转90度，变成纵向结构修改表名alter table 表名 rename as 新表名增加表字段alter table 表名 add 字段名 字段类型删除表字段alter table 表名 drop 字段名修改表字段alter table 表名 modify 字段名 字段类型修改表字段名alter table 表名 change 字段名 新字段名 字段类型6.退出exit2.数据操纵语句(DML)有时间更新
AI摘要 本文介绍了MySQL中常用的字段属性，包括Unsigned（无符号）、zerofill（零填充）、auto_increment（自增）、null/not null（空/非空）及default（默认值）。同时列举了阿里巴巴规范中每张表必备的五个核心字段，用于记录主键、乐观锁、伪删除及创建与修改时间。 此内容根据文章生成，仅用于文章内容的解释与总结 mysql字段属性1.Unsigned无符号整数声明了Unsigned后不能声明为负数，该列的值不能为负数2.zerofill0填充不足的位数，使用0来填充例：int(3)，值5 -> 0053.auto_increment自增，默认在上一条记录的基础数值上+1通常用来设计唯一的主键，必须是整数类型可以自定义设计主键自增的起始值和步长4.null空，可以为空值如果不填写值，默认为null5.not null非空，不能为空值如果没有设置默认值，插入数据时必须为该字段赋值，否则报错6.default默认，设置默认值如果插入数据时该字段内容为空，则值为默认值阿里巴巴每张表必须的字段，表示一个记录存在的意义字段用途id主键version乐观锁is_delete伪删除gmt_create创建时间gmt_update修改时间