${}:insert into emp values(null, admin, 23, 男)
Statement:必须使用字符串拼接参数的方式操作SQL,一定要注意单引号问题
#{}:insert into emp values(null, ?, ?, ?)
PreparedStatement:可以使用通配符操作SQL,因为在String赋值时,可以自动加单引号,因为不需要注意单引号的使用问题
使用建议:建议使用#{},在特殊情况下,需要使用${},例如模糊查询和批量删除
不同的参数类型,${}和#{}的不同取值方式:
1、当传输参数为单个String或基本数据类型和其他包装类
#{}:可以以任意的名字获取参数值
: 只 能 以 {}:只能以 :只能以{value} 或 ${_parameter}获取
2、当传输参数都为JavaBean时
#{}和 都 可 以 通 过 属 性 名 直 接 获 取 属 性 值 , 但 是 要 注 意 {}都可以通过属性名直接获取属性值,但是要注意 都可以通过属性名直接获取属性值,但是要注意{}的单引号问题
3、当传输多个参数时,mybatis会默认将这些参数放在map集合中
两种方式:
(1)键:#{0}、#{1}; #{param1}、#{param2}
(2)键为param1,param2,param3…paramN, 以参数为值
#{}: #{0}、#{1} ;#{param1}、#{param2}
${}: p a r a m 1 、 {param1}、 param1、{param2},但是要注意${}的单引号问题
4、当传输Map参数时
#{}和 都 可 以 通 过 键 的 名 字 直 接 获 取 , 但 是 要 注 意 {}都可以通过键的名字直接获取,但是要注意 都可以通过键的名字直接获取,但是要注意{}的单引号问题
5、命名参数
可以通过@Param(“key”) 为map集合指定键的名字
Emp getEmpByEidAndEnameByParam(@Param(“eid”) String eid, @Param(“ename”) String ename);
#{} 和 都 可 以 通 过 键 的 名 字 直 接 获 取 , 但 是 要 注 意 {} 都可以通过键的名字直接获取,但是要注意 都可以通过键的名字直接获取,但是要注意{} 的单引号问题
6、当传输参数为List或Array, myBatiws会将List或Array放在map中
List以list为键, Array以array为键
原生写法:
public class TestJDBC {
public static void main(String[] args) throws Exception {
// forName加载并初始化这个类 加载dirvie驱动
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssm", "root", "root");
// 第一种 #{}
PreparedStatement ps = conn.prepareStatement("insert into emp values(null, ?, ?, ?)", 1);
ps.setString(1, "root");
ps.setString(2, "23");
ps.setString(3, "男");
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
// 指针指向下一个
if(rs.next()) {
int key = rs.getInt(1);
System.out.println(key);
};
// 第二种 ${}
Statement statement = conn.createStatement();
Emp emp = new Emp(null, "a", 1, "b");
statement.executeUpdate("insert into emp values(null, '" + emp.getEname() + "' , " + emp.getAge() + ", '" + emp.getSex() + "')");
}
}