在java中把数据库查询的结果保存到map中:
成都网站设计、网站建设的关注点不是能为您做些什么网站,而是怎么做网站,有没有做好网站,给创新互联公司一个展示的机会来证明自己,这并不会花费您太多时间,或许会给您带来新的灵感和惊喜。面向用户友好,注重用户体验,一切以用户为中心。
实现:获得ResultSet rs 时可以转化为ResultSetMetaData对象。
ResultSetMetaData可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。
举例说明如下:
//获得ResultSetMetaData对象
ResultSetMetaData rsmd=rs.getMetaData();
//获得返回此 ResultSet 对象中的列数
int count = rsmd.getColumnCount();
while(rs.next()){
Map map=new HashMap();
for(int i=1;icount;i++){
//获取指定列的表目录名称
String label=rsmd.getColumnLabel(i);
//以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值
Object object= rs.getObject(i);
//把数据库中的字段名和值对应为一个map对象中的一个键值对
map.put(label.toLowerCase(), object);
}
把每条对象封装成的map对象放进list中
list.add(map);
}
就此就可以把任意resultet通过这个方法生成list对象。
对于mysql5.5.54服务的结构已经失败。
解决方法如下:
1、打开任务栏管理器——服务找到MYSQL,双击它。
2、在弹出的对话框里面有四个选项:常规,登录,恢复,依赖关系。
3、选择登录:下面登录身份里有两个单选项,一个是是本地系统帐户,另一个是此帐户。
4、此时默认的选择是2此帐户,且带有密码。
你需要做的就是选择本地系统帐户,然后单击应用,然后启动服务。
.查看服务中有没有mysql,如果有将该服务停掉。
2.在控制面板中运行添加删除程序,将mysql卸载。
3.卸载后打开注册表(在开始—运行,输入regedit),
查看HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices 下的键值,如果有相关mysql键值(mysql、mysqladmin)则删掉,即可。
4.重启,将mysql的安装残余目录删掉 (查看服务,此时服务中已没有mysql)。
5.重新安装mysql.安装后先不要运行Server Instance Configuration wizard,重启后在开始菜单中运行该向导,即可。
**困难3:**msyql安装到最后一步start service错误
1.到控制面板里面先把mysql删除。
2.到c盘C:Program Files目录下把mysql目录删除。
3.如果在其他盘还有设置目录也要删除.空目录也要删除。
4.到regedit把注册表:
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications/MySQL
有的话,全部删除!(**技巧:**用F3循环查找“mysql”)5.如果任务管理器里有关mysql内容也删除。
5.把防火墙关了。
6.重新装mysql(这里我没有重启计算机)。
重装时候有必要的话,重启计算机,停用IIS,和删除temp里的临时文件。
实在不行的话,配置mysql时候,把mysql服务换个服务名。
以上就是在安装mysql时经常遇到的错误,希望本文对大家的学习有所帮助。
文章来源:
Mysql安装注意事项、安装失败的五个原因分析
错误1:wizard安装最后一页,出现cannot create Windows service for mysql.error:0 错误
解决方法:打开命令行 输入 sc delete mysql 命令即
C:sc delete mysql
[SC] DeleteService SUCCESS
重起电脑,或者卸载后重启再安装,这样就好了。我是卸载后重启的。
卸载重新安装要注意一个问题,在控制面板中卸载后,要去c:Documents and SettingsAll UsersApplication Data目录下把Mysql文件夹删掉。里面可能记载了你卸载的配置信息,下次安装时会有影响。
错误2:在让输入管理员输入密码时除了password和confirm password之外还有一行current password。
这说明你安装之前没有把我第1条中说的目录下把Mysql文件夹删除。不知道是否影响后续使用,可能记得密码的话没关系。另附带一句,管理员密码是自己设的,用户名则为默认root。
安装成功后可测试如下:打开mysql command line client,输入密码,出现
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 3
Server version: 5.1.33-community MySQL Community Server (GPL)
Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
mysql
则安装成功!
错误3:mysql server configuration失败。
在配置向导中查看错误提示有如下语句:
mysql-server-5.5-win32:60 - Adding firewall rule for MySQL55 on port 3306.
mysql-server-5.5-win32:66 - Adding firewall rule failed.
表示防火墙安装失败。
查看安装日志能找到以下语句:
mysql-installer Information: 10 : Attempting to create firewall rule with command: netsh.exe firewall add portopening protocol=TCP port=3306 profile=ALL name=MySQL55 mode=ENABLE scope=ALL
mysql-installer Information: 10 : Unexpected response from netsh: 确定。
mysql-installer Information: 10 : Attempting to create firewall rule with command: netsh.exe advfirewall firewall add rule name=”Port 3306” protocol=TCP localport=3306 dir=in action=allow
mysql-installer Information: 10 : Unexpected response from netsh: 下列命令没有找到: advfirewall firewall add rule name=”Port 3306” protocol=TCP localport=3306 dir=in action=allow。
这种情况说明mysql的安装对中文系统支持得不好,不能识别 netsh.exe返回的“确定”信息,继而运行能在其他windows平台上运行的netsh.exe advfirewall命令(该命令xp不支持,所以报找不到该命令的错误。
解决办法有两个:
①将自己的操作系统的语言设置为英文,然后重新安装mysql 。具体的可以进入控制面板-区域和语言 中去更改;另外,检查当前用户是否有启动防火墙的权限,在计算机服务中查看Application Layer Gateway Service的属性,查看登录选项卡中的用户是否是当前用户。
②检查防火墙端口,如果已经添加成功了,则不作处理,如果没有成功添加,则自己手动在防火墙中添加端口。
错误4:安装成功之后,只能通过mysql 5.5 command line client 连接localhost的mysql server,而不能通过workbench或其他客户端工具进行远程连接mysql server。
关键字:不能远程连接mysql server。
可能原因:
①没有开端口,参见前一条解决。
②用户没有授权远程连接3306。
③mysql server不允许远程连接。
对于②用户没有授权远程连接,可以给用户授权,例如默认的root用户,可以在mysql 5.5 command line client 中输入如下命令:
//选择数据库
mysqluse mysql;
//给用户授权,yourpassword字段用你的密码代替
mysqlgrant all priileges on *.* to identified by ‘yourpassword’;
//刷新系统权限表
mysqlflush privileges;
//查看是否授权成功
mysql show grants for roots;
如果出现刚刚的授权,则表示成功。不成功的话,自己再添加一个新用户试试,添加用户的命令:
insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values(“%”,“newuser”,password(“newpassword”),‘’,‘’,‘’)
对于③mysql server不允许远程连接的解决办法是,找到自己的my.ini,在[mysqld]下增加一行语句:
bind-address=0.0.0.0
表示不绑定IP,重启你的Mysql服务。
错误5:配置文件my.ini的位置
MySQL配置向导将my.ini文件放置在MySQL服务器的安装目录中。这将有助于将配置文件和具体的服务器实例相 关联。为了保证MySQL服务器知道到哪里查找my.ini文件,和下面内容类似的参数将会被作为服务安装的一部分 传递给MySQL服务器:–defaults-file="C:Program FilesMySQLMySQL Server 5.5my.ini C:Program FilesMySQLMySQL Server 5.5可以被指向MySQL服务器的安装路径所代替。
编辑my.ini文:可以使用文本编辑器打开该文件同时做出必要的编辑和修改。你也可以以MySQL Administrator的应用程序来修 改服务器配置。 MySQL客户端和应用程序,例如mysql命令行客户端和mysqldump并不能确定位于服务器安装目录中的my.ini文件 的位置。为了配置客户端和应用程序,根据你的Windows版本的不同,在C:Windows下或者在C:WINNT目录下生 成新的文件my.ini 文件
如果你的MySQL配置向导发现了一个已经存在的my.ini文件,你可以重新配置已经存在的服务器,或者通过删除 my.ini文件、停止并移除MySQL服务的方法移除服务器实例。重新配置已经存在的服务器,选择“重新配置实例”选项并且选择“下一步”按钮。已经存在的my.ini文件被 重新命名为mytimestamp.ini.bak,时间戳是已经存在的my.ini创建时的日期和时间。移除已经存在的数据库实 例,选择“移除实例”选项并选择“下一步”按钮。如果选择了“移除实例”选项,进入到确认界面。单击“运行”按钮:MySQL配置向导停止并开始移除MySQL服 务,并删除my.ini文件。但服务器安装目录并没有移除。如果选择了“重新配置实例”选项,进入到“配置类型”界面,可以选择安装想要配置的安装类型。
你写依赖的时候不是能自己设置版本version吗 依赖找不着对应就会自己下载 有change 。。。点击就好了。然后下载不了,你就去官网别的地方下载一个,然后copy移到你的仓库,这样就会自动导入了
我用的数据库也是5.5版本,下面是我用的依赖:
!-- 数据库驱动依赖 --
dependency
groupIdmysql/groupId
artifactIdmysql-connector-java/artifactId
version5.1.37/version
/dependency
!-- 数据连接池依赖 这个看你自己选了还有c3p0 阿里的druid 等等--
dependency
groupIdorg.apache.commons/groupId
artifactIdcommons-dbcp2/artifactId
version2.1.1/version
/dependency
!--注:若用spring 还要有一个spring-jdbc的依赖 --
dependency
groupIdorg.springframework/groupId
artifactIdspring-jdbc/artifactId
version4.3.7.RELEASE/version
/dependency
有用的话,点个赞吧(●'◡'●)
只要字段值还可以继续拆分,就不满足第一范式。
范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定。
在满足第一范式的前提下,其他列都必须完全依赖于主键列。 如果出现不完全依赖,只可能发生在联合主键的情况下:
实际上,在这张订单表中,product_name 只依赖于 product_id ,customer_name 只依赖于 customer_id。也就是说,product_name 和 customer_id 是没用关系的,customer_name 和 product_id 也是没有关系的。
这就不满足第二范式:其他列都必须完全依赖于主键列!
拆分之后,myorder 表中的 product_id 和 customer_id 完全依赖于 order_id 主键,而 product 和 customer 表中的其他字段又完全依赖于主键。满足了第二范式的设计!
在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。
表中的 customer_phone 有可能依赖于 order_id 、 customer_id 两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。
修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!
查询每门课的平均成绩。
查询 score 表中至少有 2 名学生选修,并以 3 开头的课程的平均分数。
分析表发现,至少有 2 名学生选修的课程是 3-105 、3-245 、6-166 ,以 3 开头的课程是 3-105 、3-245。也就是说,我们要查询所有 3-105 和 3-245 的 degree 平均分。
查询所有学生的 name,以及该学生在 score 表中对应的 c_no 和 degree 。
通过分析可以发现,只要把 score 表中的 s_no 字段值替换成 student 表中对应的 name 字段值就可以了,如何做呢?
查询所有学生的 no 、课程名称 ( course 表中的 name ) 和成绩 ( score 表中的 degree ) 列。
只有 score 关联学生的 no ,因此只要查询 score 表,就能找出所有和学生相关的 no 和 degree :
然后查询 course 表:
只要把 score 表中的 c_no 替换成 course 表中对应的 name 字段值就可以了。
查询所有学生的 name 、课程名 ( course 表中的 name ) 和 degree 。
只有 score 表中关联学生的学号和课堂号,我们只要围绕着 score 这张表查询就好了。
只要把 s_no 和 c_no 替换成 student 和 srouse 表中对应的 name 字段值就好了。
首先把 s_no 替换成 student 表中的 name 字段:
再把 c_no 替换成 course 表中的 name 字段:
查询 95031 班学生每门课程的平均成绩。
在 score 表中根据 student 表的学生编号筛选出学生的课堂号和成绩:
这时只要将 c_no 分组一下就能得出 95031 班学生每门课的平均成绩:
查询在 3-105 课程中,所有成绩高于 109 号同学的记录。
首先筛选出课堂号为 3-105 ,在找出所有成绩高于 109 号同学的的行。
查询所有成绩高于 109 号同学的 3-105 课程成绩记录。
查询所有和 101 、108 号学生同年出生的 no 、name 、birthday 列。
查询 '张旭' 教师任课的学生成绩表。
首先找到教师编号:
通过 sourse 表找到该教师课程号:
通过筛选出的课程号查询成绩表:
查询某选修课程多于5个同学的教师姓名。
首先在 teacher 表中,根据 no 字段来判断该教师的同一门课程是否有至少5名学员选修:
查看和教师编号有有关的表的信息:
我们已经找到和教师编号有关的字段就在 course 表中,但是还无法知道哪门课程至少有5名学生选修,所以还需要根据 score 表来查询:
根据筛选出来的课程号,找出在某课程中,拥有至少5名学员的教师编号:
在 teacher 表中,根据筛选出来的教师编号找到教师姓名:
查询 “计算机系” 课程的成绩表。
思路是,先找出 course 表中所有 计算机系 课程的编号,然后根据这个编号查询 score 表。
查询 计算机系 与 电子工程系 中的不同职称的教师。
查询课程 3-105 且成绩 至少 高于 3-245 的 score 表。
查询课程 3-105 且成绩高于 3-245 的 score 表。
查询某课程成绩比该课程平均成绩低的 score 表。
查询所有任课 ( 在 course 表里有课程 ) 教师的 name 和 department 。
查询 student 表中至少有 2 名男生的 class 。
查询 student 表中不姓 "王" 的同学记录。
查询 student 表中每个学生的姓名和年龄。
查询 student 表中最大和最小的 birthday 值。
以 class 和 birthday 从大到小的顺序查询 student 表。
查询 "男" 教师及其所上的课程。
查询最高分同学的 score 表。
查询和 "李军" 同性别的所有同学 name 。
查询和 "李军" 同性别且同班的同学 name 。
查询所有选修 "计算机导论" 课程的 "男" 同学成绩表。
需要的 "计算机导论" 和性别为 "男" 的编号可以在 course 和 student 表中找到。
建立一个 grade 表代表学生的成绩等级,并插入数据:
查询所有学生的 s_no 、c_no 和 grade 列。
思路是,使用区间 ( BETWEEN ) 查询,判断学生的成绩 ( degree ) 在 grade 表的 low 和 upp 之间。
准备用于测试连接查询的数据:
分析两张表发现,person 表并没有为 cardId 字段设置一个在 card 表中对应的 id 外键。如果设置了的话,person 中 cardId 字段值为 6 的行就插不进去,因为该 cardId 值在 card 表中并没有。
要查询这两张表中有关系的数据,可以使用 INNER JOIN ( 内连接 ) 将它们连接在一起。
完整显示左边的表 ( person ) ,右边的表如果符合条件就显示,不符合则补 NULL 。
完整显示右边的表 ( card ) ,左边的表如果符合条件就显示,不符合则补 NULL 。
完整显示两张表的全部数据。
在 MySQL 中,事务其实是一个最小的不可分割的工作单元。事务能够 保证一个业务的完整性 。
比如我们的银行转账:
在实际项目中,假设只有一条 SQL 语句执行成功,而另外一条执行失败了,就会出现数据前后不一致。
因此,在执行多条有关联 SQL 语句时, 事务 可能会要求这些 SQL 语句要么同时执行成功,要么就都执行失败。
在 MySQL 中,事务的 自动提交 状态默认是开启的。
自动提交的作用 :当我们执行一条 SQL 语句的时候,其产生的效果就会立即体现出来,且不能 回滚 。
什么是回滚?举个例子:
可以看到,在执行插入语句后数据立刻生效,原因是 MySQL 中的事务自动将它 提交 到了数据库中。那么所谓 回滚 的意思就是,撤销执行过的所有 SQL 语句,使其回滚到 最后一次提交 数据时的状态。
在 MySQL 中使用 ROLLBACK 执行回滚:
由于所有执行过的 SQL 语句都已经被提交过了,所以数据并没有发生回滚。那如何让数据可以发生回滚?
将自动提交关闭后,测试数据回滚:
那如何将虚拟的数据真正提交到数据库中?使用 COMMIT :
事务的实际应用 ,让我们再回到银行转账项目:
这时假设在转账时发生了意外,就可以使用 ROLLBACK 回滚到最后一次提交的状态:
这时我们又回到了发生意外之前的状态,也就是说,事务给我们提供了一个可以反悔的机会。假设数据没有发生意外,这时可以手动将数据真正提交到数据表中:COMMIT 。
事务的默认提交被开启 ( @@AUTOCOMMIT = 1 ) 后,此时就不能使用事务回滚了。但是我们还可以手动开启一个事务处理事件,使其可以发生回滚:
仍然使用 COMMIT 提交数据,提交后无法再发生本次事务的回滚。
事务的四大特征:
事务的隔离性可分为四种 ( 性能从低到高 ) :
查看当前数据库的默认隔离级别:
修改隔离级别:
测试 READ UNCOMMITTED ( 读取未提交 ) 的隔离性:
由于小明的转账是在新开启的事务上进行操作的,而该操作的结果是可以被其他事务(另一方的淘宝店)看见的,因此淘宝店的查询结果是正确的,淘宝店确认到账。但就在这时,如果小明在它所处的事务上又执行了 ROLLBACK 命令,会发生什么?
这就是所谓的 脏读 ,一个事务读取到另外一个事务还未提交的数据。这在实际开发中是不允许出现的。
把隔离级别设置为 READ COMMITTED :
这样,再有新的事务连接进来时,它们就只能查询到已经提交过的事务数据了。但是对于当前事务来说,它们看到的还是未提交的数据,例如:
但是这样还有问题,那就是假设一个事务在操作数据时,其他事务干扰了这个事务的数据。例如:
虽然 READ COMMITTED 让我们只能读取到其他事务已经提交的数据,但还是会出现问题,就是 在读取同一个表的数据时,可能会发生前后不一致的情况。* 这被称为* 不可重复读现象 ( READ COMMITTED ) 。
将隔离级别设置为 REPEATABLE READ ( 可被重复读取 ) :
测试 REPEATABLE READ ,假设在两个不同的连接上分别执行 START TRANSACTION :
当前事务开启后,没提交之前,查询不到,提交后可以被查询到。但是,在提交之前其他事务被开启了,那么在这条事务线上,就不会查询到当前有操作事务的连接。相当于开辟出一条单独的线程。
无论小张是否执行过 COMMIT ,在小王这边,都不会查询到小张的事务记录,而是只会查询到自己所处事务的记录:
这是 因为小王在此之前开启了一个新的事务 ( START TRANSACTION ) * ,那么* 在他的这条新事务的线上,跟其他事务是没有联系的 ,也就是说,此时如果其他事务正在操作数据,它是不知道的。
然而事实是,在真实的数据表中,小张已经插入了一条数据。但是小王此时并不知道,也插入了同一条数据,会发生什么呢?
报错了,操作被告知已存在主键为 6 的字段。这种现象也被称为 幻读,一个事务提交的数据,不能被其他事务读取到 。
顾名思义,就是所有事务的 写入操作 全都是串行化的。什么意思?把隔离级别修改成 SERIALIZABLE :
还是拿小张和小王来举例:
此时会发生什么呢?由于现在的隔离级别是 SERIALIZABLE ( 串行化 ) ,串行化的意思就是:假设把所有的事务都放在一个串行的队列中,那么所有的事务都会按照 固定顺序执行 ,执行完一个事务后再继续执行下一个事务的 写入操作 ( 这意味着队列中同时只能执行一个事务的写入操作 ) 。
根据这个解释,小王在插入数据时,会出现等待状态,直到小张执行 COMMIT 结束它所处的事务,或者出现等待超时。
转载: