1、mybatis的参数传递问题
1.1、简单类型的参数对象
<!--简单类型的参数
举个简单的例子 :传一个 int String float date
简单的说就是你只是传递过来了一个值而已
下面涉及到数据类型的时候可以写两种数据类型
1:第一种数据类型是mybatis中的数据类型
2:java中常见的数据类型
也就是说在mybatis中定义了很多种数据类型,这个数据类型和Java中的常见的数据类型是一一对应的
parameterType:传输参数的数据类型
resultType:返回数据的数据类型
-->
<!-- 如果传递的这个值过来是一个值,那么下面在接受数据的时候引用的变量的名字是可以随便写的
但是一般情况下写value
-->
<select id="getUserById" parameterType="java.lang.Integer" resultType="com.qf.ibatis.pojo.User">
select * from t_user where id=#{value}
</select>
1.2、对象类型的参数对象
<!--传递对象类型
现在有一个add的操作
parameterType:这里是可以直接传输一个用户对象的
如果传递的是一个用户对象
那么这个用户对象在后面值的引用的时候直接写这个对象的属性的名字
-->
<insert id="add" parameterType="com.qf.ibatis.pojo.User">
insert into t_user(userName,password) values(#{userName},#{password})
</insert>
1.3、map集合类型的参数对象
<!--要传递 两个键值过去-->
<!--通过用户的名字 和 密码去找到用户对象
记住这里传递map对象的时候 在引用数据的时候使用key的名字去进行引用
前面传递的时候 传递一个HashMap的对象过来就好了
-->
<select id="findUserByNameAndPassword" parameterType="map" resultType="com.qf.ibatis.pojo.User">
select * from t_user where userName=#{userName} and password=#{password}
</select>
2、mybatis中返回参数的接受问题
2.1、返回简单类型的参数
<!--返回参数的测试:
返回一个简单类型的参数
-->
<!--通过id找到用户名,不是用户对象
如果返回的是单一的值,那么直接写这个的数据类型就好了
-->
<select id="findUserNameById" parameterType="java.lang.Integer" resultType="java.lang.String">
select userName from t_user where id=#{value }
</select>
2.2、返回对象类型的参数
<!--返回一个对象-->
<select id="findUserById1" parameterType="int" resultType="com.qf.ibatis.pojo.User">
select * from t_user where id=#{value }
</select>
2.3、返回集合类型的参数
<!--测试返回来一个集合
注意:如果返回的数据是一个集合,那么后面的resultType中就写这个集合中泛型的数据类型
List<User>
-->
<select id="findUserAll" resultType="com.qf.ibatis.pojo.User">
select * from t_user
</select>
2.4、数据库的字段和本地对象不对应怎么办
2.4.1、取别名的形式来完成字段的映射
<!--接下来玩的是数据库的字段和本地对象中属性的名称不一样怎么办?
第一种方式:通过取别名的形式来实现
-->
<select id="findUserAll1" resultType="com.qf.ibatis.pojo.User1">
SELECT id AS userId,userName AS username,PASSWORD AS passwd FROM t_user
</select>
2.4.2、通过建立映射关系来完成映射
<!--接下来玩的是 数据库的字段和本地对象中属性的名称不一样怎么办?
通过映射关系来实现
-->
<!--建立一个对象属性和表字段的映射关系
申明了一种映射关系 就类似于申明了变量
这个文件中导出都是可以使用的
id名字 虽然可以随便写 但是一般情况下 就写 查询语句的id的名字ResultMap
type:一般写的是 与表对应的java对象的这个全路径
-->
<resultMap id="findUserAll1ResultMap" type="com.qf.ibatis.pojo.User1">
<!--配置主键映射
id:表示的是id映射
property:表示的是映射关系中java对象的属性的名字
column:表示的是映射关系中表字段的名字
-->
<id property="userId" column="id"></id>
<!--配置其他字段映射
result:表示的是普通属性的映射关系
-->
<result property="username" column="userName"></result>
<result property="passwd" column="password"></result>
</resultMap>
<!--
resultMap:这个使用的前提:一般情况下就是数据库的字段和java对象的属性名称不一致的时候进行映射关系的
这样一个字段
-->
<select id="findUserAll12" resultMap="findUserAll1ResultMap">
SELECT * FROM t_user
</select>
2.5、映射关系的一对一的返回
1、编写User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User1 {
private int userId;
private String username;
private String passwd;
private IdCard idCard;
}
2、编写IdCard类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class IdCard {
private int id;
private String address;
private Date startTime;
private Date endTime;
private int userId;
}
3、编写映射关系和查询的描述
<!--下面测试下一对一的返回数据的问题
下面就是咋们的 要查询id是22的这个人的个人信息 以及身份证号码
这种关联关系中只能使用 resultMap不能使用resultType
-->
<!--首先定义映射关系-->
<resultMap id="findUserInfoByIdResultMap" type="com.qf.ibatis.pojo.User1">
<!--自己的主键和自己的普通属性的映射-->
<!--配置主键映射
id:表示的是id映射
property:表示的是映射关系中java对象的属性的名字
column:表示的是映射关系中 表字段的名字
-->
<id property="userId" column="id"></id>
<!--配置其他字段映射
result:表示的是普通属性的映射关系
-->
<result property="username" column="userName"></result>
<result property="passwd" column="password"></result>
<!--在定义一对一的数据的关联映射
property:写的是用户对象中的这个IdCard这个对象的名字
javaType:写的是IdCard这个类的全路径
-->
<association property="idCard" javaType="com.qf.ibatis.pojo.IdCard">
<!--定义主键映射-->
<id property="id" column="idCardId"></id>
<!--定义普通字段的映射-->
<result property="address" column="address"></result>
<result property="userId" column="userId"></result>
</association>
</resultMap>
<select id="findUserInfoById" parameterType="int" resultMap="findUserInfoByIdResultMap">
SELECT * FROM t_user t1,t_idcard t2 WHERE t1.id=t2.userId AND t1.id=#{value }
</select>
4、测试
/**
* 测试的是一对一
* @throws IOException
*/
@Test
public void testFindUserIdCard() throws IOException {
SqlSession sqlSession = JdbcUtils.getSqlSession();
Object o = sqlSession.selectOne("UserMapper.findUserInfoById", 24);
System.out.println("查询回来的数据是:"+o);
JdbcUtils.close();
}
2.6、映射关系的一对多的返回
1、准备部门对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private int deptId;
private String deptName;
private String deptAddress;
List<Employee> employees;
}
2、准备员工对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
private int empId;
private String empName;
private int gender;
}
3、准备配置文件和映射关系
<!--接下来玩下一对多的映射关系-->
<!--首先是准备映射关系-->
<resultMap id="findDeptByDeptIdResultMap" type="com.qf.ibatis.pojo.Dept">
<!--配置主对象的主键和普通属性映射-->
<id property="deptId" column="deptId"></id>
<result property="deptName" column="deptName"></result>
<result property="deptAddress" column="deptAddress"></result>
<!--配置一对多的关联映射-->
<collection property="employees" ofType="com.qf.ibatis.pojo.Employee">
<!--配置主键映射-->
<id property="empId" column="empId"></id>
<!--配置普通属性映射-->
<result property="empName" column="empName"></result>
<result property="gender" column="gender"></result>
</collection>
</resultMap>
<select id="findDeptByDeptId" parameterType="int" resultMap="findDeptByDeptIdResultMap">
SELECT * FROM t_dept t1,t_emp t2 WHERE t1.deptId=t2.dId AND t1.deptId=#{value }
</select>
4、准备测试
/*
* 测试的是一对多
* @throws IOException
*/
@Test
public void testFindDeptByDeptId() throws IOException {
SqlSession sqlSession = JdbcUtils.getSqlSession();
Object o = sqlSession.selectOne("UserMapper.findDeptByDeptId", 1);
System.out.println("查询回来的数据是:"+o);
JdbcUtils.close();
}