码迷,mamicode.com
首页 > 其他好文 > 详细

02-Mybatis之查询

时间:2020-12-25 12:15:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:com   lis   字符串拼接   from   jdb   需要   The   key值   定位   

Mybatis之查询

parameterType属性

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注入问题

当我们的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‘,必定能登录成功

sql注入案例

@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);

1.查询结果为泛型值的List:

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());
}

2.查询结果返回一个Obejct

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);

3.查询结果返回一个Map,其中key值是selectMap的最后一个参数,value为resultType的指定的返回的对象

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.多参查询

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");

02-Mybatis之查询

标签:com   lis   字符串拼接   from   jdb   需要   The   key值   定位   

原文地址:https://www.cnblogs.com/whether/p/14165125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!