国外做详情页网站深圳网站建设费用大概多少
2026/6/10 13:34:09 网站建设 项目流程
国外做详情页网站,深圳网站建设费用大概多少,泰安刘明是怎么挨办的,湖南环达公路桥梁建设总公司网站1.多表查询多表查询和单表查询类似,只是SQL不同⽽已数据准备#xff1a;对应Model:数据查询SQL:补充实体类:接⼝定义:字段与实体类属性不一致的解决方式#xff1a;当数据库字段名与实体类属性名不匹配时#xff0c;可通过ResultMap#xff08;自定义映射关系#xff09;或…1.多表查询多表查询和单表查询类似,只是SQL不同⽽已数据准备对应Model:数据查询SQL:补充实体类:接⼝定义:字段与实体类属性不一致的解决方式当数据库字段名与实体类属性名不匹配时可通过ResultMap自定义映射关系或 SQL 别名如SELECT user_name AS userName来对齐这一规则同时适用于单表和多表查询。MyBatis 的核心组成MyBatis 处理查询无论单表 / 多表的核心逻辑由三部分构成SQL执行数据查询的语句映射关系关联数据库结果与实体类的规则如字段 - 属性的对应实体类承载查询结果的数据对象。映射关系的作用通过定义映射规则将 SQL 执行后的结果集数据库字段与实体类的属性关联实现数据的自动填充。2.#{}和${}2.1#{}和${}使⽤Integer 类型参数#{} vs ${}1.#{}的执行预编译安全代码执行逻辑MyBatis 将#{id}替换为?占位符生成预编译 SQL参数如id1通过PreparedStatement传入?日志中体现为Parameters: 1(Integer)最终安全执行。2.${}的执行直接拼接无语法错误但有风险代码执行逻辑参数直接拼入 SQL生成即时 SQL因为id是 Integer 类型拼接后 SQL 语法合法能正常执行但存在 SQL 注入风险比如参数传入1 or 11会查询全表。String 类型参数#{} vs ${}差异更明显1.#{}的执行自动加引号安全代码执行逻辑生成预编译 SQL参数如namezhangsan传入时MyBatis 会自动添加单引号最终执行的 SQL 等价于语法合法且安全。2.${}的执行需手动加引号否则报错未加引号的错误情况代码拼接后 SQL数据库会把zhangsan当作字段名而非字符串值导致 “Unknown column zhangsan” 语法错误。手动加引号的正确但仍有风险情况代码补充单引号拼接后 SQL语法合法但仍存在 SQL 注入风险比如参数传入zhangsan or 11会拼接出username zhangsan or 11查询全表。核心总结#{}和${}的本质差异维度#{}${}参数处理方式预编译占位符?自动适配类型加引号字符串直接拼接需手动处理类型如String 加引号安全特性防 SQL 注入易被 SQL 注入语法兼容性自动适配所有参数类型需手动处理类型否则报错推荐场景所有普通参数传递仅动态表名 / 字段名需严格校验参数2.2#{}和${}区别区别就是预编译SQL和即时SQL的区别.1.SQL 执行流程即时 SQL vs 预编译 SQL1.1 即时 SQL对应${}的执行流程当客户端发送 SQL 到服务器需经历 3 个完整步骤语法 / 语义解析校验 SQL 语句是否合法SQL 优化数据库生成最优执行计划执行并返回结果。每次执行都要重复上述流程效率较低。1.2 预编译 SQL对应#{}的执行流程预编译 SQL 会将SQL 结构如select * from userinfo where id?先编译一次编译后的结果会被缓存后续执行时仅需传入参数替换?跳过 “解析、优化” 步骤直接执行效率更高。2.#{}的核心优势 1性能更高实际业务中同一条 SQL仅参数不同会被反复执行比如多次根据不同id查询用户若用${}即时 SQL每次都要重新解析、优化性能损耗大若用#{}预编译 SQL仅首次编译后续复用缓存大幅提升效率。3.#{}的核心优势 2防止 SQL 注入3.1.SQL 注入的定义通过构造恶意参数修改原有 SQL 的逻辑达到非法操作数据库的目的比如越权查询、删除数据。3.2${}引发 SQL 注入的案例以 “根据用户名查询” 为例代码用${}正常参数传入admin拼接后 SQL 为仅查询admin的信息符合预期。恶意参数传入 or 11拼接后 SQL 为11是恒成立的条件最终会查询全表用户信息造成数据泄露。3.3#{}避免 SQL 注入的原理#{}会将参数作为 “值” 传入预编译 SQL 的?占位符即使传入恶意参数如 or 11也会被当作普通字符串值处理最终执行的 SQL 等价于数据库会去查询username等于 or 11的用户实际不存在不会修改 SQL 逻辑从而避免注入。4.SQL 注入的风险场景拓展若用${}处理登录场景的用户名 / 密码代码恶意参数密码传入 or 11拼接后 SQL 为条件恒成立无需正确密码即可登录成功造成账号被盗。核心结论特性#{}${}字符串参数处理自动加单引号无需手动加无自动加引号String 类型需手动加单引号SQL 注入防护注入语句被包裹在单引号中成普通字符串注入语句直接拼接修改 SQL 逻辑典型坑点手动加引号会导致注入内容查不到值忘加引号会报 “未知字段”加了仍有注入风险用#{}啥都不用加MyBatis 帮你搞定类型 引号安全又省心用${}String 类型手动加单引号但仅用于动态表名 / 字段名且必须校验参数避坑#{}别加引号${}非必要不用。补充 2 个易踩坑细节1. 手动给#{}加引号的反例传入zhangsan时#{name}先自动加单引号变成zhangsan再拼接手动引号最终 SQL结果数据库会找username等于zhangsan带双单引号的用户实际不存在返回空。2. 数字类型也可能被注入数字类型用${}仍有注入风险传入恶意参数1 or 11注意实际传参是字符串形式的数字表达式拼接后 SQL结果查询全表数据数字类型也能被注入只是 String 类型注入场景更多。3.#{}和${}在排序场景和Like 查询场景中的适用一、排序场景必须用${}不能用#{}(1)场景需求实现 “按 id 升序 / 降序排序”排序规则asc/desc作为参数传入。(2)#{}的问题代码错误示例执行时#{sort}会将 String 类型的sort参数自动加单引号生成 SQL错误原因SQL 中排序规则asc/desc是关键字不能加单引号因此会报语法错误。(3)${}的正确用法代码正确示例执行时${sort}直接拼接参数生成 SQL注意需对sort参数做白名单校验仅允许asc/desc避免注入风险。二、Like 查询场景用#{}concat()解决安全问题(1)直接用#{}的问题代码错误示例执行时#{key}自动加单引号生成 SQL错误原因单引号嵌套导致语法错误。(2)直接用${}的风险代码有注入风险虽然能生成正确 SQLlike %zhangsan%但${key}会拼接恶意参数如zhangsan or 11 --导致 SQL 注入。(3) 安全解决方案#{}concat()函数利用MySQL 的concat()函数拼接模糊查询的通配符同时保留#{}的安全性代码正确示例执行时#{key}会被替换为?concat()自动拼接通配符生成预编译 SQL既避免了语法错误又防止了 SQL 注入是 Like 查询的推荐写法。三、总结${}的合法使用场景 安全规范适用场景原因安全规范动态排序规则asc/desc排序关键字不能加单引号对参数做白名单校验动态表名 / 字段名表名 / 字段名是 SQL 结构的一部分对参数做白名单校验Like 查询禁止用${}存在注入风险用#{}concat()替代这些场景的核心逻辑是${}仅用于 “SQL 结构的动态部分”如关键字、表名且必须校验参数数据值的传递一律用#{}。MyBatis初阶至此讲解结束一、数据库连接池的核心概念数据库连接池是管理数据库连接的容器其核心逻辑是提前创建一定数量的数据库连接存入 “连接池” 中应用程序需要访问数据库时直接从池里复用已有的连接而非重新创建用完连接后将其归还到池里供其他请求使用。二、有无连接池的对比场景无连接池有连接池连接方式每次请求都新建 / 销毁连接复用池中的已有连接性能新建 / 销毁连接开销大性能低避免重复开销性能高资源消耗频繁创建连接会占用大量系统资源连接数量可控资源消耗更稳定三、连接池的核心优势减少网络 / 系统开销避免了 “频繁创建 / 销毁数据库连接” 的高成本操作资源复用连接可重复使用降低资源浪费提升系统性能连接获取更高效支持更高的并发请求。四、常用数据库连接池及 SpringBoot 中的使用1. 主流连接池C3P0/DBCP早期常用但性能和功能不及现代连接池逐渐被替代HikariSpringBoot 默认连接池日语意为 “光”以极致性能为目标轻量高效Druid阿里巴巴开源功能丰富自带监控、防 SQL 注入等是企业级场景的常用选择。2. SpringBoot 中使用连接池Hikari默认无需额外配置SpringBoot 自动集成启动日志会显示HikariDataSourceDruid切换方式需引入对应依赖根据 SpringBoot 版本选择SpringBoot 3.xSpringBoot 2.x五、MySQL 开发企业规范1. 表名、字段名命名规则规范小写字母 数字单词用下划线分隔禁止大写字母、数字开头、连续下划线。原因MySQL 在 Linux 下区分大小写统一小写可避免环境兼容问题字段修改成本高命名需谨慎。正例aliyun_admin、rdc_config反例AliyunAdmin大写、level__name连续下划线。2. 表必备字段所有表需包含 3 个基础字段id主键类型为bigint unsigned单表时自增步长 1create_time创建时间类型datetimeupdate_time更新时间类型datetime。字段名可根据同义调整如gmt_create替代create_time3. 查询规范禁止用*查询风险增加解析成本、易与 ResultMap 配置不一致、无用字段如text增加网络消耗要求明确指定需要查询的字段。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询