MyBatis 学习三

输入参数:parameterType

1、类型为 简单类型(8个基本类型+String)

#{}(防止SQL注入) ${} 不防止
#{任意值}会自动给字符串加上' ' ${value} 其中的标识符必须时value

${value} 原样输出 适合于动态排序 (动态字段)

动态排序:根据传入的参数进行排序 学号


${value}

<select id="queryStudentOrderByColumn" parameterType="string" resultType="student">
	select stuno,stuname,stuage from student order by ${value} desc
</select>

 #{任意值,但是不要随便乱写,见名知意}

<select id="queryStudentOrderByColumn" parameterType="string" resultType="student">
	select stuno,stuname,stuage from student order by #{value} desc;
</select>

#{value}:mybatis在解析是会将这个解析为 'xxx',${} 原样输出:传什么返回什么

2、对象类型

#{属性名}、${属性名}

模糊查询:根据年龄或者学号查询学生

  • 方式一
<select id="queryStudentOrderBystuAgeOrstuName" parameterType="student" resultType="student">
	select stuno,stuname,stuage from student 
        where stuage =#{stuAge} or stuname like #{stuName}
</select>

测试

Student student = new Student();
student.setStuAge(20);
student.setStuName("%w%");   //在这里要进行SQL的%拼接
List<Student> students = studentMapper.queryStudentOrderBystuAgeOrstuName(student);
  • 方式二
<select id="queryStudentOrderBystuAgeOrstuName" parameterType="student" resultType="student">
	select stuno,stuname,stuage from student 
	where stuage =#{stuAge} or stuname like '%${stuName}%'    在SQL标签中直接处理
</select>

测试

Student student = new Student();
student.setStuAge(2);
student.setStuName("w");
List<Student> students = studentMapper.queryStudentOrderBystuAgeOrstuName(student);
  • 方式三:传入HashMap
<!-- 传入HashMap -->
<select id="queryStudentBystuAgeOrstuNameWithHashMap" parameterType="HashMap" resultType="student">
	select stuno,stuname,stuage from
	student where stuage =#{stuAge} or stuname like '%${stuName}%'
</select>

输入对象为HashMap:where  stuage = #{stuAge}

用map中的key的值  匹配 占位符 #{stuAge},如果匹配成功  就用map的value替换占位符

接口

List<Student>  queryStudentOrderBystuAgeOrstuName(Student student);
	
List<Student> queryStudentBystuAgeOrstuNameWithHashMap(Map<String,Object> map); //String,Object

测试类

// 传入参数 HashMap
public static void queryStudentOrderBystuAgeOrstuNameWithHashMap() throws IOException {
	// Connection
	// 加载配置文件 conf.xml ->reader
	Reader reader = Resources.getResourceAsReader("conf.xml");
	// reader -> SqlSession操作MyBatis
	// 可以通过build第二参数来指定 数据库环境 建议默认值写死
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

	SqlSession session = sessionFactory.openSession();

	StudentMapper studentMapper = session.getMapper(StudentMapper.class);
	Map<String, Object> studentMap = new HashMap<String, Object>();

	studentMap.put("stuAge", 20);
	studentMap.put("stuName", "zs");

	List<Student> students = studentMapper.queryStudentBystuAgeOrstuNameWithHashMap(studentMap);
	System.out.println(students); // 接口方法->sql语句

	session.close();
}

3、级联属性

Student类

private int stuNo;
private String stuName;
private int stuAge;
private String graName;
private boolean stuSex;
private Address address;  //家庭  学校
private StudentCard card;
//getter setter省

StudentMapper.xml

<!--根据地址查询学生   传入参数类型address-->
<select id="queryStudentByaddress" parameterType="address" resultType="student"> 
	select stuno,stuname,stuage from student 
	where homeaddress = #{homeAddress} or schooladdress ='${schoolAddress}' 
</select> 
	
<!-- 输入参数为级联 此时传入的类型还是学生-->
<select id="queryStudentByaddress" parameterType="student" resultType="student">
	select stuno,stuname,stuage from student 
	where homeaddress = #{address.homeAddress} or schooladdress ='${address.schoolAddress}'
</select>

测试代码

// 查询全部学生 并且根据地址查询学生
public static void queryStudentByaddress() throws IOException {
	// Connection
	// 加载配置文件 conf.xml ->reader
	Reader reader = Resources.getResourceAsReader("conf.xml");
	// reader -> SqlSession操作MyBatis
	// 可以通过build第二参数来指定 数据库环境 建议默认值写死
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

	SqlSession session = sessionFactory.openSession();

	// List<Student> students = session.selectList(statement);
	StudentMapper studentMapper = session.getMapper(StudentMapper.class);

//	Address address= new Address();
//	address.setHomeAddress("ah");
//	address.setSchoolAddress("js");
//	List<Student> students = studentMapper.queryStudentByaddress(address);

	Student student = new Student();
	Address address = new Address();
	address.setHomeAddress("ah");
	address.setSchoolAddress("js");
	student.setAddress(address);

	List<Student> students = studentMapper.queryStudentByaddress(student);
	System.out.println(students); // 接口方法->sql语句

	session.close();
}

输出参数 resultType

  • 简单类型(8个基本类型 +String)

  • 输出参数为实体类对象类型

  • 输出参数为实体对象类型的集合;虽然输出类型为集合 但是resultType依然写 集合元素类型

  • 输出内容为HashMap

  <select id="queryAllStudentOutByHashMap" resultType="HashMap">
	select stuno "no",stuname "name"  from student 
  </select>

输出参数 resultMap

resultMap: 实体类的属性 数据表的字段:类型、名字不同时

不使用resultMap ,也可以使用resultType+HashMap(select 表的字段名 类的属性名 from … 来指定表和属性的对应关系)

<select id="queryStudentById" parameterType="int" resultMap="queryStudentByIdMap">
	select id,name from student where id=#{id}		
</select>
	
<resultMap type="student" id="queryStudentByIdMap">
	<!-- 指定类中的属性 和 表中的字段 对应关系 -->
	<id property="stuNo" column="id"/>
	<result property="stuName" column="name"/>	
</resultMap>
做的不好,多多指教
原文地址:https://www.cnblogs.com/xingStudy/p/14197513.html