面试官让我现场手写MyBatis框架,我10分钟就搞定了!!(全程实战,建议收藏

总结

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了

面试真题

Spring源码笔记

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

@Table注解的实现

首先,我们创建一个io.mykit.annotation.jdk.db.provider Java包,在这个Java包创建一个@Table注解,@Table注解标注在Java类上,表示当前类会被映射到数据库中的哪张数据表上,如下所示。

package io.mykit.annotation.jdk.db.provider;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

  • 自定义Table注解

  • @author binghe

*/

@Inherited

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Table {

String value() default “”;

}

@Column注解的实现

同样的,在io.mykit.annotation.jdk.db.provider包下创建一个@Column注解,@Column注解标注在类中的字段上,表示当前类中的字段映射到数据表中的哪个字段上,如下所示。

package io.mykit.annotation.jdk.db.provider;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

  • 自定义Column注解

  • @author binghe

*/

@Inherited

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Column {

String value() default “”;

}

看到这里,不管是使用过MyBatis的小伙伴还是使用过Hibernate的小伙伴,应该都会有所体会吧?没错,@Table注解和@Column注解,不管是在MyBatis框架还是Hibernate框架中,都会被使用到。这里,我们在收录极简版ORM框架时,也使用了这两个经典的注解。

创建实体类

io.mykit.annotation.jdk.db.provider.entity包下创建实体类User,并且@Table注解和@Column注解会被分别标注在User类上和User类中的字段上,将其映射到数据库中的数据表和数据表中的字段上,如下所示。

package io.mykit.annotation.jdk.db.provider.entity;

import io.mykit.annotation.jdk.db.provider.Column;

import io.mykit.annotation.jdk.db.provider.Table;

/**

  • 自定义使用注解的实体

  • @author binghe

*/

@Table(“t_user”)

public class User implements Serializable{

@Column(“id”)

private String id;

@Column(“name”)

private String name;

public User() {

super();

}

public User(String id, String name) {

super();

this.id = id;

this.name = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return “User [id=” + id + “, name=” + name + “]”;

}

}

注解解析类的实现

io.mykit.annotation.jdk.db.provider.parser包中创建一个AnnotationParser类,AnnotationParser 类是整个框架的核心,它负责解析标注在实体类上的注解,并且将对应的实体类及其字段信息映射到对应的数据表和字段上,如下所示。

package io.mykit.annotation.jdk.db.provider.parser;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import io.mykit.annotation.jdk.db.provider.Column;

import io.mykit.annotation.jdk.db.provider.Table;

/**

  • 解析自定义注解

  • @author binghe

*/

public class AnnotationParser {

/**

  • 通过注解来组装查询条件,生成查询语句

  • @param obj

  • @return

*/

public static String assembleSqlFromObj(Object obj) {

Table table = obj.getClass().getAnnotation(Table.class);

StringBuffer sbSql = new StringBuffer();

String tableName = table.value();

sbSql.append("select * from " + tableName + " where 1=1 ");

Field[] fileds = obj.getClass().getDeclaredFields();

for (Field f : fileds) {

String fieldName = f.getName();

String methodName = “get” + fieldName.substring(0, 1).toUpperCase()

  • fieldName.substring(1);

try {

Column column = f.getAnnotation(Column.class);

if (column != null) {

Method method = obj.getClass().getMethod(methodName);

Object v = method.invoke(obj);

if (v != null) {

if (v instanceof String) {

String value = v.toString().trim();

// 判断参数是不是 in 类型参数 1,2,3

if (value.contains(“,”)) {

//去掉value中的,

String sqlParams = value.replace(“,”, “”).trim();

//value中都是纯数字

if(isNum(sqlParams)){

sbSql.append(" and " + column.value() + " in (" + value + ") ");

}else{

String[] split = value.split(“,”);

//将value重置为空

value = “”;

for(int i = 0; i < split.length - 1; i++){

value += “'”+split[i]+“',”;

}

value += “'”+split[split.length - 1]+“'”;

sbSql.append(" and " + column.value() + " in (" + value + ") ");

}

} else {

if(value != null && value.length() > 0){

sbSql.append(" and " + column.value() + " like ‘%" + value + "%’ ");

}

}

} else {

sbSql.append(" and " + column.value() + “=” + v.toString() + " ");

}

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

718526932)]

[外链图片转存中…(img-sn7CGT9b-1715718526932)]

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值