ORM框架

      ORM框架:O(Object 对象) R(Relative 关系) M(Mapping 映射) 对象关系映射. 把数据中的表映射为java中的实体类,表中的一条记录映射为java实体类对象。

表中的列映射实体的属性了。 之前我们学习过一个ORM---Mybatis.-----单表的CRUD无需写任何sql语句。我们自己手写的ORM框架使用的技术: 泛型 注解 反射。

(1)创建maven工程并引入相关依赖,版本与自己的数据库一致.

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
    </dependencies>

(2)创建一个连接数据库的工具类。

db.properties

jdbc.driverName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/qy16?serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root

 DbUtil<工具类>

package com.aaa.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class DbUtil {
    //硬编码
    private static String driverName="";
    private static String url="";
    private static String username="";
    private static String password="";

    static{
        //静态代码块。----随着类的加载而被加载,而且只会被加载一次。
        try {
            InputStream inputStream = ClassLoader.getSystemResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(inputStream);
            driverName = properties.getProperty("jdbc.driverName");
            url = properties.getProperty("jdbc.url");
            username = properties.getProperty("jdbc.username");
            password = properties.getProperty("jdbc.password");
        }catch (Exception e){
            System.out.println("名字为db.properties的属性文件不存在");
            e.printStackTrace();
        }
    }

    //获取连接对象
    public static Connection getConnection() throws Exception{
        Class.forName(driverName);
        Connection connection = DriverManager.getConnection(url, username, password);
        return connection;
    }

    //关闭资源
    public static void closeAll(Connection connection, PreparedStatement ps, ResultSet rs){
          try{
              if(rs!=null){
                  rs.close();
              }
              if(ps!=null){
                  ps.close();
              }
              if(connection!=null){
                  connection.close();
              }
          }catch (Exception e){
              e.printStackTrace();
          }
    }

}

(3)创建一个父类BaseDao

一个子类DAO继承BaseDao类后,无需再写任何sql语句,而就可以完成单表的crud操作。

比如: StudentDao extends BaseDao DeptDao extends BaseDao.

BaseDao对所有表的CRUD操作都能通用。

package com.aaa.dao;

import com.aaa.annotation.TableField;
import com.aaa.annotation.TableId;
import com.aaa.annotation.TableName;
import com.aaa.util.DbUtil;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;


public class BaseDao<T> {
    //通用的添加操作.
    //通用的添加sql语句: insert into 表名(列名,列名....) values(值,值.....)
    public int insert(T t) throws Exception{
        StringBuffer sql=new StringBuffer("insert into ");
        //根据对象获取Class反射类。
        Class<?> aClass = t.getClass();
        //获取反射类上的注解对象
        TableName annotation = aClass.getAnnotation(TableName.class);
        //表名
        String tableName=aClass.getSimpleName();
        if(annotation!=null){
             tableName=annotation.value();
        }
        sql.append(tableName);
        //获取列名
        Field[] declaredFields = aClass.getDeclaredFields();
        //列名
        List<String> columns=new ArrayList<String>();
        List<String> values=new ArrayList<String>();
        for(Field field:declaredFields){
            String name = field.getName();//属性名
            TableId annotation2 = field.getAnnotation(TableId.class);
            if(annotation2!=null||name.equals("id")){
                continue;
            }
            TableField annotation1 = field.getAnnotation(TableField.class);
            if(annotation1!=null){
                name=annotation1.value();
            }
            field.setAccessible(true);
            Object o = field.get(t);
            columns.add(name);
            values.add("'"+o+"'");//id name loc values(‘1’,'研发','背景')
        }
       String columnNames= columns.toString().replace("[","(").replace("]",")");
       String columnValues= values.toString().replace("[","(").replace("]",")");
       sql.append(columnNames);
       sql.append(" values ");
       sql.append(columnValues);
       //执行sql
        Connection connection = DbUtil.getConnection();
        PreparedStatement ps=connection.prepareStatement(sql.toString());
        int i = ps.executeUpdate();
        return i;
    }
}
  //修改方法
    // sql: update 表名  set 列名=值,列名=值.... where 主键名=值;
    public int update(T t) throws Exception{
        StringBuffer sql=new StringBuffer("update ");
        //获取实体类的反射类
        Class<?> aClass = t.getClass();
        //获取反射类上指定的注解对象
        TableName annotation = aClass.getAnnotation(TableName.class);
        String tableName=aClass.getSimpleName();
        if(annotation!=null){
             tableName=annotation.value();
        }
        sql.append(tableName+" set ");
        //获取所有的Field。
        Field[] declaredFields = aClass.getDeclaredFields();
        String where=" where ";
        for(Field field:declaredFields){
            field.setAccessible(true);
            String name = field.getName();
            TableId tableId = field.getAnnotation(TableId.class);
            if(name.equals("id")){
                where =where +" id='"+field.get(t)+"'";
                continue;
            }
            if(tableId!=null){
                where =where + tableId.value()+" '"+field.get(t)+"'";
                continue;
            }
            TableField tableField = field.getAnnotation(TableField.class);
            if(tableField!=null){
                name=tableField.value();
            }

            String value="'"+field.get(t)+"'";
            sql.append(name+"="+value+",");
        }
        String sql2=sql.toString().substring(0,sql.length()-1)+where;

        //执行sql
        Connection connection = DbUtil.getConnection();
        PreparedStatement ps=connection.prepareStatement(sql2);
        int i = ps.executeUpdate();
        return i;

    }

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值