Rumah > pangkalan data > tutorial mysql > Mari kita bincangkan tentang penyambungan SQL dinamik MySQL

Mari kita bincangkan tentang penyambungan SQL dinamik MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2022-12-01 17:20:35
ke hadapan
2080 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan kandungan yang berkaitan tentang penyambungan SQL dinamik Dalam pembangunan perniagaan sebenar, penyataan SQL kami biasanya disambung secara dinamik , seperti pernyataan SQL fungsi carian bersyarat, dsb. Mari kita lihat bersama-sama. Saya harap ia akan membantu semua orang.

Mari kita bincangkan tentang penyambungan SQL dinamik MySQL

Pembelajaran yang disyorkan: tutorial video mysql

1

Matlamat

    Dapat menggunakan tag mybatis untuk melaksanakan penyambungan SQL dinamik

Analisis

Dalam proses pembelajaran sebelum ini, pernyataan SQL yang kami gunakan adalah sangat mudah. Dalam pembangunan perniagaan sebenar, pernyataan SQL kami biasanya disambung secara dinamik, seperti pernyataan SQL untuk fungsi carian bersyarat.

# 提供了一个功能:用户可以在页面上根据username、sex、address进行搜索
# 用户输入的搜索条件:可以是一个条件,也可能是两个、三个

# 只输入一个条件:姓名是"王"
SELECT * FROM USER WHERE username LIKE '%王%'
# 只输入一个条件:性别是“男”
SELECT * FROM USER WHERE sex = '男'
# 输入两个条件:姓名“王”,性别“男”
SELECT * FROM USER WHERE username LIKE '%王%' AND sex = '男'
# 输入三个条件:姓名“王”,性别“男”,地址“北京”
SELECT * FROM USER WHERE username LIKE '%王%' AND sex = '男' AND address LIKE '%北京%';
Salin selepas log masuk
Dalam Mybatis, pernyataan SQL ditulis dalam fail XML konfigurasi pemetaan. Mybatis menyediakan beberapa teg XML untuk melaksanakan penyambungan SQL dinamik.

Teg yang biasa digunakan ialah:

  • : digunakan untuk penghakiman, bersamaan dengan if judgment dalam Java <if></if>
  • : biasanya digunakan bersama dengan if , digunakan untuk menggantikan <where></where>where 1=1
  • dalam pernyataan SQL: digunakan untuk melintasi koleksi dan menyambung kandungan koleksi ke dalam pernyataan SQL. Contohnya, penyambungan: <foreach></foreach>in (value1, value2, ...)
  • : digunakan untuk mentakrifkan serpihan sql untuk digunakan semula <sql></sql>

Penjelasan

1. Sediakan persekitaran Mybatis

  • Buat projek java, import pakej balang; >

    Buat antara muka pemeta UserDao

  • Buat fail konfigurasi pemetaan UserDao.xml

  • Buat fail konfigurasi global SqlMapConfig.xml

  • Buat fail konfigurasi log log4j.properties

2.

Teg: 🎜>Pengenalan sintaks<if>

Contoh penggunaan
<if test="判断条件,使用OGNL表达式进行判断">
	SQL语句内容, 如果判断为true,这里的SQL语句就会进行拼接</if>
Salin selepas log masuk
Cari pengguna berdasarkan nama dan maklumat jantina mereka. Letakkan syarat carian ke dalam objek Pengguna dan hantar ke pernyataan SQL
  • Tambah kaedah pada antara muka pemeta UserDao

  • Konfigurasikan pernyataan
package com.demo.dao;import com.demo.domain.User;import java.util.List;public interface UserDao {
    /**
     * 根据username和sex搜索用户
     * @param user 封装了搜索条件的User对象
     * @return 搜索的结果
     */
    List<User> search1(User user);}
Salin selepas log masuk
  • dalam fail pemetaan UserDao.xml untuk ujian berfungsi dan tambahkan kaedah ujian pada kelas ujian
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.dao.UserDao">

    <!--
    if标签:用于条件判断
        语法:<if test="用OGNL表达式判断"> 如果判断为true,这里的内容会拼接上去 </if>
        注意:标签里写OGNL表达式,不要再加#{}、${}
        常用的OGNL表达式:
            比较:>, <, >=, <=, ==, != 或者 gt, lt, gte, lte, eq, neq
            逻辑:&&,||,! 或者 and, or, not
            调用方法:username.length(),  list.size()
    -->
    <select id="search1" resultType="User">
        select * from user where 1=1        <if test="username != null and username.length()>0">
            and username like "%"#{username}"%"        </if>
        <if test="sex != null and sex.length()>0">
            and sex = #{sex}        </if>
    </select></mapper>
Salin selepas log masuk
3
package com.demo;import com.demo.dao.UserDao;import com.demo.domain.User;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.After;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;public class SqlTest {

    private UserDao userDao;
    private SqlSession session;
    private InputStream is;

    /**
     * 要求:根据username和sex搜索用户
     *      搜索条件放到user对象里
     */
    @Test
    public void testSearch(){
        User user = new User();
        // user.setUsername("王");
        // user.setSex("男");

        List<User> userList = userDao.search1(user);
        userList.forEach(System.out::println);
    }


    @Before
    public void init() throws IOException {
        //1. 读取全局配置文件
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2. 得到一个SqlSession对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        session = factory.openSession();
        userDao = session.getMapper(UserDao.class);
    }

    @After
    public void destroy() throws IOException {
        session.close();
        is.close();
    }}
Salin selepas log masuk
Tag

<where>Pengenalan tatabahasa

Dalam pernyataan SQL yang baru kami praktikkan, kami menulis . Jika anda tidak menulisnya, pernyataan SQL akan mempunyai ralat sintaks. Mybatis menyediakan teknologi untuk menggantikan : tag .

where 1=1where 1=1Contoh kod<where></where>

Optimumkan kod pelaksanaan dalam bab sebelumnya dan gunakan teg
bukannya

<where></where>Kaedah carian1 pemeta UserDao: sedia ada, tidak perlu mengubah suai where 1=1

  • Ubah suai pernyataan SQL dalam fail pemetaan UserDao.xml
/**
 * 根据username和sex搜索用户
 * @param user 封装了搜索条件的User对象
 * @return 搜索的结果
 */List<User> search1(User user);
Salin selepas log masuk
  • Menjalankan ujian berfungsi dalam kelas ujian: kaedah ujian tidak perlu diubah suai
<!--
    where标签:让Mybatis帮我们生成一个where关键字
        Mybatis会智能判断:
            如果一个条件都没有,就不生成where关键字
            如果有条件,会判断是否有多余的and关键字,把多余的and去掉
        注意:建议把所有的where条件都放到where标签里边
    --><select id="search1" resultType="User">
    select * from user    <where>
        <if test="username != null and username.length()>0">
            and username like "%"#{username}"%"        </if>
        <if test="sex != null and sex.length()>0">
            and sex = #{sex}        </if>
    </where></select>
Salin selepas log masuk
  • 4.
tag
@Testpublic void testSearch(){
    User user = new User();
    // user.setUsername("王");
    // user.setSex("男");

    List<User> userList = userDao.search1(user);
    userList.forEach(System.out::println);}
Salin selepas log masuk

pengenalan sintaks <foreach>

teg foreach biasanya digunakan untuk menggelungkan koleksi dan menyambung kandungan koleksi ke dalam pernyataan SQL. Sebagai contoh, kita perlu menanyakan maklumat pengguna berdasarkan berbilang ID Pernyataan SQL ialah:
Jika kita lulus dalam koleksi ID, bagaimana kita melintasi koleksi dan menyambung pernyataan SQL dalam fail pemetaan? Ini boleh dicapai menggunakan tag
.

select * from user where id = 1 or id = 2 or id = 3;select * from user where id in (1, 2, 3);
Salin selepas log masuk

foreachContoh penggunaan

<!--
foreach标签:
	属性:
		collection:被循环遍历的对象,使用OGNL表达式获取,注意不要加#{}
		open:循环之前,拼接的SQL语句的开始部分
		item:定义变量名,代表被循环遍历中每个元素,生成的变量名
		separator:分隔符
		close:循环之后,拼接SQL语句的结束部分
	标签体:
		使用#{OGNL}表达式,获取到被循环遍历对象中的每个元素
--><foreach collection="" open="id in(" item="id" separator="," close=")">
    #{id}</foreach>
Salin selepas log masuk
Terdapat kelas keadaan carian QueryVO seperti berikut:
  • Tambah kaedah dalam pemeta UserDao
package com.itheima.domain;public class QueryVO {
    private Integer[] ids;

    public Integer[] getIds() {
        return ids;
    }

    public void setIds(Integer[] ids) {
        this.ids = ids;
    }}
Salin selepas log masuk
  • Konfigurasikan pernyataan dalam fail pemetaan UserDao.xml
/**
     * QueryVO里有一个Integer[] ids
     * 要求:根据ids查询对应的用户列表
     */List<User> search2(QueryVO vo);
Salin selepas log masuk
  • Ujian Fungsian
    <!--
    foreach标签:用于循环遍历
        collection:被循环的集合/数组
        item:定义一个变量
        separator:定义拼接时的分隔符
        open:拼接字符串时的开始部分
        close:拼接字符串时的结束部分

        相当于 for(Integer id: ids){}
        select * from user where id in(41, 42, 45)
    -->
    <select id="search2" resultType="User">
        <!--select * from user where id in(41, 42, 45)-->
        select * from user where        <foreach collection="ids" open="id in(" item="id" separator="," close=")">
            #{id}        </foreach>
    </select>
Salin selepas log masuk
  • 5 dalam Dalam fail pemetaan, kami mendapati bahawa banyak serpihan SQL diulang, seperti:
. Mybatis menyediakan tag
    @Test
    public void testSearch2(){
        QueryVO vo = new QueryVO();
        vo.setIds(new Integer[]{41,42,43,44,45});
        List<User> userList = userDao.search2(vo);
        userList.forEach(System.out::println);
    }
Salin selepas log masuk
untuk mengekstrak serpihan SQL berulang dan boleh digunakan semula.

语法介绍

在映射文件中定义SQL片段:

<sql id="唯一标识">sql语句片段</sql>
Salin selepas log masuk

在映射文件中引用SQL片段:

<include refid="sql片段的id"></include>
Salin selepas log masuk
使用示例

在查询用户的SQL中,需要重复编写:select * from user。把这部分SQL提取成SQL片段以重复使用

  • 要求:QueryVO里有ids,user对象。根据条件进行搜索
  • 修改QueryVO,增加成员变量user

package com.itheima.domain;/**
 * @author liuyp
 * @date 2021/09/07
 */public class QueryVO {
    private Integer[] ids;
    private User user;

    //get/set方法……}
Salin selepas log masuk
  • 在映射器UserDao里加方法

    /**
     * 动态SQL拼接的综合应用:if、where、foreach
     * 要求:QueryVo里有ids、username、sex值,根据这些值进行搜索
     */
    List<User> search3(QueryVO vo);
Salin selepas log masuk
  • 在映射文件UserDao.xml里配置statement

<select id="search3" resultType="User">
    <!--select * from user-->
    <include refid="selUser"/>
    <where>
        <if test="ids != null and ids.length > 0">
            <foreach collection="ids" open="and id in(" item="id" separator="," close=")">
                #{id}            </foreach>
        </if>
        <!--<if test="user != null">
                <if test="user.username != null and user.username.length() > 0">
                    and username like "%"#{user.username}"%"
                </if>
                <if test="user.sex != null and user.sex.length() > 0">
                    and sex = #{user.sex}
                </if>
            </if>-->
        <include refid="userCondition"/>
    </where></select><!--
    sql标签:用于定义一个sql片段
    include标签:什么时候要引用某个SQL片段,就使用include标签
    注意:引入SQL片段之后,最终的SQL语句必须要完全符合语法
    --><sql id="selUser">select * from user</sql><sql id="userCondition">
    <if test="user != null">
        <if test="user.username != null and user.username.length() > 0">
            and username like "%"#{user.username}"%"        </if>
        <if test="user.sex != null and user.sex.length() > 0">
            and sex = #{user.sex}        </if>
    </if></sql>
Salin selepas log masuk
  • 在测试类里加测试方法

    @Test
    public void testSearch3(){
        QueryVO vo = new QueryVO();
        vo.setIds(new Integer[]{41,42,43,44,45});

        // User user = new User();
        // user.setUsername("王");
        // user.setSex("男");
        // vo.setUser(user);

        List<User> userList = userDao.search3(vo);
        userList.forEach(System.out::println);
    }
Salin selepas log masuk

推荐学习:mysql视频教程

Atas ialah kandungan terperinci Mari kita bincangkan tentang penyambungan SQL dinamik MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan