Hibernate学习笔记

Hibernate学习笔记(二)

标签(空格分隔): hibernate


本课提纲

Hibernate原理模拟
O/R Mapping

本文模拟了Hibernate如何对数据库进行操作,但是真实的Hibernate并不是通过此模拟,而是直接编译成二进制码进行操作。本文表明了一种实现的方式。

环境配置

myeclipse2014,加入mysql-connector-java-5.1.33-bin.jar,jdom.jar两个jar包。

OR Mapping Simulation

MySQL数据库进行操作,直接看java代码:

首先新建model包,将我们自己写的类写入其中

Student.java:

package com.han.hibernate.model;

public class Student {

    private int id;
    private String name;
    private int age;

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

与上节课一样,Student.java的属性有id,name,age

建立test的source folder用于存储我们的测试类:

  • 首先先写一个properties文件存储我们的数据库信息,以便java代码中提取数据库信息
    myinit.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/select_test
user=root
pass=xuanzhi1
  • 重点!!!Session类!!!
    Session.java:
package com.han.test;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import com.han.hibernate.model.Student;

public class Session {

    //假设已经读到类的名字了
    String tableName="student";
    //为什么用Map,因为我们的属性名和类名一一对应
    Map<String, String> cfs=new HashMap<String,String>();
    String[] methodNames;
    private static String driver;
    private static String url;
    private static String user;
    private static String pass;

    public Session() throws Exception{
        //使用Properties类来加载属性文件
        Properties props=new Properties();
        InputStream fis = Session.class.getResourceAsStream("myinit.properties");
        props.load(fis);
        driver=props.getProperty("driver");
        url=props.getProperty("url");
        user=props.getProperty("user");
        pass=props.getProperty("pass");

        cfs.put("id", "id");
        cfs.put("name", "name");
        cfs.put("age", "age");
        methodNames=new String[cfs.size()];
    }

    public void save(Student s) throws Exception{
        String sql=createSQL();

        Class.forName(driver);
        try(
            //获取数据库连接
            Connection conn=DriverManager.getConnection(url,user,pass);
            PreparedStatement ps=conn.prepareStatement(sql))
        {
            //验证一下产生的反射方法
            for(int i=0;i<methodNames.length;i++){
                Method m =s.getClass().getMethod(methodNames[i]);   //反射
                Class r=m.getReturnType();
                if(r.getName().equals("java.lang.String")){
                    String returnValue=(String)m.invoke(s); //对Student s中的m方法进行调用调用
                    //?是从1开始的
                    ps.setString(i+1, returnValue);
                }
                //System.out.println(m.getName()+" | "+r.getName());
                if(r.getName().equals("int")){
                    Integer returnValue=(Integer)m.invoke(s);
                    ps.setInt(i+1, returnValue);
                }
            }
            ps.executeUpdate();
        }
    }

    private String createSQL() {    //构造sql语句
        String str1="";
        int index=0;
        for(String s:cfs.keySet()){
            String v=cfs.get(s);
            v=Character.toUpperCase(v.charAt(0))+v.substring(1);
            methodNames[index]="get"+v; //getxxx,xxx的首字母大写,比如getId;
            index++;
            str1+=s+",";
        }
        str1=str1.substring(0,str1.length()-1);
        String str2="";
        // TODO Auto-generated method stub
        for(int i=0;i<cfs.size();i++){
            str2+="?,";
        }
        str2=str2.substring(0,str2.length()-1); //去掉最后一个,
        String sql="insert into "+tableName+"(" + str1 + ")"+" values("+str2+")";
        System.out.println("sql : "+sql);   //本例输出sql : insert into student(id,age,name) values(?,?,?)
        return sql;
    }
}

代码解释:

 1.  **Session()**
driver,url,user,pass代表数据库的驱动,url,用户名及密码,使用InputStream读myinit.properties文件再通过Properties.load的方法提取出用户名密码等信,最后将属性放入cfs键值对中。
 2.  **createSQL()** 
创建sql语句,从cfs的关键字中提取出方法名。由于get方法是如下形式:

getId()

    可以看出方法是由get加上属性第一个字母大写再加上其余字符串而形成,所以我们的toUpperCase(v.chatAt(0))+v.substring(1)是构造方法字符串。

    遍历出所有构造方法,由于构造的字符串最后有一个逗号,所以要去掉最后的逗号即str1=str1.substring(0,str1.length()-1)

    str2字符串为属性同等个数的?字符串,同理遍历后要去掉尾部的逗号。
    ```
    for(int i=0;i<cfs.size();i++){
        str2+="?,";
    }
    str2=str2.substring(0,str2.length()-1); //去掉最后一个,
    ```
    String sql="insert into "+tableName+"(" + str1 + ")"+" values("+str2+")";
此例最后输出的SQL语句应该为 **insert into student(id,age,name) values(?,?,?)**,构造字符串完成。

 3.  **save(Student s)**
创建字符串,打开数据库连接,然后使用java的反射机制通过getClass().getMethod()获取方法名,getReturnType()获取返回类型。根据不同的返回类型进行不同的处理,具体内容参见代码,最后executeUpdate()提交。
  • 最后写一个测试类

    StudentTest.java:

package com.han.test;

import org.junit.Test;

import com.han.hibernate.model.Student;

public class StudentTest {

    @Test
    public void test() throws Exception {
        Student s=new Student();
        s.setId(9);
        s.setName("s9");
        s.setAge(9);

        Session session=new Session();
        session.save(s);
    }

}

运行后执行情况如下:

执行结果

可以看出数据正确的插入到了数据库中

源码地址戳我

下一节我将会讲解关于hibernate的基本配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以和你分享一些关于Spring Boot的学习笔记。 1. Spring Boot是什么? Spring Boot是一个基于Spring框架的快速开发框架,它能够帮助开发者快速搭建Spring项目,简化了Spring应用开发的繁琐过程,提高了开发效率。 2. Spring Boot的优点有哪些? Spring Boot的优点有很多,其中包括: - 简化了Spring应用的开发,提高了开发效率; - 集成了很多常用的第三方库,减少了依赖管理的工作; - 自动化配置,减少了配置文件的编写工作; - 内嵌了Tomcat等Web容器,使得应用的部署更加便捷; - 提供了Actuator等模块,使得应用的监控和管理更加便捷。 3. Spring Boot的核心注解有哪些? Spring Boot的核心注解包括: - @SpringBootApplication:标注在启动类上,代表这是一个Spring Boot应用; - @Controller:标注在控制器类上,处理HTTP请求; - @Service:标注在服务类上,用于处理业务逻辑; - @Repository:标注在数据访问类上,用于数据库访问; - @Configuration:标注在配置类上,用于配置Spring应用上下文。 4. Spring Boot的配置文件有哪些? Spring Boot的配置文件包括: - application.properties:基于Key-Value的属性文件; - application.yml:基于YAML语法的配置文件。 5. 如何使用Spring Boot集成数据库? 使用Spring Boot集成数据库需要完成以下几个步骤: - 在pom.xml中添加相关数据库依赖; - 配置数据源和JPA/Hibernate等相关配置; - 编写实体类和DAO层代码。 以上就是一些关于Spring Boot的学习笔记,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值