1、Mybatis的模糊查询
UserDao接口
//模糊查询
public List<User> findUserByName(String username);
MyBatisTest.java 文件
//模糊查询
@Test
public void testFindUserByName(){
String resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sessionFactory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.findUserByName("张");
for (User user : userList) {
System.out.println(user);
}
//关流
sqlSession.close();
inputStream.close();
}
UserDao.xml配置文件
<!--模糊查询-->
<select id="findUserByName" parameterType="string" resultType="com.by.pogo.User">
<!-- select * from user where username like concat('%',#{username},'%') -->
select * from user where username like '%${value}%'<!--${}括号中只能是value-->
</select>
模糊查询有两种方法,一种使用concat()方法拼接,一种是使用'%${value}%'
2、#{}和${}区别
底层 jdbc类型转换(自动加’) sql注入 单个简单类型参数
#{} preparedStatement 转换 防止 任意
${} S tatement 不转换 不防止 value
建议除模糊查询外,尽量不适用${}
-
#{}符
-
#{}表示一个占位符号 通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换
-
#{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类 型值,#{}括号中可以是 value 或其它名称。
-
#{}可以有效防止 sql 注入。
-
-
${}符
-
${}表示拼接 sql 串 通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换
-
${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value
-
3、sql注入
MyBatisTest.java 文件
//sql注入
@Test
public void testLogin(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User userInfo = new User();
userInfo.setUsername("张三丰' #");
userInfo.setPassword("123");
User user = userDao.login(userInfo);
System.out.println(user);
}
UserDao 接口
//sql注入
public User login(User user);
UserDao.xml 文件
<!--sql注入-->
<select id="login" parameterType="com.by.pogo.User" resultType="com.by.pogo.User">
select * from user where username = '${username}' and password = '${password}'
</select>
相当于数据库执行了下面语句sql语句 ,使用“#”号忽略掉了密码字段,查询到用户信息