1.mybatis里面参数绑定@Param
User findUserByUsernameAndPwd(@Param("name")String username,@param("pwd")String password);
将指定的形式参数绑定在当前注解中给定值中
查询的时候
映射文件
select 字段列表 from 表名 where username = #{name} and password = #{pwd}
2.接口中方法中有多个参数,映射文件如何写?
User findUserByUsernameAndPwd(String username,String password);
映射文件
这样肯定不行,针对单个参数 指定 parameterType
<select id ="findUserByUsernameAndPwd" parameterType="String"
resultType = "user">
select * from user where username = #{username} and password= #{password}
</select>
多个参数?
User findUserByUsernameAndPwd(String username,String password);
<!--方式1-->
<select id ="findUserByUsernameAndPwd" resultMap = "引入定义resultMap的id标识">
select * from user where username = #{0} and password= #{1}
</select>
<!--方式2: 直接传参Map-->
User findUserByUsernameAndPwd(Map map);
<select id ="findUserByUsernameAndPwd" resultMap = "引入定义resultMap的id标识">
select * from user where username = #{username} and password= #{password}
</select>
测试.,,创建Map集合 put("username","xxx") ;
put("password","xxxx") ;
<!--方式3: 将形式参数的多个值 封装VO实体-->
参数:String username ,String password,String gender,String age ...
UserVo 实体
String username ,String password,String gender,String age:私有化/set/get方法
User findUserByUser(UserVo vo);
<select id ="findUserByUser" parameterType="uservo" resultMap = "引入定义resultMap的id标识">
select * from user where username = #{username} and password= #{password}
</select>
推荐:Map或者参数绑定@Param(注解方式)
3.高级数映射ResultMap
应用场景:
1)当实体类的属性名称和表中的字段不对应的情况,使用ReultMap 一一映射
<resultMap id="myMap" type="student">
<!--配置主键字段: 表中主键字段 id 和 实体类的属性 id一致
property:实体类的属性名称 stuId
column:表中字段列的名称 主键id
-->
<id property="stuId" column="id"></id>
<!--普通字段和实体类的其他属性名称一一对应-->
<result property="stuName" column="name"></result>
<result property="stuAge" column="age"></result>
<result property="stuAddress" column="address"></result>
<result property="stuBirthday" column="birthday"></result>
</resultMap>
2)场景2:
//账户实体类
@Data
@NoArgsConstructor //无参构造方法
public class Account {
/**
* ID` INT NOT NULL COMMENT '编号',
* `UID` INT DEFAULT NULL COMMENT '用户编号',
* `MONEY` DOUBLE DEFAULT NULL COMMENT '金额',
*/
private Integer id ; //账户编号
private Integer uid ;//用户
private Double money ; //金额
/*应该要体现出面向对象的方式*/
//一个账户里面包含某一个用户的信息
//体现出用户实体
private User user ;
@Override
public String toString() {
return "Account{" +
"id=" + id +
", uid=" + uid +
", money=" + money;
}
}
2)配置一对多,多对多等等,一对一(很少用:一个人和身份证关系...)
开发中,一对多,多对多...
查询所有账户的时候,应该将账户所属的用户查出来,从账户的维度去看,一对一
<!--定义resultMap-->
<resultMap id="accountMap" type="account">
<!--查询的时候账户id指定别名,字段 aid-->
<id property="id" column="aid"></id>
<!--普通字段-->
<result property="uid" column="UID"></result>
<result property="money" column="MONEY"></result>
<!--mybatis方式 :配置一对一的映射关系 assocation
property:账户表中的包含的用户的实体类的属性
column:查询的时候,账户uid和用户的id 关系 列的字段
javaType:查询出来的数据类型:通过用户的主键id查询用户实体
-->
<association property="user" column="uid" javaType="user">
<!--配置查询出的用户实体类他和表中的字段要一一对应-->
<!--配置一对一主键字段-->
<id property="id" column="id"></id>
<!--其他普通字段-->
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="address" column="address"></result>
</association>
</resultMap>
<!--查询所有账户信息-->
<select id="findAll" resultMap="accountMap">
SELECT
a.`ID` aid ,
a.`UID`,
a.`MONEY`,
u.*
FROM account a , USER u
<where>
a.`UID` = u.`id`
</where>
</select>
通过id查询用户---在查询所有账户的时候,将账户从属于的某个用户查询出来
//UserMapper接口
/**
* 要通过id查询用户
* @param id
* @return
*/
User findUserById(Integer id) ;
//UserMapper.xml
<!--通过用户id查询用户实体
User findUserById(Integer id) ;
-->
<select id="findUserById" parameterType="java.lang.Integer"
resultType="user">
<include refid="userSelectSql"/>
<where>
<if test="id !=null">
id = #{id}
</if>
</where>
</select>