1、#{}
1.1、概述
-
#{}
类似于原生 JDBC 编程中的PreparedStatement
所使用的?
。 -
#{}
会自动进行 Java 数据类型和数据库数据类型转换。 -
#{}
可以防止 SQL 注入。 -
#{}
既可以接受普通数据;也可以接受 POJO 属性,前提是parameterType
是 POJO,并且#{}
中的命名与 POJO 属性保持一致。 -
当一个 SQL 语句中,普通数据非 POJO,
#{}
只有一个的时候,#{}
中的命名可以任意。 -
当一个 SQL 语句中,
#{}
有多个并且parameterType
不是 POJO(此时parameterType
可以不声明)的时候,#{}
中的命名规范是:#{param1}
、#{param2}
、······、#{paramn}
或#{arg0}
、#{arg1}
、······、#{argn}
。当然,如果接口在参数上使用@Param
注解除外,使用注解的话,可以自定义。
1.2、举例
-
#{}
可以接受一个普通数据,此时#{}
中的命名任意:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Xxx {
private Integer id;
private String name;
}
public interface XxxRepo {
int deleteXxxById(Integer id);
}
<?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.yscyber.mybatis.one.repo.XxxRepo">
<delete id="deleteXxxById" parameterType="int">
DELETE FROM xxx
WHERE id=#{id}
</delete>
</mapper>
<?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="jdbc.properties"/>
<typeAliases>
<typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
</typeAliases>
<environments default="dev">
<!-- 配置数据源 -->
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
</mappers>
</configuration>
@Test
public void test7() {
try {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
xxxRepo.deleteXxxById(1);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
-
#{}
可以接受多个普通数据,未使用注解,此时#{}
中的命名有规定#{param1}
~#{paramn}
或#{arg0}
~#{argn}
:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Xxx {
private Integer id;
private String name;
}
public interface XxxRepo {
int insertXxx(Integer id, 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.yscyber.mybatis.one.repo.XxxRepo">
<insert id="insertXxx">
INSERT INTO xxx(id, name)
VALUES (#{param1}, #{param2})
</insert>
</mapper>
<?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="jdbc.properties"/>
<typeAliases>
<typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
</typeAliases>
<environments default="dev">
<!-- 配置数据源 -->
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
</mappers>
</configuration>
@Test
public void test7() {
try {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
xxxRepo.insertXxx(1, "555");
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
-
#{}
可以接受多个普通数据,使用注解,此时#{}
中的命名可以自定义:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Xxx {
private Integer id;
private String name;
}
import org.apache.ibatis.annotations.Param;
public interface XxxRepo {
int insertXxx(@Param(value = "id") Integer id, @Param(value = "name") 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.yscyber.mybatis.one.repo.XxxRepo">
<insert id="insertXxx">
INSERT INTO xxx(id, name)
VALUES (#{id}, #{name})
</insert>
</mapper>
<?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="jdbc.properties"/>
<typeAliases>
<typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
</typeAliases>
<environments default="dev">
<!-- 配置数据源 -->
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
</mappers>
</configuration>
@Test
public void test7() {
try {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
xxxRepo.insertXxx(1, "555");
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
-
#{}
可以接受 POJO 属性数据,#{}
中的命名与 POJO 中的属性一致:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Xxx {
private Integer id;
private String name;
}
import com.yscyber.mybatis.one.Xxx;
public interface XxxRepo {
int insertXxx(Xxx xxx);
}
<?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.yscyber.mybatis.one.repo.XxxRepo">
<insert id="insertXxx" parameterType="Xxx">
INSERT INTO xxx(id, name)
VALUES (#{id}, #{name})
</insert>
</mapper>
<?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="jdbc.properties"/>
<typeAliases>
<typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
</typeAliases>
<environments default="dev">
<!-- 配置数据源 -->
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper class="com.yscyber.mybatis.one.repo.XxxRepo"/>
</mappers>
</configuration>
@Test
public void test7() {
try {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);
xxxRepo.insertXxx(new Xxx(4, "666"));
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2、${}
2.1、概述
-
相对于
#{}
,${}
基本上很少使用,因为${}
是原样拼接,不会进行数据类型的转换,所以会有 SQL 注入的问题。 -
${}
可以接收简单数据或 POJO 属性值。POJO 的前提仍是parameterType
是 POJO,并且${}
中的命名与 POJO 属性保持一致。 -
当一个 SQL 语句中,普通数据非 POJO,
${}
只有一个的时候,${}
中的命名必须是${value}
。
3、多条件查询
- 多条件查询的核心就是在映射配置文件中正确使用
#{}
,因 SQL 注入的风险基本上不会去使用${}
。
网友评论