目录
准备介绍
表以及实体类
前面我们讲过了,我们创建了t_user表,并创建了对应的实体类User
package com.aoshen.beans;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author summer
* @date 2022-04-04 19:56
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String sex;
private String email;
}
log4j日志
我们加入log4j的日志,再Maven项目的resources下建立log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
在pom文件中加入依赖
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
参数传递的5种方式
方式一:单个字面量类型的参数
比如,我们需要根据用户名来查询用户信息
①在mapper接口中加入方法
User getUserByUserName(String uername);
②在mapper.xml文件中实现方法
③测试
说明:
方式二:多个字面量类型的参数
比如,我们根据用户名以及密码来进行验证登录
① 在mapper中定义方法
User getByNameAndPwd(String username,String password);
②在xml文件中实现方法
③测试
方式三:Map集合类型的参数
通过方式2我们可以看出,其实Mybatis是将参数给我们封装成了map集合,而且集合的键只能是arg[0-n]或者是param[0-n].那么我们当然也可以自己封装map集合来自定义我们自己的键了。因此我们可以将上述方法改写一下为下面的格式
①mapper接口中改写方法
User getByNameAndPwd2(Map<String,Object> map);
②xml中实现
③测试方法
方式四:实体类类型的参数
很多时候我们在开发中不会说是仅仅是一个参数,更多情况下是以一个对象来进行封装参数。
比如,我们前端提交数据,需要插入一条用户信息
①mapper接口中定义方法
int insertUser(User user);
②xml文件
③测试
方式五:命名参数
通过方式一和方式二我们知道,当我们写在方法中写 参数的时候,在xml中的参数是不确定的。
比如方式一,我们在xml中的#里面的参数可以使任意的值,而方式二中的# 里面的值必须是arg或者param。那么我们能否统统一一下我们的参数值呢?答案是肯定的,这就需要我们用到我们而明明参数了。
比如,方式一的那个方法
User getUserByUserName(String uername);我们改写成如下
User getUserByUserName(@Param("username") String uername);
那么xml中#里面的参数就只能为 username了,不能随意了
方式二中的方法
User getByNameAndPwd(String username,String password);
我们改写成
User getByNameAndPwd(@Param("username") String username,@Param("password") String password);
那么xml里的# 里面的值就得是usrname和password了,有人可能会问还能是位arg或者param吗?这里可以说的是,依然可以使用param,但是既然通过@param来定义了最好是用自己定义的,要不我们定义它的意义是什么呢。
总结
建议分成两种情况进行处理
1. 实体类类型的参数
2. 使用@Param标识参数
写在最后
其实,xml文件中的#可以用$来替代。那么两者有何不同呢?
以下面这个方法为例,当我们使用#的时候,
sql语句的输出是这样的,用到的是占位符
当我们改成$的时候
sql语句是这样的且会报错
我们知道字符串类型的话需要在sql中写上引号,因此xml中应该这样写。
此时sql语句是这样的
注意注意${}需要手动加单引号,而且这个与之前jdbc的占位符以及直接写死参数值类似,而且$会出现sql注入哦。