一.讲解MyBatis思路
一个使用JDBC或者JDBCTempalte的例子
一个使用MyBatis的例子(不和spring整合,单独使用MyBatis)
参考: MyBatis学习总结任务: 参考上述例子从0搭建起一个使用MyBatis的例子。注意:不要使用Spring 3. MyBatis基本概念: XML配置文件 SqlSessionFactory 从 SqlSessionFactory 中获取 SqlSession 映射器Mapper 其他:SqlSessionFactoryBuilder 4. Mapper XML 文件 一个简单的例子:见附件"mapper XML.zip" 查询、自动映射: 更新:useGeneratedKeys=”true”,从数据库返回新插入的主键 参数 结果集 cache 5. 动态SQL 6. MyBatis与Spring整合(例子) svn(一个MyBatis教学用案例): svn(一个使用maven、整合Spring与MyBatis的例子): svn(一个整合SpringMVC、MyBatis与EasyUi的例子):
MyBatis工具MyBatis Generator 详解
日志
MyBatis进阶重要参考资料-MyBatis相关工具
二.MyBatis官方文档入门导读
应事先给出一个配置好的mybatis案例,在案例上进行学习实践。 官方文档主要用来查询基本概念,不适合新手从头到尾浏览。
1. 入门
2. XML配置
熟练掌握:typeAliases、映射器(mappers) 简单了解:typeHandlers、对象工厂(objectFactory)
3. Mapper XML映射文件(重点掌握)
3.1 基本概念
SQL 映射文件有很少的几个顶级元素:cache、cache-ref、resultMap、sql、insert、update、delete、select。
resultMap
:描述如何从数据库结果集中来加载对象,即如何将字段名映射到对象属性。
3.2 insert
insert
: 插入。如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上就OK了。例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
则插入后得到的Author对象的id属性为新插入记录所得到的id值。
插入多行,传入一个Authors数组或集合,并返回自动生成的主键:
insert into Author (username, password, email, bio) values
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
对于不支持自动生成类型的数据库或可能不支持自动生成主键 JDBC 驱动来说,MyBatis 有另外一种方法来生成主键。使用insert语句的selectKey 子元素,selectKey例子如下(这里只是一个演示selectKey的例子,MySql数据本身可以支持自动生成主键)
SELECT LAST_INSERT_ID()
insert into college (name)
values (#{name,jdbcType=VARCHAR})
3.3 参数(Parameters):
select id, username, password
from users
where id = #{id}
这个简单的例子中,可以不用设置parameterType 。如果参数是一个对象,例子如下:
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
其中User为参数,id、username、password均为User对象的属性。 参数也可以指定一个特殊的数据类型,如#{property,javaType=int,jdbcType=NUMERIC}
。 保留两位小数的例子:#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}
但一般来说,仅需指定属性名,其他的事情 MyBatis 会自己去推断,最多你需要为可能为空的列名指定 jdbcType,例子如下:
#{middleInitial,jdbcType=VARCHAR}
#{lastName}
默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并安全地设置值(比如?)。这样做更安全,更迅速,通常也是首选做法
3.4 sql
:可被其他语句引用的可重用语句块
例子如下:
${alias}.id,${alias}.username,${alias}.password
这个 SQL 片段可以被包含在其他语句中,例如:
select
,
from some_table t1
cross join some_table t2
3.5 Result Maps
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事情。
select id, username, hashedPassword
from some_table
where id = #{id}
这个例子中id, username, hashedPassword属性映射到User对象的相应属性。如果列名没有精确匹配,你可以在列名上使用 select 字句的别名(一个 基本的 SQL 特性)来匹配标签
select
user_id as "id",
user_name as "userName",
hashed_password as "hashedPassword"
from some_table
where id = #{id}
也可以用resultMap来解决:
select user_id, user_name, hashed_password
from some_table
where id = #{id}
3.6 高级结果映射:
一个复杂查询的例子
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
A.id as author_id,
A.username as author_username,
A.password as author_password,
A.email as author_email,
A.bio as author_bio,
A.favourite_section as author_favourite_section,
P.id as post_id,
P.blog_id as post_blog_id,
P.author_id as post_author_id,
P.created_on as post_created_on,
P.section as post_section,
P.subject as post_subject,
P.draft as draft,
P.body as post_body,
C.id as comment_id,
C.post_id as comment_post_id,
C.name as comment_name,
C.comment as comment_text,
T.id as tag_id,
T.name as tag_name
from Blog B
left outer join Author A on B.author_id = A.id
left outer join Post P on B.id = P.blog_id
left outer join Comment C on P.id = C.post_id
left outer join Post_Tag PT on PT.post_id = P.id
left outer join Tag T on PT.tag_id = T.id
where B.id = #{id}
其对应的resultMap如下:
在这个例子中涉及到的对象由Blog、Author、Post、Comment、Tag。
一个Blog对应一个Author,一个Post集合(一对多)。
Post集合中的每个Post对应一个Author、一个Comment集合、一个Tag集合、一个DraftPost(如果draft列的值为1的时候)。
构造方法 :
对应下面这个对象的构造方法
public class User {
//...
public User(int id, String username) {
//...
}
//...
}
3.7 id & result:
id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是**缓存和嵌入结果映射(也就是联合映射) **。总的来说id就是用于标识对象,以方便缓存,在随后的对象组装、执行查询时,速度更快。
3.8 关联( ,一对一)
关联元素处理“有一个”类型的关系。比如,在我们的示例中,一个博客有一个用户。见下面的使用resultMap映射对象 。
加载关联对象,如上面的查询中,查询一个博客时同时加载与该博客对应的用户对象。可以有两种方式:
嵌套查询:通过执行另外一个SQL映射语句(产生N+1问题)
嵌套结果:使用嵌套结果映射。如上面的复杂SQL语句,一下就把多个表中的所有数据取出。也是我们比较熟悉的一种查询方式。
嵌套查询 的一个例子:
SELECT * FROM BLOG WHERE ID = #{id}
SELECT * FROM AUTHOR WHERE ID = #{id}
既然嵌套查询会带来N+1性能问题,什么时候使用嵌套查询呢?
比如上面的selectBlog返回的Blog对象,包含一个Author对象。有的时候我们只需加载Blog对象,只有在需要的时候再加载Author对象。那么我们可以使用嵌套查询,只有在需要的时候再执行selectAuthor,当然这会执行两条select语句。这就是所谓的MyBatis的延迟加载。
MyBatis 能延迟加载这样的查询就是一个好处,因此你可以分散这些语句同时运行的消耗。然而,如果你加载一个列表,之后迅速迭代来访问嵌套的数据,你会调用所有的延迟加 载,这样的行为可能是很糟糕的。如一个Author有一个Post集合(n个post),如果你使用懒加载,然后在程序中遍历这个Post集合(可能是一个List),那么你还要执行n个selectPost语句。
3.9 延迟加载
例子如下:
1.首先需要在mybatis-config.xml中加入如下配置,才能使延迟加载功能生效
2.相应的mapper文件中加入如下设置:
select * from student where id= #{id}
select * from College where id =#{id}
3.测试代码如下:
@Test
public void test0SelectStudentLazyLoadOneToOne(){
System.out.println("TestCollege.test0SelectStudentLazyLoadOneToOne()");
SqlSession session;
session = sqlSessionFactory.openSession();
int id = 1;
try {
System.out.println("=====测试LazyLoad=====");
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.selectStudentLazyLoad(id);
System.out.println(student.getName());
System.out.println("=====现在才开始加载College=====");
System.out.println(student.getCollege());
} finally {
session.close();
}
}
对Collection的延迟加载也适用。
4.如果全局打开延迟加载,但希望对个别方法进行积极加载,可以设置fetchType为eager:
实验证明: 如果不进行任何设置,那么默认为积极加载。只能通过在 设置设置为全局懒加载,然后对个别方法设置为积极加载,如上例。
3.10 多表联合查询解决N+1性能问题
延迟加载会碰到N+1性能问题。碰到这种问题,我们一般直接使用嵌套结果方式(联合查询),例子如下。
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
A.id as author_id,
A.username as author_username,
A.password as author_password,
A.email as author_email,
A.bio as author_bio
from Blog B left outer join Author A on B.author_id = A.id
where B.id = #{id}
我们看到,只使用了一条select语句。就把两个对象的值一次性填入。 resultMap还支持使用前缀columnPrefix重用映射。具体例子见官网
3.11 集合 :
对应private List posts;
一个集合嵌套查询的例子:
SELECT * FROM BLOG WHERE ID = #{id}
SELECT * FROM POST WHERE BLOG_ID = #{id}
javaType也可不需要,也可简化为:
3.12 集合的嵌套结果(更常用)
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
P.id as post_id,
P.subject as post_subject,
P.body as post_body,
from Blog B
left outer join Post P on B.id = P.blog_id
where B.id = #{id}
3.13 鉴别器
对于某一列的不同值,可能对应不同类型的对象,可以使用
,如下属例子
一个简单的例子
详解见官方文档。
3.14 自动映射
一般情况可以直接列名映射为属性名(忽略大小写),如 ID列(数据库字段)->id属性(对象属性)。 通常数据库列使用大写单词命名,单词间用下划线分隔,如User_Name
;而java属性一般遵循驼峰命名法(userName)。 为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase设置为true。 即在mybatis-config.xml中设置
`
还可以混合使用自动映射和配置映射(id和userName被自动映射,hashed_password 列将根据配置映射):
select
user_id as "id",
user_name as "userName",
hashed_password
from some_table
where id = #{id}
3.15 缓存
使用
开启,默认情况下没有开启。 一个例子
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。
详见官方文档。 具体例子见后面缓存。
4. 动态SQL(重点掌握)
5. Java API(简单了解)
专题1.使用resultMap映射对象(sql语句映射)
如果使用JDBC从数据库获取数据的一般流程:
创建Connection
使用PreparedStatement执行sql语句
使用ResultSet获取数据,并创建model对象,执行对象的setter方法为对象赋值。
关闭ResultSet、PreparedStatement、Connection
其中第2、3步,mybatis可使用配置文件来完成。 假设有如下sql语句:select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id
,相关的model对象如下:
public class Site {
private Integer id;
private String name;
private Double longitude;
private Double latitude;
......
}
public class EquipmentDetail {
private Integer id;
private Site site;//注意这里
private String name;
private String type;
private String version;
private String brand;
private String phonenumber;
.....
}
传统的对象组装流程:
EquipmentDetail equipment = new EquipmentDetail();
Site site = new Site();
//从resultset中取指定列名的数据,执行对应的equipment的setter方法,
//从resultset中取指定列名的数据,执行对应的一堆site的setter方法
equipment.setSite(site);
//组装完毕
上面这个过程完全写好配置文件,让mybatis按照配置文件进行自动组装,而无需自己编写代码。 上面的过程主要包含几个关键信息: 1. 列名及其对应的属性名。 2.主键、外键信息。 对应的mybatis配置文件如下:
select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id
其中resultMap="EquipmentDetailResultMap"
表示当sql语句取到数据后可按照其配置信息来进行对象的组装。 实际上resultMap="EquipmentDetailResultMap"
就是代表对象组装的配置信息。这个配置信息可以在多个地方用到。比如下面这段配置信息也复用到了EquipmentDetailResultMap
select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id and e.id = #{id}
结论: resultMap 用来描述组装数据到对象这样的一个过程,并且可以很方便的进行复用。这使我们无需使用硬编码的方式进行繁琐的组装对象的过程。只需要写好配置文件,mybatis就默默地按照配置文件的指示完成对象的组装。
参考
Mybatis 高级结果映射 ResultMap Association Collection
专题2.动态SQL
动态指定条件子句: 使用
:
select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id
and s.id = #{sid}
and e.name like '%${name}%'
也可以使用
SELECT * FROM BLOG
state = #{state}
AND title like #{title}
AND author_name like #{author.name}
MyBatis还支持: choose, when, otherwise表达式,只选择其中一个 trim, set(更新的时候用) foreach(对集合进行遍历,常用语sql中包含IN)
SELECT *
FROM POST P
WHERE ID in
#{item}
专题3.MyBatis Generator
安装插件:Eclipse Market中安装MyBatis Generator插件
新建配置文件:在项目src目录中选择File-New-Other-MyBatis Generator Configuration File
运行:配置文件建立好后,右键点击该配置文件选择“Generate MyBatis/iBATIS Artifacts”。或者直接点击Run as....
使用MyBatis Generator自动生成相关文件后,还需自行在mybatis-config.xml中添加 。
第2步建立的配置文件内容:
主要说明:
指定连接数据库的jar
targetRuntime="MyBatis3Simple"
不生成Example
数据库连接配置
配置实体类,targetProject填入相对路径
mapper配置文件
mapper java文件,如dao文件
对所有的表都生成相关文件
标识id为主键,且insert时会返回刚插入对象的主键。配置文件详解请见:MyBatis Generator 详解
专题4.MyBatis中的缓存 MyBatis中缓存分为一级缓存和二级缓存:
一级缓存的作用域:session。 只要session不关闭,对相同记录的访问都可从一级缓存中直接取出。如果开两个session,如session1、session2,那么即使session1已经获取到某条记录,session2获取相同记录时仍需访问数据库。 session关闭(close)后,一级缓存中的内容清空。执行CUD(增、改、删)操作时,缓存中的内容也将清空。。
二级缓存的作用域:namespace。 在同一个namespace中开两个session,不同的session取相同记录会从二级缓存中获取。
缓存说明:
映射语句文件中的所有 select 语句将会被缓存。
映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
注意: 最好打开log4j以方便查看是否从缓存中取数据
缓存参考资料: MyBatis学习总结(七)——Mybatis缓存
官网参考资料
参考资料: mybatis官方中文文档MyBatis Generator 详解重要参考资料-MyBatis相关工具 说明: 涉及MyBatis的方方面面,包含几个MyBatis框架的例子外部链接-MyBatis魔法堂:即学即用篇 说明: 前期例子不整合spring的例子,后期例子整合spring。
你可能感兴趣的:(mybatis,数据库,mysql,java,hibernate)
HTML,JavaScript实现时钟
木木与代码(接项目)
html javascript 前端
HTML,JavaScript实现时钟公众号:木木与代码本文作者:@MuMu编写日期:2025年01月13日本文字数:2662个字符关注可了解更多的教程。问题或建议,请公众号留言;/开始/HTML设计界面元素,【00:00:00】格式的时间显示。翻页时钟000000CSS完成页面的布局和美化页面。让页面的元素居中,设置字体和背景颜色。:root{--primary-color:#24222d;}*
【2025年春季】全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!
白帽子凯哥
web安全 学习 安全 CTF夺旗赛 网络安全
基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包目录一、CTF简介二、CTF竞赛模式三、CTF各大题型简介四、CTF学习路线4.1、初期1、html+css+js(2-3天)2、apache+php(4-5天)3、mysql(2-3天)4、python(2-3天)5、burpsuite(1-2天)4.2、中期1、SQL注入(7-8天)2、文件上传(7-8天)3、其他漏洞(14-15
用JavaScript写抖音很火的罗盘时钟,附源码
编程界小明哥
canvas javascript javascript精彩实例 罗盘时钟 javascript canvas html5
原生js制作在抖音上很火的罗盘布局时钟代码。带日期、月份、星期、时分秒圆盘时钟。效果图:3个构造函数文本构造函数//文字的构造函数functionText(o){this.x=0,//x坐标this.y=0,//y坐标this.disX=0,//x坐标偏移量this.disY=0,//y坐标偏移量this.text='',//内容this.font=null;//字体this.textAlign=
2025网络安全学习路线 保姆级学习路线 非常详细 推荐学习
白帽黑客-晨哥
学习 web安全 安全 数据库 php
关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线首先咱们聊聊,学习网络安全方向通常会有哪些问题1、打基础时间太长学基础花费很长时间,光语言都有几门,有些人会倒在学习linux系统及命令的路上,更多的人会倒在学习语言上;2、知识点掌握程度不清楚对于网络安全基础内容,很多人不清楚需要学到什么程度,囫囵吞枣,导致在基础上花费太多时间;看到很多小伙伴,买了HTML,PHP,数据库,计算机
Java开发者必备:深入理解元素与对象比较的底层原理
顾漂亮
Java数据结构 java 算法 开发语言 数据结构
Java开发者必备:深入理解元素与对象比较的底层原理个人主页:顾漂亮文章专栏:Java数据结构1.元素的比较Java中,基本类型的对象可以直接比较大小基本类型有:四类八种四类:整型、浮点型、字符型、布尔型八种:数据类型关键字内存占用范围字节型byte1字节-128~127(-2^7~2^7-1)短整型short2字节-32768~32767(-2^15~2^15-1)整形int4字节-2^31~2
2025年全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!
白帽安全-黑客4148
安全 web安全 网络 网络安全 CTF
目录一、CTF简介二、CTF竞赛模式三、CTF各大题型简介四、CTF学习路线4.1、初期1、html+css+js(2-3天)2、apache+php(4-5天)3、mysql(2-3天)4、python(2-3天)5、burpsuite(1-2天)4.2、中期1、SQL注入(7-8天)2、文件上传(7-8天)3、其他漏洞(14-15天)4.3、后期五、CTF学习资源5.1、CTF赛题复现平台5.
力扣131题:分割回文串的 Java 实现
杰哥的编程世界
java算法 leetcode java 算法
引言力扣(LeetCode)是一个在线编程平台,提供了大量的编程题目供开发者练习。第131题“分割回文串”是一个有趣的字符串处理问题,要求将一个字符串分割成尽可能多的回文子串。本文将介绍如何使用Java解决这个问题。题目描述给定一个字符串s,请将s分割成尽可能多的回文子串。返回它所有可能的分割数量。示例:输入:"abc"输出:4解释:可以分割成"a","b","c"或"ab","c"或"a","b
[附源码]JAVA+ssm计算机毕业设计大学生体测数据管理系统(程序+Lw)
战少程序源码
java 课程设计 mybatis
项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM+mybatis+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.ID
Vue.js 与 Ajax(Axios)的深入探索
wjs2024
开发语言
Vue.js与Ajax(Axios)的深入探索引言在当前的前端开发领域,Vue.js已经成为了最受欢迎的JavaScript框架之一。它以其简洁的语法、高效的性能和强大的生态系统获得了广泛的应用。而在与后端服务交互时,Ajax技术是不可或缺的。本文将深入探讨Vue.js与Ajax(Axios)的结合,帮助读者更好地理解这两种技术的协同工作。Vue.js简介Vue.js是一个渐进式JavaScrip
史上最详细JavaScript数组去重方法(14种)
Elena_Lucky_baby
javascript 前端 开发语言
1.利用Set()+Array.from()将数组的每一个元素依次与其他元素做比较,发现重复元素,删除Set对象:是值的集合,你可以按照插入的顺序迭代它的元素。Set中的元素只会出现一次,即Set中的元素是唯一的。Array.from()方法:对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。constarr=[1,2,2,'abc','abc',true,true,false,false
console的使用记录
沐千熏
VUE uni-app javascript 开发语言 ecmascript
console.log();打印调试console.dir();打印对象。javaScript对象属性列表,并以交互的形式展现。输出结果呈现为分层列表。包含展开/折叠的三角图标,可用于查看子对象的内容。console.table();打印数组。console.time();计时操作。functionlogTime(n){console.time("time");//模拟耗时for(leti=0;i
linux安装mysql、可选择版本(yum,deb,二进制)、可选择自定义端口以及配置
wsswm
mysql linux mysql
说明软件仓库:yum(centos,redhat,fedora和Oraclelinux系统)apt(debian和ubuntu系统)deb(debian和ubuntu系统)安装过程中可能需要计算机安装某种扩展,按照提示安装即可。一、二进制方式安装mysql二进制方式安装适合一个系统安装多个mysql服务,一个mysql服务使用不同的端口即可。前提是该端口号不能被其他程序占有。在linux系统中注意
centos 7 mysql 5.6安装_liunx 下 或centos7 下安装 MySQL-5.6
灰先森
centos 7 mysql 5.6安装
安装方式有两种第一种使用yum安装,第二种编译安装第一种使用yum安装========================================================================================>1.新开的服务器,需要检测系统是否自带安装mysql#yumlistinstalled|grepmysql2.如果发现有系统自带mysql,则先删除#y
node.js常用指令
xxq121389527
node.js
安装Node.js:你可以从Node.js官网(https://nodejs.org/)下载并安装适合你操作系统的Node.js版本。查看Node.js版本:在命令行中输入node-v,将显示你当前安装的Node.js版本。运行JavaScript文件:假设你有一个名为app.js的JavaScript文件,你可以在命令行中使用nodeapp.js来运行它。全局安装npm包:npm(NodePac
MySQL索引、视图与范式:高效数据库设计与优化秘籍
rain雨雨编程
Java编程 数据库 mysql 索引 视图 范式
♂️个人主页:@rain雨雨编程微信公众号:rain雨雨编程✍作者简介:持续分享机器学习,爬虫,数据分析希望大家多多支持,我们一起进步!如果文章对你有帮助的话,欢迎评论点赞收藏加关注+目录mysqlday04课堂笔记1、索引(index)1.1、什么是索引?1.2、索引的实现原理?1.3、添加索引的注意事项1.4、索引怎么创建?删除?语法是什么?1.5、如何查看某select中是否使用了索引1.
Java计算机毕业设计大学生体测数据管理系统源码+系统+数据库+lw文档
冰冰网络
java 开发语言 html
Java计算机毕业设计大学生体测数据管理系统源码+系统+数据库+lw文档Java计算机毕业设计大学生体测数据管理系统源码+系统+数据库+lw文档本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址:https
LINUX 安装mysql5.6.50 RPM
a21768541
数据库 mysql
今天要做一个MySql数据库的主从备份,由于现有的数据库,是使用宝塔安装的5.6.50版本,因此需要在新购买的服务器上安装MySql5.6.50版本,记录一下安装过程的碰见的各种问题1.下载安装包抖店云上的系统是CentOS7.964位,因此下载Redhat7系统下面的安装包下载地址:https://downloads.mysql.com/archives/community/只需要下载这两个安装
Java值传递,会影响原值的原因
浪九天
Java java 开发语言
基本数据类型对于基本数据类型(如int、double、boolean等),值传递不会影响原值。因为传递的是变量值的副本,方法内对副本的修改不会反映到原始变量上。publicclassPrimitivePassingExample{publicstaticvoidmain(String[]args){intnum=10;System.out.println("Beforemethodcall:"+n
Java实现的登录功能(三层架构,验证,拦截)
浪九天
Java jsp servlet
Java实现的登录功能(三层架构,验证,拦截)1、pojo:实体类packagecom.pojo;publicclassUser{privateintid;privateStringname;privateStringpassword;publicUser(){}publicUser(Stringname,Stringpassword){this.name=name;this.password=p
MD5解密为什么不能成功(解密算法)
浪九天
算法 Java java 算法
MD5解密为什么不能成功(解密算法)首先MD5的密文数量36的32次方;不加盐,不迭代,A-Z,a-z,0-9,8-16位密码,计算量:62的8次方至62的16次方工具类暴力算法结合数据库实现补充说明(原因)生成密文的工具类packagecom.decrypt;importorg.apache.shiro.crypto.hash.SimpleHash;publicclassDecyrpt{priv
Java在长字符串中查找短字符串的多种方法
浪九天
Java java 字符串 算法
Java在长字符串中查找短字符串的多种方法方案一:补充:在输入短字符串时,如果有空格,可以在比较前用trim()方法截取前后空白/*该方法只适用于有特殊分割符号的字符串*/System.out.println("请输入字符串:");Scannerstr1=newScanner(System.in);Strings=str1.nextLine();System.out.println("请输入第二个
CentOS7.9 + MySQL5.6.50二进制安装心得
张沛洁
数据库 mysql
一、下载MySQLwget:http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz二、解压压缩包tar-zxvfmysql-5.6.50-linux-glibc2.12-x86_64.tar.gz三、移动安装包mvmysql-5.6.50-linux-glibc2.12-x86_64/us
【2025年】全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!
网安詹姆斯
web安全 CTF 网络安全大赛 python linux
【2025年】全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包目录一、CTF简介二、CTF竞赛模式三、CTF各大题型简介四、CTF学习路线4.1、初期1、html+css+js(2-3天)2、apache+php(4-5天)3、mysql(2-3天)4、python(2-3天)5、burpsuite(1-2天)4.2、中期1、S
【2025年】全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!
白帽黑客鹏哥
web安全 CTF 网络安全大赛 python linux
目录一、CTF简介二、CTF竞赛模式三、CTF各大题型简介四、CTF学习路线4.1、初期1、html+css+js(2-3天)2、apache+php(4-5天)3、mysql(2-3天)4、python(2-3天)5、burpsuite(1-2天)4.2、中期1、SQL注入(7-8天)2、文件上传(7-8天)3、其他漏洞(14-15天)4.3、后期五、CTF学习资源5.1、CTF赛题复现平台5.
同城服务家政服务家政派单系统源码微信小程序+微信公众号+APP+H5
源码库saaskw
博纳miui52086 微信小程序 小程序 微信公众平台
JAVA同城服务家政服务家政派单系统源码:打造全方位家政服务生态在当今快节奏的社会中,家政服务已成为城市居民生活中不可或缺的一部分。为了满足广大用户对家政服务的多样化需求,我们精心打造了一款集微信小程序、微信公众号、APP及H5于一体的JAVA同城服务家政派单系统。该系统不仅功能全面,而且框架结构清晰,实用性强,便捷性高,市场前景广阔,引领着家政服务行业的新趋势。功能全面,满足多样化需求用户端功能
JAVA无人共享24小时自助洗车扫码洗车系统源码支持小程序
源码库saaskw
博纳miui52086 微信小程序 小程序 微信公众平台
JAVA无人共享24小时自助洗车扫码洗车系统源码支持小程序在当今快节奏的生活中,自助洗车服务以其高效、便捷的特点逐渐受到广大车主的青睐。为满足这一市场需求,我们精心打造了一款JAVA无人共享24小时自助洗车扫码洗车系统,其源码全面支持小程序接入,不仅极大地提升了用户体验,还为创业者提供了强大的技术支持和商业机遇。功能介绍该系统集成了多项实用功能,旨在为用户提供一站式、智能化的洗车体验。精准定位功能
Java-final关键字详解
听忆.
java jvm 算法
Java-final关键字详解一、引言二、什么是final关键字?三、final变量final局部变量final实例变量final静态变量四、final方法五、final类六、final关键字的实际应用1.定义常量2.防止方法被重写3.创建不可变类4.优化性能七、final的一些常见误区1.final变量不能在构造方法中赋值2.final类中的所有方法都是final的3.final变量的引用不能改
SpringBoot(四十二)SpringBoot集成classfinal加密Jar包
camellias_
spring boot jar 后端
上文中,我们使用jasypt对项目中application.yml配置文件进行了加密。很多时候我们在将项目打成jar包之后,也是不希望被反编译的,毕竟是我们自己辛苦写的代码。那怎么办呢?有现成的轮子供我们使用:classfinal官网:ClassFinal:Java字节码加密工具这是一个开源项目,是的,这是一个开源项目,所以呢,classfinal混淆代码也不是一定不会被反编译的,这里要注意。Cl
Spring Boot与MyBatis
m0_74823658
面试 学习路线 阿里巴巴 spring boot mybatis 后端
SpringBoot与MyBatis的配置一、简介SpringBoot是一个用于创建独立的、基于Spring的生产级应用程序的框架,它简化了Spring应用的初始搭建以及开发过程。MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。将SpringBoot和MyBatis结合使用,可以高效地开发数据驱动的应用程序。二、环境准备(一)创建SpringBoot项目可以使用Sp
理解javascript中的回调函数(callback)【转】
大麦麦子
# javascript callback
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String、Array、Number、Object类的对象一样用于内置对象的管理。因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值”。因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟
二分查找排序算法
周凡杨
java 二分查找 排序 算法 折半
一:概念 二分查找又称
折半查找(
折半搜索/
二分搜索),优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而 查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表 分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步
java中的BigDecimal
bijian1013
java BigDecimal
在项目开发过程中出现精度丢失问题,查资料用BigDecimal解决,并发现如下这篇BigDecimal的解决问题的思路和方法很值得学习,特转载。
原文地址:http://blog.csdn.net/ugg/article/de
Shell echo命令详解
daizj
echo shell
Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
echo string
您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串:
echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo Itis a test 2.显示转义
Oracle DBA 简单操作
周凡杨
oracle dba sql
--执行次数多的SQL
select sql_text,executions from (
select sql_text,executions from v$sqlarea order by executions desc
) where rownum<81;
&nb
画图重绘
朱辉辉33
游戏
我第一次接触重绘是编写五子棋小游戏的时候,因为游戏里的棋盘是用线绘制的,而这些东西并不在系统自带的重绘里,所以在移动窗体时,棋盘并不会重绘出来。所以我们要重写系统的重绘方法。
在重写系统重绘方法时,我们要注意一定要调用父类的重绘方法,即加上super.paint(g),因为如果不调用父类的重绘方式,重写后会把父类的重绘覆盖掉,而父类的重绘方法是绘制画布,这样就导致我们
线程之初体验
西蜀石兰
线程
一直觉得多线程是学Java的一个分水岭,懂多线程才算入门。
之前看《编程思想》的多线程章节,看的云里雾里,知道线程类有哪几个方法,却依旧不知道线程到底是什么?书上都写线程是进程的模块,共享线程的资源,可是这跟多线程编程有毛线的关系,呜呜。。。
线程其实也是用户自定义的任务,不要过多的强调线程的属性,而忽略了线程最基本的属性。
你可以在线程类的run()方法中定义自己的任务,就跟正常的Ja
linux集群互相免登陆配置
林鹤霄
linux
配置ssh免登陆
1、生成秘钥和公钥 ssh-keygen -t rsa
2、提示让你输入,什么都不输,三次回车之后会在~下面的.ssh文件夹中多出两个文件id_rsa 和 id_rsa.pub
其中id_rsa为秘钥,id_rsa.pub为公钥,使用公钥加密的数据只有私钥才能对这些数据解密 c
mysql : Lock wait timeout exceeded; try restarting transaction
aigo
mysql
原文:http://www.cnblogs.com/freeliver54/archive/2010/09/30/1839042.html
原因是你使用的InnoDB 表类型的时候,
默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
因为有的锁等待超过了这个时间,所以抱错.
你可以把这个时间加长,或者优化存储
Socket编程 基本的聊天实现。
alleni123
socket
public class Server
{
//用来存储所有连接上来的客户
private List<ServerThread> clients;
public static void main(String[] args)
{
Server s = new Server();
s.startServer(9988);
}
publi
多线程监听器事件模式(一个简单的例子)
百合不是茶
线程 监听模式
多线程的事件监听器模式
监听器时间模式经常与多线程使用,在多线程中如何知道我的线程正在执行那什么内容,可以通过时间监听器模式得到
创建多线程的事件监听器模式 思路:
1, 创建线程并启动,在创建线程的位置设置一个标记
2,创建队
spring InitializingBean接口
bijian1013
java spring
spring的事务的TransactionTemplate,其源码如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{
...
}
TransactionTemplate继承了DefaultT
Oracle中询表的权限被授予给了哪些用户
bijian1013
oracle 数据库 权限
Oracle查询表将权限赋给了哪些用户的SQL,以备查用。
select t.table_name as "表名",
t.grantee as "被授权的属组",
t.owner as "对象所在的属组"
【Struts2五】Struts2 参数传值
bit1129
struts2
Struts2中参数传值的3种情况
1.请求参数绑定到Action的实例字段上
2.Action将值传递到转发的视图上
3.Action将值传递到重定向的视图上
一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上
Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言
【Kafka十四】关于auto.offset.reset[Q/A]
bit1129
kafka
I got serveral questions about auto.offset.reset. This configuration parameter governs how consumer read the message from Kafka when there is no initial offset in ZooKeeper or
nginx gzip压缩配置
ronin47
nginx gzip 压缩范例
nginx gzip压缩配置 更多
0
nginx
gzip
配置
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢?
gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用
java-13.输入一个单向链表,输出该链表中倒数第 k 个节点
bylijinnan
java
two cursors.
Make the first cursor go K steps first.
/*
* 第 13 题:题目:输入一个单向链表,输出该链表中倒数第 k 个节点
*/
public void displayKthItemsBackWard(ListNode head,int k){
ListNode p1=head,p2=head;
Spring源码学习-JdbcTemplate queryForObject
bylijinnan
java spring
JdbcTemplate中有两个可能会混淆的queryForObject方法:
1.
Object queryForObject(String sql, Object[] args, Class requiredType)
2.
Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
第1个方法是只查
[冰川时代]在冰川时代,我们需要什么样的技术?
comsci
技术
看美国那边的气候情况....我有个感觉...是不是要进入小冰期了?
那么在小冰期里面...我们的户外活动肯定会出现很多问题...在室内呆着的情况会非常多...怎么在室内呆着而不发闷...怎么用最低的电力保证室内的温度.....这都需要技术手段...
&nb
js 获取浏览器型号
cuityang
js 浏览器
根据浏览器获取iphone和apk的下载地址
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" content="text/html"/>
<meta name=
C# socks5详解 转
dalan_123
socket C#
http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html 这里主要讲的是用.NET实现基于Socket5下面的代理协议进行客户端的通讯,Socket4的实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,
运维 Centos问题汇总
dcj3sjt126com
云主机
一、sh 脚本不执行的原因
sh脚本不执行的原因 只有2个
1.权限不够
2.sh脚本里路径没写完整。
二、解决You have new mail in /var/spool/mail/root
修改/usr/share/logwatch/default.conf/logwatch.conf配置文件
MailTo =
MailFrom
三、查询连接数
Yii防注入攻击笔记
dcj3sjt126com
sql WEB安全 yii
网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查,可以使用正则表达式或者直接输入字符判断,大部分是只允许输入字母和数字的,其它字符度不允许;对于内容复杂表单的内容,应该对html和script的符号进行转义替换:尤其是<,>,',"",&这几个符号 这里有个转义对照表:
http://blog.csdn.net/xinzhu1990/articl
MongoDB简介[一]
eksliang
mongodb MongoDB简介
MongoDB简介
转载请出自出处:http://eksliang.iteye.com/blog/2173288 1.1易于使用
MongoDB是一个面向文档的数据库,而不是关系型数据库。与关系型数据库相比,面向文档的数据库不再有行的概念,取而代之的是更为灵活的“文档”模型。
另外,不
zookeeper windows 入门安装和测试
greemranqq
zookeeper 安装 分布式
一、序言
以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。
栗子1号:
假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视
Spring之使用事务缘由(2-注解实现)
ihuning
spring
Spring事务注解实现
1. 依赖包:
1.1 spring包:
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.
iOS App Launch Option
啸笑天
option
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。
1、若用户直接
jdk与jre的区别(_)
macroli
java jvm jdk
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你
Updates were rejected because the tip of your current branch is behind
qiaolevip
学习永无止境 每天进步一点点 众观千象 git
$ git push joe prod-2295-1
To git@git.dianrong.com:joe.le/dr-frontend.git
! [rejected] prod-2295-1 -> prod-2295-1 (non-fast-forward)
error: failed to push some refs to 'git@git.dianron
[一起学Hive]之十四-Hive的元数据表结构详解
superlxw1234
hive hive元数据结构
关键字:Hive元数据、Hive元数据表结构
之前在 “[一起学Hive]之一–Hive概述,Hive是什么”中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hive首先需要结合元数据,将HQL翻译成MapReduce去执行。
本文介绍一下Hive元数据中重要的一些表结构及用途,以Hive0.13为例。
文章最后面,会以一个示例来全面了解一下,
Spring 3.2.14,4.1.7,4.2.RC2发布
wiselyman
Spring 3
Spring 3.2.14、4.1.7及4.2.RC2于6月30日发布。
其中Spring 3.2.1是一个维护版本(维护周期到2016-12-31截止),后续会继续根据需求和bug发布维护版本。此时,Spring官方强烈建议升级Spring框架至4.1.7 或者将要发布的4.2 。
其中Spring 4.1.7主要包含这些更新内容。