一、#{}占位符
之前的增删改查操作中,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作为日志输出工具