最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis如何構(gòu)建SQL語(yǔ)句

 更新時(shí)間:2023年12月07日 09:17:48   作者:金鱗踏雨  
這篇文章主要介紹了Mybatis如何構(gòu)建SQL語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SQL構(gòu)建對(duì)象介紹

我們之前通過(guò)注解開(kāi)發(fā)時(shí),相關(guān) SQL 語(yǔ)句都是自己直接拼寫(xiě)的。

一些關(guān)鍵字寫(xiě)起來(lái)比較麻煩、而且容易出錯(cuò)。

MyBatis 給我們提供了 org.apache.ibatis.jdbc.SQL 功能類(lèi),專(zhuān)門(mén)用于構(gòu)建 SQL 語(yǔ)句。

就是使用方法調(diào)用來(lái)代替之前繁瑣的SQL編寫(xiě)。 

我們來(lái)使用一下Mybatis提供的SQL功能類(lèi)

package com.itheima.sql;
import org.apache.ibatis.jdbc.SQL;
 
public class sqlTest {
    public static void main(String[] args) {
        String sql = getSql();
        System.out.println(sql);
        // 輸出
        // SELECT *
        // FROM student
    }
 
    public static String getSql() {
        String sql = new SQL() {
            {
                SELECT("*");
                FROM("student");
            }
        }.toString();
        return sql;
    }
}

我們可以查看一下SQL功能類(lèi)

package org.apache.ibatis.jdbc;
public class SQL extends AbstractSQL<SQL> {
    public SQL() {
    }
    public SQL getSelf() {
        return this;
    }
}

再查看一下它的父類(lèi)

顯然,這些大家都應(yīng)該很熟悉,都是SQL中的關(guān)鍵字,使用SQL功能類(lèi),可以降低在開(kāi)發(fā)中的出錯(cuò)率。

查詢(xún)功能的實(shí)現(xiàn)

定義功能類(lèi)并提供獲取查詢(xún)的 SQL 語(yǔ)句的方法。

@SelectProvider:生成查詢(xún)用的 SQL 語(yǔ)句注解

  • type 屬性:生成 SQL 語(yǔ)句功能類(lèi)對(duì)象
  • method 屬性:指定調(diào)用方法

ReturnSql類(lèi)

這里面創(chuàng)建SQL的功能類(lèi)

public class ReturnSql {
    // 定義方法,返回用來(lái)查詢(xún)的SQL語(yǔ)句
    public String getSelectAll() {
        return new SQL() {
            {
                SELECT("*");
                FROM("student");
            }
        }.toString();
    }
}

StudentMapper類(lèi)

public interface StudentMapper {
    // 查詢(xún)?nèi)?
    //@Select("SELECT * FROM student")
    @SelectProvider(type = ReturnSql.class, method = "getSelectAll")
    public abstract List<Student> selectAll();
};

這里的type的值就是生成 SQL 語(yǔ)句功能類(lèi)對(duì)象——ReturnSql,method的值就是功能類(lèi)中的方法

——getSelectAll

Test類(lèi)

public class Test01 {
    @Test
    public void selectAll() throws IOException {
        // 1.加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.獲取SqlSession工廠對(duì)象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.通過(guò)工廠對(duì)象獲取SqlSession對(duì)象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 4.獲取StudentMapper接口的實(shí)現(xiàn)類(lèi)對(duì)象
        // 通過(guò)StudentMapper的字節(jié)對(duì)象 來(lái)得到實(shí)現(xiàn)類(lèi)對(duì)象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 5.調(diào)用實(shí)現(xiàn)類(lèi)對(duì)象中的方法
        List<Student> list = mapper.selectAll();
        // 6.處理結(jié)果
        for (Student student : list) {
            System.out.println(student);
        }
        // 7.釋放資源
        sqlSession.close();
        is.close();
    }
}

新增、修改、刪除功能的實(shí)現(xiàn)

其實(shí)這些都是大同小異,比起之前的Mybatis框架前面的學(xué)習(xí)不值一提,只要調(diào)用函數(shù)就可以實(shí)現(xiàn)。

  • @InsertProvider:生成新增用的 SQL 語(yǔ)句注解。
  • @UpdateProvider:生成修改用的 SQL 語(yǔ)句注解。
  • @DeleteProvider:生成刪除用的 SQL 語(yǔ)句注解。

完整代碼展現(xiàn)

項(xiàng)目骨架

bean包下的Student類(lèi)

映射配置文件StudentMapper接口

我們使用注解的方式將SQL工具類(lèi)引入

public interface StudentMapper {
    // 查詢(xún)?nèi)?
    //@Select("SELECT * FROM student")
    @SelectProvider(type = ReturnSql.class, method = "getSelectAll")
    public abstract List<Student> selectAll();
 
    // 新增操作
    //@Insert("INSERT INTO student VALUES (#{id},#{name},#{age})")
    @InsertProvider(type = ReturnSql.class, method = "getInsert")
    public abstract Integer insert(Student stu);
 
    // 修改操作
    //@Update("UPDATE student SET name=#{name},age=#{age} WHERE id=#{id}")
    @UpdateProvider(type = ReturnSql.class, method = "getUpdate")
    public abstract Integer update(Student stu);
 
    // 刪除操作
    //@Delete("DELETE FROM student WHERE id=#{id}")
    @DeleteProvider(type = ReturnSql.class, method = "getDelete")
    public abstract Integer delete(Integer id);
}

sql包下的ReturnSql類(lèi)

里面編寫(xiě)了SQL功能類(lèi)

public class ReturnSql {
    // 定義方法,返回用來(lái)查詢(xún)的SQL語(yǔ)句
    public String getSelectAll() {
        return new SQL() {
            {
                SELECT("*");
                FROM("student");
            }
        }.toString();
    }
 
    public String getInsert(Student stu) {
        return new SQL() {
            {
                INSERT_INTO("student");
                INTO_VALUES("#{id},#{name},#{age}");
            }
        }.toString();
    }
 
    public String getUpdate(Student stu) {
        return new SQL() {
            {
                UPDATE("student");
                SET("name=#{name}","age=#{age}");
                WHERE("id=#{id}");
            }
        }.toString();
    }
 
    public String getDelete(Integer id) {
        return new SQL() {
            {
                DELETE_FROM("student");
                WHERE("id=#{id}");
            }
        }.toString();
    }
}

測(cè)試方法

package com.itheima.test;
 
import com.itheima.bean.Student;
import com.itheima.mapper.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
 
public class Test01 {
    @Test
    public void selectAll() throws IOException {
        // 1.加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.獲取SqlSession工廠對(duì)象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.通過(guò)工廠對(duì)象獲取SqlSession對(duì)象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 4.獲取StudentMapper接口的實(shí)現(xiàn)類(lèi)對(duì)象
        // 通過(guò)StudentMapper的字節(jié)對(duì)象 來(lái)得到實(shí)現(xiàn)類(lèi)對(duì)象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 5.調(diào)用實(shí)現(xiàn)類(lèi)對(duì)象中的方法
        List<Student> list = mapper.selectAll();
        // 6.處理結(jié)果
        for (Student student : list) {
            System.out.println(student);
        }
        // 7.釋放資源
        sqlSession.close();
        is.close();
    }
 
    @Test
    public void insert() throws IOException {
        // 1.加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.獲取SqlSession工廠對(duì)象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.通過(guò)工廠對(duì)象獲取SqlSession對(duì)象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 4.獲取StudentMapper接口的實(shí)現(xiàn)類(lèi)對(duì)象
        // 通過(guò)StudentMapper的字節(jié)對(duì)象 來(lái)得到實(shí)現(xiàn)類(lèi)對(duì)象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 5.調(diào)用實(shí)現(xiàn)類(lèi)對(duì)象中的方法
        Student stu = new Student(9,"張九",90);
        Integer result = mapper.insert(stu);
 
        // 6.處理結(jié)果
        System.out.println(result);
        // 7.釋放資源
        sqlSession.close();
        is.close();
    }
 
    @Test
    public void update() throws IOException {
        // 1.加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.獲取SqlSession工廠對(duì)象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.通過(guò)工廠對(duì)象獲取SqlSession對(duì)象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 4.獲取StudentMapper接口的實(shí)現(xiàn)類(lèi)對(duì)象
        // 通過(guò)StudentMapper的字節(jié)對(duì)象 來(lái)得到實(shí)現(xiàn)類(lèi)對(duì)象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 5.調(diào)用實(shí)現(xiàn)類(lèi)對(duì)象中的方法
        Student stu = new Student(9,"張九",1000);
        Integer result = mapper.update(stu);
 
        // 6.處理結(jié)果
        System.out.println(result);
        // 7.釋放資源
        sqlSession.close();
        is.close();
    }
 
    @Test
    public void delete() throws IOException {
        // 1.加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.獲取SqlSession工廠對(duì)象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.通過(guò)工廠對(duì)象獲取SqlSession對(duì)象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 4.獲取StudentMapper接口的實(shí)現(xiàn)類(lèi)對(duì)象
        // 通過(guò)StudentMapper的字節(jié)對(duì)象 來(lái)得到實(shí)現(xiàn)類(lèi)對(duì)象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 5.調(diào)用實(shí)現(xiàn)類(lèi)對(duì)象中的方法
        Integer result = mapper.delete(9);
 
        // 6.處理結(jié)果
        System.out.println(result);
        // 7.釋放資源
        sqlSession.close();
        is.close();
    }
}

隨便附上核心配置文件MyBatisConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<!--configuration 核心根標(biāo)簽-->
<configuration>
 
    <!-- 引入數(shù)據(jù)庫(kù)連接的配置文件 -->
    <properties resource="jdbc.properties"/>
 
    <!-- 配置log4j -->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>
 
    <!-- 使用通用的配置方式起別名 ,別名默認(rèn)是類(lèi)名 -->
    <typeAliases>
        <package name="com.itheima.bean"/>
    </typeAliases>
 
    <!--environments配置數(shù)據(jù)庫(kù)環(huán)境,環(huán)境可以有多個(gè)。default屬性指定使用的是哪個(gè)-->
    <environments default="mysql">
        <!--environment配置數(shù)據(jù)庫(kù)環(huán)境  id屬性唯一標(biāo)識(shí)-->
        <environment id="mysql">
            <!-- transactionManager事務(wù)管理。  type屬性,采用JDBC默認(rèn)的事務(wù)-->
            <transactionManager type="JDBC"/>
            <!-- dataSource數(shù)據(jù)源信息   type屬性 連接池-->
            <dataSource type="POOLED">
                <!-- property獲取數(shù)據(jù)庫(kù)連接的配置信息 -->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
 
    <!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件 resource屬性指定映射配置文件的名稱(chēng) -->
        <!-- package 的name屬性用來(lái)指定包的路徑-->
        <package name="com.itheima.mapper"/>
    </mappers>
 
</configuration>
 

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • sin(x)如何求解的java代碼實(shí)現(xiàn)方法

    sin(x)如何求解的java代碼實(shí)現(xiàn)方法

    這篇文章主要為大家介紹了sin(x)如何求解的java代碼實(shí)現(xiàn)方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Maven中生命周期深度解析與實(shí)戰(zhàn)指南

    Maven中生命周期深度解析與實(shí)戰(zhàn)指南

    這篇文章主要為大家詳細(xì)介紹了Maven 生命周期實(shí)戰(zhàn)指南,包含核心概念、階段詳解、Spring Boot 特化場(chǎng)景及企業(yè)級(jí)實(shí)踐建議,希望對(duì)大家有一定的幫助
    2025-08-08
  • 淺談從Java中的棧和堆,進(jìn)而衍生到值傳遞

    淺談從Java中的棧和堆,進(jìn)而衍生到值傳遞

    這篇文章主要介紹了淺談從Java中的棧和堆,進(jìn)而衍生到值傳遞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比

    在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比

    這篇文章主要介紹了在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比,內(nèi)容包括HashMap 的原理簡(jiǎn)單介紹、結(jié)合源碼在Java7中是如何解決hash沖突的以及優(yōu)缺點(diǎn),結(jié)合源碼以及在Java8中如何解決hash沖突,balance tree相關(guān)源碼介紹,需要的朋友可以參考借鑒。
    2017-01-01
  • java中的類(lèi)URL與URLConnection使用介紹

    java中的類(lèi)URL與URLConnection使用介紹

    這篇文章主要為大家介紹了java中的類(lèi)URL與URLConnection使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Struts2中圖片以base64方式上傳至數(shù)據(jù)庫(kù)

    Struts2中圖片以base64方式上傳至數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Struts2中圖片以base64方式上傳至數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,代碼分為前臺(tái)和后臺(tái)兩段,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • JSON反序列化Long變Integer或Double的問(wèn)題及解決

    JSON反序列化Long變Integer或Double的問(wèn)題及解決

    這篇文章主要介紹了JSON反序列化Long變Integer或Double的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    這篇文章主要介紹了從源碼的角度淺析HashMap、TreeMap元素的存儲(chǔ)和獲取元素的邏輯;從Map與Set之間的關(guān)系淺析常用的Set中元素的存儲(chǔ)和判斷是否重復(fù)的邏輯,需要的朋友可以參考下
    2017-01-01
  • idea同時(shí)打開(kāi)多個(gè)項(xiàng)目的圖文教程

    idea同時(shí)打開(kāi)多個(gè)項(xiàng)目的圖文教程

    這篇文章主要給大家介紹了idea同時(shí)打開(kāi)多個(gè)項(xiàng)目的圖文教程,文章通過(guò)圖文結(jié)合的形式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 解決異常處理問(wèn)題:getReader()?has?already?been?called?for?this

    解決異常處理問(wèn)題:getReader()?has?already?been?called?for?this

    這篇文章主要介紹了解決異常處理:getReader()?has?already?been?called?for?this問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

元阳县| 浏阳市| 青冈县| 定日县| 友谊县| 鄂托克前旗| 金山区| 德钦县| 邵阳市| 博客| 科技| 鹤峰县| 民和| 横山县| 崇义县| 丰原市| 井冈山市| 洛宁县| 漳浦县| 京山县| 宝鸡市| 嫩江县| 长岭县| 漳平市| 松原市| 察雅县| 贞丰县| 磐安县| 余江县| 庆安县| 防城港市| 冕宁县| 兰考县| 虞城县| 丹阳市| 胶州市| 墨竹工卡县| 来安县| 宣城市| 龙山县| 河北省|