MyBatis-理解参数

MyBatis打印日志:
在主配置文件中添加:

<settings>  
       <setting name="logImpl" value="STDOUT_LOGGING" />  
  </settings>

理解参数

1. parameterType:

指定dao接口形参的类型
这个属性的值可以使用java类型的全限定名称或者mybatis定义的别名
mybatis通过反射机制可以获取dao接口方法参数的类型,可以不写

<select id="findUser" parameterType="integer" resultType="com.hz.domain.User">
        select * from user where id = #{id}
</select>
2. 一个简单参数

Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),mapper文件获取这个参数用占位符 #{ 任意字符 },和参数名无关。
接口方法:

Student selectById(int id);

mapper 文件:

<select id="selectById" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student where id=#{studentId}
</select>

#{studentId} , studentId 是自定义的变量名称,和方法参数名无关。
测试方法:

@Test
public void testSelectById(){
 //一个参数
 Student student = studentDao.selectById(1005);
 System.out.println("查询 id 是 1005 的学生:"+student);
}
3. 多个参数-使用@Param

当 Dao 接口方法多个参数,需要通过名称使用参数。 在方法形参前面加
入@Param(“自定义参数名”),mapper 文件使用#{自定义参数名}。
接口方法:

List<Student> selectMultiParam(@Param("personName") String name,
 @Param("personAge") int age);

mapper 文件:

<select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student where name=#{personName} or age=#{personAge}
</select>

测试方法:

@Test
public void testSelectMultiParam(){
 List<Student> stuList = studentDao.selectMultiParam("李力",20);
 stuList.forEach( stu -> System.out.println(stu));
}
4. Dao形参使用一个对象

使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。
dao接口中的方法定义:

/*
 * 一个java对象作为参数( 对象由属性, 每个属性有set,get方法)
 */
List<Student> selectByObject(Student student);

List<Student> selectByQueryParam(QueryParam param);

mapper文件

<!--
   一个java对象作为方法的参数,使用对象的属性作为参数值使用
   简单的语法: #{属性名} , mybatis调用此属性的getXXX()方法获取属性值
-->
<select id="selectByObject" resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where name=#{name} or age=#{age}
</select>

<select id="selectByQueryParam" resultType="com.bjpowernode.domain.Student">
     select id,name,email,age from student where name=#{p1} or age=#{p2}
</select>

<!--负责的语法格式: #{属性名,javaType=java类型的全限定名称,jdbcType=mybatis中定义列的数据类型}-->
<select id="selectByObject" resultType="com.bjpowernode.domain.Student">
        select id,name,email,age from student where
        name=#{name,javaType=java.lang.String,jdbcType=VARCHAR}
        or
        age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>
5#和$的区别

#占位符
语法: #{字符}
mybatis处理#{} 使用jdbc对象是 PrepareStatment对象

<select id="selectById"  parameterType="integer"
             resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where id=#{studentId}
</select>

mybatis出创建PrepareStatement对象,执行sql语句
String sql=" select id,name,email,age from student where id=?";
PrepareStatement pst = conn.prepareStatement(sql);
pst.setInt(1,1001);  //传递参数
ResultSet rs  = pst.executeQuery(); //执行sql语句

#{}特点:

1)使用的PrepareStatement对象,执行sql语句,效率高。

2)使用的PrepareStatement对象,能避免sql语句, sql语句执行更安全。

3) #{} 常常作为 列值使用的, 位于等号的右侧, #{}位置的值和数据类型有关的。

$ 占位符
语法 : 字 符 m y b a t i s 执 行 {字符} mybatis执行 mybatis{}占位符的sql语句

<select id="selectById"  parameterType="integer"
             resultType="com.bjpowernode.domain.Student">
    select id,name,email,age from student where id=${studentId}
</select>	
${} 表示字符串连接, 把sql语句的其他内容和 ${}内容使用 字符串(+) 连接的方式连在一起
String sql="select id,name,email,age from student where id=" + "1001";
mybatis创建Statement对象, 执行sql语句。
Statement stmt  = conn.createStatement(sql);
ResultSet rs  = stmt.executeQuery();

${} 的特点

1)使用Statement对象,执行sql语句,效率低

2)${}占位符的值,使用的字符串连接方式, 有sql注入的风险。 有代码安全的问题

3) ${} 数据是原样使用的, 不会区分数据类型。

4)${} 常用作 表名或者列名, 在能保证数据安全的情况下使用 ${}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值