mybatis的#占位符

一、#{}占位符

之前的增删改查操作中,SQL语句中的值是写死在SQL中,而在实际开发中,此处的值往往是用户提交过来的值,因此这里我们需要将SQL中写死的值替换为占位符。
#{}占位符:相当于JDBC的问号,是为SQL中的值进行占位的,将来我们的值传到sql中,由占位符替换,那么我们的sql的灵活性就会变得极高

package com.weq.placeholder;

import com.weq.pojo.Emp;
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.InputStream;

/*
 * 查询emp表中的所有的员工信息
 * */
public class TestmyBatisplaceholder01 {
    /*
     * 由于前三步太繁琐,可以提取出来,保证单元测试方法时,可以自动执行这三步即可
     * session对象需要全局使用,所以声明为全局变量
     * */
    private static SqlSession session = null;

    static {
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            session = factory.openSession(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void findById() {
        int id = 7;
        Emp o = session.selectOne("EmpMapper.findById", id);
        System.out.println(o);
    }

    @Test
    public void insert() {
        /*String name = "成龙";
        String job = "明星";
        Double salary = 2000000.0;*/
//        由于多个参数,方法不能直接接收,所以可以将多个参数封装到map集合中
//        HashMap<String, Object> map = new HashMap<>();
        /*map.put("red", name);
        map.put("yellow", job);
        map.put("green", salary);*/
        /*map.put("name","安妮");
        map.put("job","教师");
        map.put("salary","100000.0");*/
//        也可以使用实体类传值
        Emp emp = new Emp();
        emp.setName("蒙哥马利");
        emp.setJob("作家");
        emp.setSalary(200000000.0);
//        int rows = session.update("EmpMapper.insertemp", map);
        int rows = session.update("EmpMapper.insertemp", emp);
        System.out.println("新增了" + rows + "条");
    }
//根据指定的id,修改指定的信息
    @Test
    public void update(){
        Emp emp = new Emp();
        emp.setName("毛姆");
        emp.setJob("作家");
        emp.setSalary(2800000.0);
        emp.setId(10);
        int rows = session.update("EmpMapper.updateEmp", emp);
        System.out.println("新增了" + rows + "条");
    }
}


mapper文件配置:

<!--每个#占位符,都有名字,如果sql中只有一个占位符时,名字可以随意起-->
        select * from emp where id=#{id}
    </select>
    <update id="insertemp">
        <!--如果sql中有多个占位符,必须要给占位符起不同的名字
        1)可以任意起名字:
           传参时,只能使用map集合传,并且map的key值要和占位符名字相同
         2)起和列名相同的名字:推荐的方式
           传参时,可以使用map集合,key只需要和列明相同即可
           也可以用Emp实体类传递值,底层在接收参数时,会自动根据占位符的名字调用对应的get方法,取值,放入对应的占位符处
         -->
<!--    insert into emp values (null,#{red},#{yellow},#{green}) -->
        insert into emp values (null,#{name},#{job},#{salary})
    </update>
    <update id="updateEmp">
        update emp set name=#{name},job=#{job},salary=#{salary} where id=#{id};
    </update>

二、${}占位符

#{}出于安全考虑,会将传递过来的值,进行转译处理
例如:查询指定name的员工名称
select * from emp where name=#{name}select * from emp where name=?
加入传递的值是老安select * from emp where name=’老安’
可以看出,底层会对传来的值自动加上一对单引号
假如此次传递的值不是参数值,而是SQL语句本身
例如想要动态传递查询的列
select #{cols} from emp;
传入id,name select ‘id,name’ from emp;
如果遇到了这种不需要转译的参数,可以使用${}

package com.weq.placeholder;

import com.weq.pojo.Emp;
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.InputStream;
import java.util.HashMap;
import java.util.List;

/*
 * 查询emp表中的所有的员工信息
 * */
public class TestmyBatisplaceholder02 {
    /*
     * 由于前三步太繁琐,可以提取出来,保证单元测试方法时,可以自动执行这三步即可
     * session对象需要全局使用,所以声明为全局变量
     * */
    private static SqlSession session = null;

    static {
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            session = factory.openSession(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void select(){
        String cols="name,job";
// 如果sql中是$占位符,那么只能用map集合传递值,其中key值和占位符的名字相同
        HashMap<String, Object> map = new HashMap<>();
        map.put("cols",cols);
//        List<Emp> list = session.selectList("EmpMapper.selectbycols", cols);
        List<Emp> list = session.selectList("EmpMapper.selectbycols", map);
        for(Emp emp: list){
            System.out.println(emp);
        }
    }

    @Test
    public void selectName(){
        String name="%王%";
        List<Emp> list = session.selectList("EmpMapper.selectbyname", name);
        for(Emp emp: list){
            System.out.println(emp);
        }
    }

    @Test
    public void selectName1(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","王");
        List<Emp> list = session.selectList("EmpMapper.selectbyname1", map);
        for(Emp emp: list){
            System.out.println(emp);
        }
    }
}

mapper文件:

<select id="selectbycols" resultType="com.weq.pojo.Emp">
        select ${cols} from emp;
    </select>
    <select id="selectbyname" resultType="com.weq.pojo.Emp">
        select * from emp where name like #{name}
    </select>
    <select id="selectbyname1" resultType="com.weq.pojo.Emp">
        select * from emp where name like '%${name}%'
    </select>

三、加入log4j日志框架

log for java 专门为java研发的日志框架
pom中已经加入了log4j的依赖,所以我们直接就能用

在src/main/resources中加入log4j.properties配置文件,其中内容如下:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 

mybatis默认是使用log4j作为日志输出工具

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值