Hibernate的基础入门(一)
一Java三层结构
1 web层:struts框架
2 service层:Spring框架
3 dao层 :hibernate框架
相当于MVC的思想
1 M:模型èhibernate框架
2 V:视图èstruts框架
3 C:控制器èSpring框架
1:Hibernate是对JDBC进一步封装
不需要复杂的jdbc代码,不需要写sql语句也能实现
- 没有使用hibernate如下:
Jdbc: public static final String URL="jdbc:mysql://localhost:3306/数据库";//链接的mysql public static final String NAME = "root"; public static final String PASSWORD = "root"; public static final String DREIVER = "com.mysql.jdbc.Driver"; //加载驱动 Class.forName(DREIVER); //创建连接 Connection con=DriverManager.getConnection(URL, NAME, PASSWORD); //对sql进行编译操作 String sql = "select * from users "; // 查询多条数据 PreparedStatement psmt=con.prepareStatement(sql); //执行sql ResultSet rs= psmt. executeQuery(); //遍历结果集 ….. //释放资源
2 使用hibernate:让实体类和表一一对应不需要代码即可实现,使用配置文件完成
hibernate封装的对象session
//创建实体类的对象
User user =new User();
user.setName("明珠");
session.sava(user);
2:Hibernate的核心
A :Configuration接口:负责配置并启动Hibernate
B :SessionFactory接口:负责初始化Hibernate
C :Session接口:负责持久化对象的CRUD操作
D :Transaction接口:负责事务
F :Query接口和Criteria接口:负责执行各种数据库查询
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃
二:Hibernate 准备
- 导入jar包
2.创建实体类(Javabean)
创建一个User的实体类
/** * 2 创建实体类,然后配置实体类和数据库表一一对应关系(映射关系) * @author Xiao_Zhu * */ public class User { // hibernate要求实体类有一个属性唯一的 // private String uuid; private int id; private String name; private String password; private String address; /* * public String getUuid() { return uuid; } * * public void setUuid(String uuid) { this.uuid = uuid; } */ public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3 :配置实体类和数据库表一一对应关系(映射关系)
(1):使用配置文件实现映射关系
a. 创建xml格式的配置文件
映射配置文件名称和位置没有固定要
建议:配置文件最好放在实体类相应的包的路径下. 配置文件的名称:实体名称.hbm.xml (这是我的习惯)
创建一个User.hbm.xml的配置文件
<?xml version="1.0"?> <!-- 只有引入约束,下面才能使用hibernate-mapping的标签 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 1配置类和表对应 class标签 name属性:实体类全路径 ==>如: com.zhu.domain.User table属性:数据库表名称 --> <class name="com.zhu.domain.User" table="td_users"> <!-- 2配置实体类ID和表里面的id对应 hibernate:要求实体类有个属性唯一值 hibernate:要求表有字段作为 --> <!-- id标签 name:实体类里面 id属性名 column:生成的表字段名称 --> <id name="uuid" column="uuid"> <!-- 3 设置数据库表id增长策略 native: 生成表id值就是主键自动增长 --> <generator class="uuid"></generator> </id> <!-- 4:配置其他属性和表字段对应 name属性:实体类属性(变量)名称 column :数据库表字段的名称 --> <property name="name" column="name"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
4:创建hibernate的核心配置文件
a:核心配置文件格式xml,而且核心配置文件名称和位置固定的
位置:必须在src下面
名称:必须hibernate.cfg.xml
<?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> <!-- 第一部分:配置数据库信息 jdbc:mysql://localhost:3306/--> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/jdbc01 </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 第二部分:配置hibernate信息 --> <!--输出底层sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 输出底层SQL语句格式 --> <property name="hibernate.format_sql">true</property> <!-- hibernate帮创建表,需要配置之后 update:如果已经有表,那么就更新,如果没有,创建 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置数据库方言 在mysql里面实现分页关键字limit,只能使用mysql里面 在Oracle数据库,实现纷纷也rownum 让hibernate框架识别不同数据库语句 --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQL5Dialect </property> <!-- 把session绑定到hibernate --> <property name="current_session_context_class">thread</property> <!-- 第三部分:把映射文件放到核心配置文件中 --> <!-- 因为对应的表hibernatexml.hbm.xml配置文件放在包里,不是src下面的目录下;所以路径要这样写 --> <!-- 如果User.hbm.xml放在src下的目录下面,那么路径 就可以 直接这样写==>User.hbm.xml --> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/jdbc01</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <mapping resource="com/zhu/domain/User.hbm.xml" /> </session-factory> </hibernate-configuration>
5 创建数据的表
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtils { static Configuration cfg=null; static SessionFactory sessionFactory=null; static { cfg=new Configuration(); cfg.configure(); ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build(); sessionFactory = cfg.buildSessionFactory(registry); } //提供方法放回本地线程绑定session的方法 public static Session getSessionObejct(){ return sessionFactory.getCurrentSession(); } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static void main(String[] args) { //要运行这里程序,运行之后才会在相应的某个数据库中生产一张表 //运行之后去mysql中看一下是否成功生产了td_users表 } }
三:实现CRUD操作
第一步: 加载hibernate核心配置文件
第二步:创建SessionFactory对象
第三部使用SessionFactory创建session对象
第四部:开启事务
第五步:写具体逻辑crud操作
第六步:提交事务
第七步:关闭资源
(1):瞬时态, 持久态, 托管态
(a):瞬时态:对象里面没有id值,对象与session没有关联
(b):持久态:对象里面有ID值,对应于session关联
(c):托管态:对象有ID值,对象与session没有关联
如:托管态
User user=new User();
user.setId(1);
1 创建一个TestCRUD的类
import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.zhu.domain.User; import com.zhu.unit.HibernateUtils; public class TestCRUD { public static void main(String[] args) { // 新增数据 // insertData(); // 查询一条数据 通过ID // queryDataById(); // 修改一条数据 // updateData(); /// 查询多条数据 QueryListData(); // 删除数据 // deleteData(); } // 查询一条数据 通过ID public static void queryDataById() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 4根据ID查询 // 调用session里面的get方法 // 第一个参数:是实体类的class // 第二参数:是数据库 的id值
//(b):持久态:对象里面有ID值,对应于session关联 User user = (User) session.get(User.class, 1); System.out.println("地址 ==>" + user.getAddress()); // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 修改一条数据 public static void updateData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 4根据修改 // 调用session里面的get方法 // 第一个参数:是实体类的class // 第二参数:是数据库 的id值 User user = (User) session.get(User.class, 1); user.setAddress("中国"); // 调用session的方法update修改 session.update(user); // 注意:sava的方法也能进行修改 // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 删除数据 public static void deleteData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 4 删除 // 第一种删除:根据ID查询对象再删除 User user = (User) session.get(User.class, 1); session.delete(user); /* * //第二种删除: User user2=new User(); user.setId(3); session.delete(user2); */ // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 新增数据 public static void insertData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 第五步:写具体逻辑crud操作 // 添加功能
//(a):瞬时态:对象里面没有id值,对象与session没有关联
User user = new User(); user.setPassword("123123"); user.setAddress("美國s"); user.setName("mm"); // 调用session的方法实现添加 session.save(user); // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 查询多条数据 public static void QueryListData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); String qhl = "from User"; Query query = session.createQuery(qhl); // 2 调用query对象里面的方法得到结果 List<User> list = query.list(); for (User user : list) { System.out.println(user.getAddress()); } // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } }
网盘地址 http://pan.baidu.com/s/1qYHPm8W