标签:com lis 字符串拼接 from jdb 需要 The key值 定位
1. 在Mapper.xml中<select><delete>等标签的parameterType可以控制传入参数的类型
2. SqlSession的selectList()和selectOne()的第二个参数和selectMap()的第三个参数都表示方法的参数
示例:
mapper.xml:
<select id="selectById" resultType="com.whether.pojo.User" parameterType="int">
select * from user where id=#{0}
</select>
java:(查询id为4的User)
User user = session.selectOne("com.whether.mapper.UserMapper.selectById",4);
System.out.println(user);
3. 在XxxMapper.xml中可以通过#{}获取参数
3.1 获取参数使用索引,从0开始,#{0}表示第一个参数
3.2 也可以使用#{param1}表示第一个参数
3.3 如果参数是对象#{属性名}(#{username})
3.4 如果参数是map写成#{key}
4. 在XxxMapper.xml中也可以通过${}获取参数
4.1 ${}与#{}区别在于${}使用字符串拼接(基于JDBC中的Statement),而#{}是预编译处理(基于JDBC中的PreparedStatement)
4.2 SELECT * FROM user where id=${param1}相当于 sql="SELECT * FROM user WHERE id=‘"+id+"‘"
注意这里是将SELECT * FROM user WHERE id=‘与id以及‘进行拼接,注意这里的两个‘‘,同时这里可能出现sql注入问题
4.3 SELECT * FROM user where id=#{param1}相当于 sql="SELECT * FROM user WHERE id=?"
5. 如果希望传递多个参数,使用对象或者map
!!!注意:查询流程是先执行java部分代码,进行传参,再调用mapper.xml中的方法,如果需要拿参数,就通过#{0}获取参数,同时也可以在java代码中传参但mapper.xml中不使用参数
当我们的sql语句需要传入参数时
比如登录语句中使用的:select * from user where username=#{username} AND password=#{password}
使用#{}获取参数相当于JDBC中sql="SELECT * FROM user WHERE username=? AND password=?",然后再使用PreparedStatement类获取预编译SQL,最后再进行传参,结果会执行SELECT * FROM user WHERE username=username and password=password
而使用${}获取参数相当于JDBC中sql="SELECT * FROM user WHERE username=‘"+username+"‘ AND password=‘"+password+"‘ "(字符串拼接,这里是将SELECT * FROM user WHERE username=‘与username以及‘进行拼接...,注意这里的两个‘ ‘),然后再使用Statement对象对SQL语句执行,最终会执行SELECT * FROM user WHERE username=‘username‘ AND password=‘password‘
注意这里可能会出现sql注入的问题,比如我密码为1‘ or ‘1‘=‘1,这条语句最后会执行SELECT * FROM user WHERE username=‘username‘ AND password=‘1‘ or ‘1‘=‘1‘,必定能登录成功
@Select("SELECT * FROM user WHERE username=‘${username}‘ AND password=‘${password}‘ LIMIT 1")
User findByUserNameAndPassword(@Param("username") String username,@Param("password") String password);
//测试
User user = userMapper.findByUserNameAndPassword("root","1‘ or ‘1‘=‘1");
System.out.println(user);
session.selectList("方法")
例:
mapper.xml:
<select id="selectAll" resultType="com.whether.pojo.User" >
select * from user
</select>
java:(查询所有User)
List<User> list = session.selectList("com.whether.mapper.UserMapper.selectAll");
for(User user : list){
System.out.println(user.toString());
}
session.selectOne("方法")
例:
mapper.xml:
<select id="selectById" resultType="com.whether.pojo.User" parameterType="int">
select * from user where id=#{0}
</select>
java:(查询id为4的User)
User user = session.selectOne("com.whether.mapper.UserMapper.selectById",4);
System.out.println(user);
session.selectMap("com.whether.mapper.UserMapper.selectMap","username");
例:
mapper.xml:
<select id="selectMap" resultType="com.whether.pojo.User" >
select * from user
</select>
java:
Map<Object,Object> map = session.selectMap("com.whether.mapper.UserMapper.selectMap","username");
System.out.println(map);
结果:(形式:username=User.toString())
{ceshi=User{id=4, username=‘ceshi‘, password=‘123‘},
lisi=User{id=2, username=‘lisi‘, password=‘123‘},
1=User{id=3, username=‘1‘, password=‘1‘},
test2=User{id=6, username=‘test2‘, password=‘123‘},
赵三=User{id=7, username=‘赵三‘, password=‘123‘}}
4.1 在mybatis.xml中<mapper>下使用<package>
package作用:<!--将包内的映射器!接口!实现全部注册为映射器 -->
注意:<package name="com.whether.mapper"/>和
<mapper resource="com/whether/mapper/UserMapper.xml"/>的区别
package主要是作用于接口和mapper class类似,是它的简写,而mapper resource是为了定位xml文件
<package name="com.whether.mapper(包路径)"/>
4.2 在com.whether.mapper下新建接口
public interface UserMapper {
List<User> selectAll();
User selectByNamePwd(String username,String password);
}
4.3 在com.wehther.mapper下新建一个UserMapper.xml(注意,mapper的名字需要和接口名一样)
4.3.1 namespace必须和接口的全限定路径(包名+类名)一致
4.3.2 id的值必须和接口中的方法名相同
4.3.3 如果接口中方法为多个参数,可以省略parameterType,且使用参数时使用arg0、arg1/param1、param2获取参数
<mapper namespace="com.whether.mapper.UserMapper">
<select id="selectAll" resultType="User" >
select * from user
</select>
<select id="selectByNamePwd" resultType="User">
select * from user where username=#{arg0} and password=#{arg1}
</select>
</mapper>
4.4 可以使用注释的方式
注意:使用注释实际上就是把参数转化为map,其中@Param("key")参数的内容就是map中的value
方法一:
mapper.java:
User selectByNamePwd(@Param("username") String username111,@Param("password")String password111);
mapper.xml:
<select id="selectByNamePwd" resultType="User">
select * from user where username=#{username} and password=#{password}
</select>
方法二:
@Select("select * from user where username=#{username} and password=#{password}")
User selectByNamePwd(@Param("username") String username,@Param("password")String password);
4.5 调用
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectByNamePwd("lisi","123");
标签:com lis 字符串拼接 from jdb 需要 The key值 定位
原文地址:https://www.cnblogs.com/whether/p/14165125.html