当前位置: 首页 > news >正文

使用bind元素创建变量

在使用模糊查询sql时,如果使用${}进行字符拼接,无法防止sql诸如问题,如果使用concat函数则只对mysql有效果,用Oracle则需要用连接符||,这样在数据库变的时候需要修改,不利于移植。mybatis提供元素<bind>很好能解决这个问题。

项目结构:

废话不说,使用maven管理jar,如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>maven</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
   <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.2</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.40</version>
      </dependency>
  </dependencies>
</project>

mybatis配置如下:

<?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>
    <properties resource="resoures/db.properties" />
    <!--1.配置环境 ,默认的环境id为mysql -->
    <environments default="mysql">
        <!--1.2.配置id为mysql的数据库环境 -->
        <environment id="mysql">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <!--数据库连接池 -->
            <dataSource type="POOLED">
                <!-- 数据库驱动 -->
                <property name="driver" value="${jdbc.driver}" />
                <!-- 连接数据库的url -->
                <property name="url" value="${jdbc.url}" />
                <!-- 连接数据库的用户名 -->
                <property name="username" value="${jdbc.username}" />
                <!-- 连接数据库的密码 -->
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!--2.配置Mapper的位置 -->
    <mappers>
        <mapper resource="com/example/test/mybatis/mapper/UserMapper.xml" />
    </mappers>
</configuration>

数据库配置:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

PS:注意配置文件的位置!

三种方法实现:

数据库表格结构

javabean

package com.example.test.mybatis;

public class User {
    
    private String name;
    private String sex;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    }
    
}

session工具类:

package com.example.test.mybatis;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtils {
    
    private static SqlSessionFactory sqlSessionFactory = null;
    // 初始化SqlSessionFactory对象
    static {
        try {
            // 使用MyBatis提供的Resources类加载mybatis的配置文件
            Reader reader = 
                    Resources.getResourceAsReader("resoures/mybatis-config.xml");
            // 构建sqlSession的工厂
            sqlSessionFactory = 
                    new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 获取SqlSession对象的静态方法
    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }

}

mapper文件

方法一:_parameter.getName()传参,注意参数类型为javabean User

<?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.example.test.mybatis.mapper.UserMapper">

   <select id="findUserByName" parameterType="com.example.test.mybatis.User"
        resultType="com.example.test.mybatis.User">
        <!--_parameter.getUsername()也可直接写成传入的字段属性名,即username -->
        <bind name="pattern" value="'%'+_parameter.getName()+'%'" />
        select * from user
        where
        name like #{pattern}
    </select>

</mapper>

测试方式:

package com.example.test.mybatis;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

public class MybatisTest {
    public static void main(String[] args) {
        SqlSession session = MybatisUtils.getSession();
        User user = new User();
        user.setName("s");
        
        List<User> list = session.selectList("com.example.test.mybatis.mapper.UserMapper.findUserByName",user);
        for (User u : list) {
            System.out.println(u);
        }
        session.close();
    }

}

测试结果:User [name=as, sex=男, age=1]

 

方法二:直接使用_parameter传参,注意传入的参数类型是String name

<?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.example.test.mybatis.mapper.UserMapper">

    <select id="findUserByStrName" parameterType="String"
        resultType="com.example.test.mybatis.User">
        <!--_parameter.getUsername()也可直接写成传入的字段属性名,即username -->
        <bind name="username" value="'%'+_parameter+'%'" />
        select * from user
        where
        name like #{username}
    </select>
   
</mapper>

对应测试方法:

package com.example.test.mybatis;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

public class MybatisTest {
    public static void main(String[] args) {
        SqlSession session = MybatisUtils.getSession();  
        String name = "aa";  
        
        List<User> list = session.selectList("com.example.test.mybatis.mapper.UserMapper.findUserByStrName",name);
        for (User u : list) {
            System.out.println(u);
        }
        session.close();
    }

}
测试结果:

User [name=aa, sex=男, age=10]
User [name=aaad, sex=男, age=11]

 
 

方法三:直接用javabean的属性传参,注意参数类型是javabean User

<?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.example.test.mybatis.mapper.UserMapper">

   <select id="findUserByParameterName" parameterType="com.example.test.mybatis.User"
        resultType="com.example.test.mybatis.User">
        <!--_parameter.getUsername()也可直接写成传入的字段属性名,即name -->
        <bind name="username" value="'%'+name+'%'" />
        select * from user
        where
        name like #{username}
    </select>
    
</mapper>
package com.example.test.mybatis;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

public class MybatisTest {
    public static void main(String[] args) {
        SqlSession session = MybatisUtils.getSession();
        User user = new User();
        user.setName("aa");
        List<User> list = session.selectList("com.example.test.mybatis.mapper.UserMapper.findUserByParameterName",user);
        for (User u : list) {
            System.out.println(u);
        }
        session.close();
    }
    

}

测试结果:
 
  

User [name=aa, sex=男, age=10]
User [name=aaad, sex=男, age=11]

 

 

转载于:https://www.cnblogs.com/iyyy/p/8028323.html

相关文章:

  • Day1 Java编程环境和变量
  • Python中求1到20平方的两种方法
  • Go语言之讲解GOROOT、GOPATH、GOBIN
  • 评论列表显示及排序,个人中心显示
  • jQuery效果之jQuery Color animation 色彩动画扩展
  • Qt---自定义界面之QStyle
  • 再学习之Spring(面向切面编程).
  • java:解决eclipse配置Tomcat时找不到server选项
  • Qt532.QSettings_默认分隔符
  • python 高阶函数三 filter()和sorted()
  • bzoj1036[ZJOI2008]树的统计Count 树链剖分+线段树
  • 自然语言处理入门学习(一)
  • 文件和目录权限chmod 更改所有者和所属组chown umask 隐藏权限lsattr/chattr
  • 面向对象java知识汇总题
  • PAT 1023.组个最小数
  • JavaScript-如何实现克隆(clone)函数
  • [译]前端离线指南(上)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 2017-09-12 前端日报
  • CEF与代理
  • Docker 笔记(2):Dockerfile
  • HTTP请求重发
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vultr 教程目录
  • 不上全站https的网站你们就等着被恶心死吧
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 来,膜拜下android roadmap,强大的执行力
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 学习ES6 变量的解构赋值
  • 移动端唤起键盘时取消position:fixed定位
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​io --- 处理流的核心工具​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # centos7下FFmpeg环境部署记录
  • #android不同版本废弃api,新api。
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (30)数组元素和与数字和的绝对差
  • (31)对象的克隆
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (十三)Flask之特殊装饰器详解
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)关于pipe()的详细解析
  • (转)平衡树
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Micro Framework初体验
  • .Net MVC4 上传大文件,并保存表单
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调