Hibernate+Mysql+Idea 半diy半自动生成
前言
不得不说IDEA+hibernate十分智能也很脑残,它可以自动连接数据库后生成实体类和配置文件,甚至可以生成tostring的测试类。但是他有的要改的地方没有标注,最后还是得看网上的demo进行调试。
环境配置
HIbernate在idea里面有:新建project,然后新建moduel或者直接新建java都可以,然后在右边勾一下要用的,(勾多不要紧,勾少了又得加)
Hibernate勾的时候记得顺便勾下面的这两个。
点下这两个…配置下连接自己的数据库和包路径。注意driver是可以选的,我的mysql驱动用的不是默认的,而是mysql for 5.1。包路径默认没有,左上角点一下自己建。然后选一下你要用的shema就可以完成创建了。
***这之后我自己添加了JDBC的jar包,不知道为什么网上其他博客都没加也没报错。(下个驱动解压后把jar包拖到lib目录)
正式开始
把这块被注释的Ctrl + /取消注释然后按格式输入自己数据库的账号密码。这个hibernate.hbm2ddl.auto其实有4个模式,但是最常用的只有update,所以想了解更多可以谷歌一下。
贴一下我的代码
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/clouddb01?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>-->
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- DB schema will be updated if needed -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.example.Dept"/>
<mapping resource="com/example/Dept.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后就大功告成了(才怪)
运行一下自动生成的main函数
很奇怪,都是乱码。看了下实体类发现,他写了getter setter没写tostring()
很像吐槽一下,为什么不给他来个lombok呢。
不过不得不说这自动生成的挺厉害的。
于是乎跑到这个类这里alt + insert 选择testring()
再运行一下main函数
成功。
增删改查
增:
import com.example.Dept;
import org.hibernate.*;
import org.hibernate.query.Query;
import org.hibernate.cfg.Configuration;
import javax.persistence.metamodel.EntityType;
public class main_add {
private static final SessionFactory ourSessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ourSessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return ourSessionFactory.openSession();
}
public static void main(final String[] args) throws Exception {
final Session session = getSession();
try {
Transaction transaction = session.beginTransaction();
Dept dept=new Dept();
dept.setDbSource("clodudb02");
dept.setDeptno(200);
dept.setDname("zzz");
session.save(dept);
transaction.commit();
} finally {
session.close();
ourSessionFactory.close();
}
}
}
改:
import com.example.Dept;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class main_update {
private static final SessionFactory ourSessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ourSessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return ourSessionFactory.openSession();
}
public static void main(final String[] args) throws Exception {
final Session session = getSession();
try {
Transaction transaction = session.beginTransaction();
Dept dept=new Dept();
dept.setDbSource("clouddb03");
dept.setDeptno(200);
dept.setDname("aaa");
session.update(dept);
transaction.commit();
} finally {
session.close();
ourSessionFactory.close();
}
}
}
删
import com.example.Dept;
import org.hibernate.*;
import org.hibernate.query.Query;
import org.hibernate.cfg.Configuration;
import javax.persistence.metamodel.EntityType;
public class main_delete {
private static final SessionFactory ourSessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ourSessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return ourSessionFactory.openSession();
}
public static void main(final String[] args) throws Exception {
final Session session = getSession();
try {
Transaction transaction = session.beginTransaction();
Dept dept=new Dept();
dept.setDbSource("clodudb02");
dept.setDeptno(200);
session.delete(dept);
transaction.commit();
} finally {
session.close();
ourSessionFactory.close();
}
}
}
查
先放一个普通的(巨坑:session.get()函数第二个变量必须用long类型)
import com.example.Dept;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class main_get {
private static final SessionFactory ourSessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ourSessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return ourSessionFactory.openSession();
}
public static void main(final String[] args) throws Exception {
final Session session = getSession();
try {
Transaction transaction = session.beginTransaction();
Dept dept=new Dept();
dept=(Dept)session.get(Dept.class,(long)1);
System.out.println(dept);
transaction.commit();
} finally {
session.close();
ourSessionFactory.close();
}
}
}
在做完以上查找的时候,我突然意识到,这些简单增删改查根本满足不了平常的mysql操作啊,简直就是helloworld功能,于是到查的时候我谷歌了一下找到了更高阶的语句:HQL。这里放一个查找的简单示例。
import com.example.Dept;
import org.hibernate.*;
import org.hibernate.query.Query;
import org.hibernate.cfg.Configuration;
import java.util.List;
public class main_search {
private static final SessionFactory ourSessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
ourSessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return ourSessionFactory.openSession();
}
public static void main(final String[] args) throws Exception {
final Session session = getSession();
try {
Transaction transaction = session.beginTransaction();
//没有条件的hql,也就是查询全部记录。
String hql = "from Dept where deptno = 2";
Query hqlQuery = session.createQuery(hql);
List<Dept> list = hqlQuery.list();
for(Dept dept : list){
System.out.println(dept.toString());
}
} finally {
session.close();
ourSessionFactory.close();
}
}
}
这是第一次做博客希望不是最后一次。
Github:https://github.com/MingZ3234/HiberanteDemo