解决hibernate只能插入一条数据的问题
hibernate初学,根据视频教程写好代码后,发现无论执行多少次main函数,数据库中只有一条数据,尝试多次,后来终于发现问题。。。
使用的工具是:MYSQL 5.7.13 eclipse 4.5.2 hibernate 4.0.5
第一步:
在mysql中新建一个数据库 名为DEMO01,然后再创建一个test表:
USE DEMO01;
CREATE TABLE test(
TEST_ID int auto_increment,
name varchar(20),
TEST_DATE date,
primary key(TEST_ID)
)engine=InnoDB default charset=utf8 auto_increment=1;
第二步:
新建一个Java project,添加持久化类
package com.hibernate.demo;
/*
*持久化类test
*/
import java.util.Date; public class test {
private int id;
private String name;
private Date time; public test(){} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
} @Override
public String toString() {
return "test [id=" + id + ", name=" + name + ", time=" + time + "]";
} }
第三步:
创建Hibernate的映射文件,其中property中的name对应持久化类中的属性,column中的name对应数据库中的字段名
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-13 17:46:08 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.hibernate.demo.test" table="TEST">
<id name="id" type="int">
<column name="TEST_ID" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="time" type="java.util.Date">
<column name="TEST_DATE" />
</property>
</class>
</hibernate-mapping>
第四步:
创建Hibernate配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///demo01?useUnicode=true&characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property> <mapping resource="com/hibernate/demo/test.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate配置文件内容都是以键值对的形式进行配置:
connection.driver_class指连接数据库的驱动,对不同的关系数据库,驱动不同,需要根据实际情况修改;
connection.url指对应的数据库的url;
dialect指对应的数据库方言;
show_sql指程序运行时是否在控制台输出SQL语句,true 输出,false 不输出。默认false,在调试程序时一般设为true,发布程序前改为false,因为输出SQL语句会影响程序的运行速度;
format_sql指程序运行时,是否在SQL语句中输出便于调试的注释信息。true 输出,false 不输出,默认false。该属性只有当show_sql为true时才有效。
hbm2dd.auto指对数据库的数据进行的操作类型:
create:每次加载hibernate,重新创建数据库表结构
create-drop:加载hibernate时创建,退出时删除表结构
update:加载hibernate自动更新数据库结构
validate:加载hibernate时,验证创建数据库表结构
嗯。。。。我的问题就出现在这里。。。一开始是写的create,后来改为update就没问题了。。。一旦发现数据库表丢失,首先看这里设置的值。。。
第五步:
创建会话工厂以及测试实例,增删查改都有,不过可能方案不全(按道理应该分开来写,我这里写一起了,偷了个懒~)
package com.hibernate.demo; import java.util.Date;
import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration; public class testManage {
private static final SessionFactory sessionFactory=buildSessionFactory(); private static SessionFactory buildSessionFactory() {
//创建配置对象
Configuration cfg = new Configuration().configure();
//创建服务注册对象
StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
StandardServiceRegistry sr = srb.build();
//创建工厂会话对象
return cfg.buildSessionFactory(sr);
} public static void main(String[] args) { Session session=sessionFactory.openSession();
session.beginTransaction(); //新增
test theTest=new test();
theTest.setName("mist332!");
theTest.setTime(new Date());
session.save(theTest); //更新
/*test uTest=new test();
uTest.setId(1);//id不能少,Hibernate是根据ID来查询数据进行更新的
uTest.setName("全宇宙我最帅啦~~~");
session.update(uTest);*/ //删除
/*test dTest=new test();
dTest.setId(1);//hibernate先进行查询,再删除
test dTest1=(test)session.get(test.class, 1);
session.delete(dTest1);
*/ //查询 //HQL查询,是Hibernate主推的查询方式,和SQL比较像,但是form后面是Java类名,不是数据库表名,
//如果查询全字段 select * 可以省略不写
/*Query query=session.createQuery("from test");
List<test> list=query.list();
for(test t:list){
System.out.println(t.toString());
}*/ //当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:
/*Query query=session.createQuery(" select s.name,t.name from Student s ,test t ");
List<Object[]> list=query.list();//这里的每一行都是一个一维数组
for(int i=0;i<list.size();i++){
Object []o=(Object[]) list.get(i);//转型为数组
String name1=(String) o[0];//与select中顺序的类型相对应,可以是类
String name2=(String) o[1];
System.out.println("Student中的name:"+name1+"test中的name:"+name2);
System.out.println("查出来了~~~~~~~~");
}*/ session.getTransaction().commit();
session.close();
sessionFactory.close();;
} }
如果我们把设置为create,那么执行的SQL就会是:
INFO: HHH000227: Running hbm2ddl schema export
Hibernate:
drop table if exists TEST
Hibernate:
create table TEST (
TEST_ID integer not null,
NAME varchar(255),
TEST_DATE datetime,
primary key (TEST_ID)
)
八月 13, 2016 6:20:03 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate:
insert
into
TEST
(NAME, TEST_DATE, TEST_ID)
values
(?, ?, ?)
八月 13, 2016 6:20:04 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql:///demo01?useUnicode=true&characterEncoding=UTF-8]
插入成功!
如果设置为update:
八月 13, 2016 6:44:24 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate:
insert
into
TEST
(NAME, TEST_DATE)
values
(?, ?)
八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning
WARN: SQL Warning Code: 1292, SQLState: 22007
八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning
WARN: Incorrect date value: '2016-08-13 18:44:24.789' for column 'TEST_DATE' at row 1
八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql:///demo02?useUnicode=true&characterEncoding=UTF-8]
插入成功!
从打印的SQL语句中很容易就可以看出区别啦~
解决hibernate只能插入一条数据的问题的更多相关文章
- springmvc 使用poi解析excel并通过hibernate连续插入多条数据 实际数据库只能保存最后一条
有一个原始数据的excel表 用poi解析之后通过hibernate插数据库 结果 后来发现,有人说 果断尝试 问题解决 但是这好像并不是真正解决问题,只是解决了一个现象 因为有人说 https:// ...
- Hibernate的配置跟简单创建一个表并插入一条数据
首先官网下载一个hibernate的架包,由于时间关系,博主已经分享到了百度网盘:https://pan.baidu.com/s/1Mw0Og3EKnouf84Njz9UicQ,提取码lens Hib ...
- Mybatis一对多或多对多只能查出一条数据解决策略
原文:https://blog.csdn.net/ren814/article/details/81742242 <resultMap id="menuModelMap" t ...
- SQL中一次插入多条数据
SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据. 1. 语法:select 字段列表 into 新表 from 源表 注意事项:此种方法新表是系统自动创建,语句执行前不 ...
- MongoDB插入多条数据
刚开始学mongodb,只知道几个命令,insert插入也只能一条一条插入,而在实际情况下数据一般都非常多,刚开始想直接上传json文件,网上搜了n多方法发现这种方法不好弄,然后就想着要么一下子把多条 ...
- 用一条mysql语句插入多条数据
这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...
- MySql LAST_INSERT_ID 【插入多条数据时】
LAST_INSERT_ID 自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里 The ID that was generat ...
- 数据库一次性插入10w条数据,怎么插入效率快
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量 ...
- mysql一次插入多条数据
mysql一次插入多条数据: INSERT INTO hk_test(username, passwd) VALUES ('qmf2', 'qmf2'),('qmf3', 'qmf3'),('qmf4 ...
随机推荐
- iOS开发中的数据安全隐患和解决方案
移动互联网的兴起,每天都会涌现大量的app产品,无论公司开发还是个人开发,大家都在追求更快的抢占市场,但是确忽略了打磨产品,也忽略了移动开发中的数据安全隐患,如果我们用Charles工具,很容易截获到 ...
- rails之 Migrations (转)
1.简介 在rails中用migration可以很方便的管理数据库的结构.可以创建数据库,创建表,删除表,添加字段,删除字段,整理数据. migration就是一系列的class,这些类都继承了Act ...
- HDU5127 神坑题---vector 、 list 、 deque 的用法区别
题意:三个操作 1 a b : 队列中加入(x = a, y = b); -1 a b : 队列中减去(x = a, y = b); 0 p q :从队列的数对中查询哪一对x,y能够让 p * ...
- windows7共享硬盘 虚拟机Mac访问windows7硬盘
选择本地磁盘(G)-->右键-->共享-->高级共享点击高级共享 确定 完成共享 虚拟机Mac 访问共享磁盘 2.苹果MAC系统,点击桌面.打开顶部菜单 “前往”. 3.菜单 ...
- 如何快速编写Vim语法高亮文件
这里有一份中文的入门文档,但是太长了,不想读,所以有本文 最快的办法,就是找一个语法相近的语法高亮文件,稍微改一下 自己从头写的话,首先搞定关键字: syntax case match "是 ...
- Linux压缩那些事儿
tar简介 Linux的压缩命令的源文件只能有一个,这意味在压缩之前不得不先将要压缩的所有文件打包成一个包,然后再压缩包,这样来完成对多个文件的压缩.所以在了解解压缩之前就必须先了解打包命令. Lin ...
- firefox 不识别background-position-y / background-position-x
火狐不识别background-position-y 或background-position-x; 案例: 页面: 背景图: 一列按钮,点击时让当前背景图的background-position-y ...
- map的应用
1.map最基本的构造函数: map<string , int >mapstring; map<int ,string >mapint; map&l ...
- xampp 文件夹拷贝的注意事项。
xampp可以同盘符拷贝,比如由A电脑的D:\XAMPP拷贝到B电脑的D:\XAMPP,此拷贝不用修改任何设置,当进行不同盘拷贝时,要修改apache和mysql下的一大堆conf文件,修改盘符: x ...
- Excel中如何提取字符串中的数字
取字符串中的数字,假如数据在A列,提取公式为 =LOOKUP(9^9,--MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&5^19)),ROW($1:$99) ...