国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

簡單模擬Mybatis通過注解查詢SQL

這篇具有很好參考價值的文章主要介紹了簡單模擬Mybatis通過注解查詢SQL。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

通過自定義注解,簡單模擬Mybatis通過注解查詢SQL。

首先,創(chuàng)建自定義注解@MyDao和@MySelect。

MyDao.java

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyDao {
    String[] value() default {};
}

MySelect.java

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MySelect {
    String[] value() default {};
}

創(chuàng)建UserDao,使用上面的自定義注解。

UserDao.java

@MyDao
public interface UserDao {

    @MySelect("select * from sys_user where id = #{id}")
    String getNameById(String id);

}

MyInterceptor.java
處理@MySelect注解的方法實現(xiàn)。

@Slf4j
@Component
public class MyInterceptor implements InvocationHandler {

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        MySelect mySelect = method.getAnnotation(MySelect.class);
        if (mySelect != null) {
            String sql = mySelect.value()[0];
            // 解析sql中的參數(shù)
            Map<String, Object> paramMap = new HashMap<>();
            Parameter[] parameters = method.getParameters();
            for (int i = 0; i < parameters.length; i++) {
                paramMap.put(parameters[i].getName(), args[i]);
            }
            // 執(zhí)行sql
            String workSql = format(sql, paramMap);
            log.info("work sql: {}", workSql);
        }
        return null;
    }


    /**
     * 替換sql中的參數(shù)
     */
    private String format(String str, Map<String, Object> paramMap) {
        if (MapUtil.isEmpty(paramMap)) {
            return str;
        }
        AtomicReference<String> text = new AtomicReference<>(str);
        paramMap.forEach((paramName, paramValue) -> {
            String value = String.valueOf(paramValue);
            if (paramValue instanceof String) {
                value = "'" + value + "'";
            }
            text.set(StringUtils.replace(text.get(), "#{" + paramName + "}", value));
        });
        return text.get();
    }
}

InterfaceDynamicRegister.java
處理@MyDao的注解的Mapper。

@Configuration
public class InterfaceDynamicRegister implements ImportBeanDefinitionRegistrar {
    private static final String BASE_PACKAGE = "com.jjh.business.mapper"; // 指定掃描的包路徑
    private static final String RESOURCE_PATTERN = "/**/*.class"; // 指定掃描的文件類型

    @SneakyThrows
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        // 掃描所有包含MyDao注解的類
        List<Class<?>> classes = new ArrayList<>();
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN;
        Resource[] resources = resolver.getResources(packageSearchPath);
        SimpleMetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory();
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
        scanner.addIncludeFilter(new AnnotationTypeFilter(MyDao.class));
        for (Resource resource : resources) {
            if (resource.isReadable()) {
                MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
                String className = metadataReader.getClassMetadata().getClassName();
                Class<?> clazz = Class.forName(className);
                classes.add(clazz);
            }
        }
        // 創(chuàng)建接口的實現(xiàn)類并注冊到spring
        for (Class<?> clazz : classes) {
            // 將代理類實例注冊到 Spring 容器中
            BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
            // 調(diào)用BeanDefinition的setInstanceSupplier方法,傳入一個Lambda表達式,該表達式返回代理對象的實例
            builder.getBeanDefinition().setInstanceSupplier(() -> {
                // CGlib代理
                // Enhancer enhancer = new Enhancer();
                // enhancer.setSuperclass(clazz);
                // enhancer.setCallback(new MyInterceptor());
                // Object proxyInstance = enhancer.create();
                // return proxyInstance;

                // JDK代理
                return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{clazz},
                        new MyInterceptor());
            });
            registry.registerBeanDefinition(clazz.getSimpleName(), builder.getBeanDefinition());
        }

    }
}

TestController.java
調(diào)用userDao,查詢數(shù)據(jù)。

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private UserDao userDao;
    
    @GetMapping("/do_sql_select")
    public Object doSqlSelect() {
        log.info("do_sql_select is do. {}", System.currentTimeMillis());
        userDao.getNameById("0001");
        return "Ok";
    }
}

pom 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

調(diào)用 http://localhost:8080/test/do_sql_select 即可執(zhí)行userDao方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-601759.html

到了這里,關(guān)于簡單模擬Mybatis通過注解查詢SQL的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MyBatis動態(tài)SQL、模糊查詢與結(jié)果映射

    MyBatis動態(tài)SQL、模糊查詢與結(jié)果映射

    目錄 前言 一、MyBatis動態(tài)SQL 1.動態(tài)SQL是什么 2.動態(tài)SQL的作用 3.常用動態(tài)SQL元素 1. where + if 元素 2. set + if 元素 3. choose + when + otherwise 元素 4. 自定義 trim 元素 ?1. 自定義 trim 元素改寫上面的 where + if 語句 2. 自定義 trim 元素改寫上面的 set + if 語句 5. foreach 元素 6.SQL片段重用 二、

    2024年02月11日
    瀏覽(45)
  • MyBatis(多表查詢,動態(tài)SQL的使用)

    MyBatis(多表查詢,動態(tài)SQL的使用)

    目錄 多表查詢 ?查詢文章詳情 查詢一個用戶底下的所有文章 動態(tài)SQL的使用 if 標(biāo)簽 trim 標(biāo)簽 ?where 標(biāo)簽 set 標(biāo)簽 foreach 標(biāo)簽 現(xiàn)在有倆張表,一張是 文章表 ,一張是 用戶表 .如下: 我們現(xiàn)在想查詢得到一張表,表里面的內(nèi)容和文章表大多一致,只是要 在文章表的基礎(chǔ)上添加用戶表中

    2024年02月10日
    瀏覽(23)
  • mybatis xml多表查詢,子查詢,連接查詢,動態(tài)sql

    mybatis xml多表查詢,子查詢,連接查詢,動態(tài)sql

    student_type 表 student 表 Student 類 一個學(xué)生只有一個年級 Type 類 一個年級有多個學(xué)生,所以用 list 下列代碼中: 1 resultMap 里面property對應(yīng)實體類屬性,column對應(yīng)數(shù)據(jù)庫字段名 2 主鍵用 id 標(biāo)簽 其他用result 3 關(guān)聯(lián)查詢(子查詢和連接查詢) 連接查詢查一次 4 一個年級多個學(xué)生,所以

    2024年01月21日
    瀏覽(18)
  • 在mybatis-plus項目中自帶要編寫sql語句,@select注解的使用

    在mybatis-plus項目中自帶要編寫sql語句,@select注解的使用

    提示:在mybatisplus中編寫sql語句有兩種方法,我重點使用@select注釋這種方法,還有一種是增加mapper.xml文件配置,這里不做講解 現(xiàn)在mybatis-plus中已經(jīng)封裝了絕大部分簡單sql,只用一部分負(fù)責(zé)sql需要自行編寫,所以用@select的方式可以減少開發(fā)量,減少項目的復(fù)雜性。 @select是myb

    2023年04月12日
    瀏覽(33)
  • MyBatis進階:掌握MyBatis動態(tài)SQL與模糊查詢、結(jié)果映射,讓你在面試中脫穎而出!!

    MyBatis進階:掌握MyBatis動態(tài)SQL與模糊查詢、結(jié)果映射,讓你在面試中脫穎而出!!

    目錄 一、引言 二、MyBatis動態(tài)SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查詢 ①使用#{字段名} ②使用${字段名} ③使用concat{\\\'%\\\',#{字段名},\\\'%\\\'} 總結(jié) 四、MyBatis結(jié)果映射 4.1.案例演示 4.1.1.resultType進行結(jié)果映射 4.1.2.resultMap進行結(jié)果映射 在當(dāng)今的軟件開發(fā)環(huán)境中,數(shù)據(jù)庫的使

    2024年02月11日
    瀏覽(21)
  • Mybatis 動態(tài)SQL條件查詢(注釋和XML方式都有)

    Mybatis 動態(tài)SQL條件查詢(注釋和XML方式都有)

    需求 : 根據(jù)用戶的輸入情況進行條件查詢 新建了一個 userInfo2Mapper 接口,然后寫下如下代碼,聲明 selectByCondition 這個方法 我們先用XML的方式實現(xiàn) 在resources 中創(chuàng)建 Userinfo2XMLMapper.xml 文件 ?將 Userinfo2XMLMapper.xml 文件中的 namespace 進行修改,改為 userInfo2Mapper 接口中的第一行 package 的

    2024年01月22日
    瀏覽(28)
  • 【MyBatis 學(xué)習(xí)三】子段不一致問題 && 多表查詢 && 動態(tài)SQL

    【MyBatis 學(xué)習(xí)三】子段不一致問題 && 多表查詢 && 動態(tài)SQL

    目錄 一、解決Java實體類屬性與數(shù)據(jù)庫表字段不一致問題 ??現(xiàn)象1:顯示字段不對應(yīng):使用ResultType查詢結(jié)果為null; ??解決辦法:字段不對應(yīng):使用ResultMap解決。 二、數(shù)據(jù)庫的多表查詢 ??方式1:使用對象user? ??方式2:直接寫具體的屬性 三、動態(tài)SQL的使用 ??1、if標(biāo)簽:單

    2024年02月15日
    瀏覽(21)
  • Springboot 封裝整活 Mybatis 動態(tài)查詢條件SQL自動組裝拼接

    Springboot 封裝整活 Mybatis 動態(tài)查詢條件SQL自動組裝拼接

    ps:最近在參與3100保衛(wèi)戰(zhàn),戰(zhàn)況很激烈,剛剛打完仗,來更新一下之前寫了一半的博客。 該篇針對日常寫查詢的時候,那些動態(tài)條件sql 做個簡單的封裝,自動生成(拋磚引玉,搞個小玩具,不喜勿噴)。 來看看我們平時寫那些查詢,基本上都要寫的一些動態(tài)sql: ? 一個字段

    2024年02月12日
    瀏覽(18)
  • 通過實現(xiàn)MyBatis的Interceptor接口在SQL頭部增加統(tǒng)一注釋

    從事運維或DBA工作的童鞋會非常熟悉在SQL前部增加注釋的操作。類似如下的SQL語句: 這種注釋雖然不會影響SQL執(zhí)行,但是會為運維和DBA工作帶來極大的便利如: 對慢查詢進行優(yōu)化時,可以通過注釋信息快速找到研發(fā)團隊及研發(fā)人員,同時研發(fā)人員也可以快速定位到對應(yīng)業(yè)務(wù)

    2024年02月03日
    瀏覽(35)
  • MyBatis案例 | 使用映射配置文件實現(xiàn)CRUD操作——動態(tài)SQL優(yōu)化條件查詢

    MyBatis案例 | 使用映射配置文件實現(xiàn)CRUD操作——動態(tài)SQL優(yōu)化條件查詢

    本專欄主要是記錄學(xué)習(xí)完JavaSE后學(xué)習(xí)JavaWeb部分的一些知識點總結(jié)以及遇到的一些問題等,如果剛開始學(xué)習(xí)Java的小伙伴可以點擊下方連接查看專欄 本專欄地址:??JavaWeb Java入門篇: ??Java基礎(chǔ)學(xué)習(xí)篇 Java進階學(xué)習(xí)篇(持續(xù)更新中):??Java進階學(xué)習(xí)篇 本系列文章會將講述有關(guān)

    2024年02月02日
    瀏覽(42)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包