MyBatis框架—动态代理参数处理处理查询结果like与主键

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis框架—动态代理参数处理处理查询结果like与主键相关的知识,希望对你有一定的参考价值。

MyBatis框架—动态代理

Dao 接口动态代理

使用MyBatis的动态代理

  1. 动态代理:
    MyBatis已经在框架中创建了dao接口的实现类,在实现类中调用SqlSession的方法执行sql语句
  2. 使用动态代理方式的步骤:
    1. 获取SqlSession对象,SqlSessionFactory.openSesson()
    2. 使用getMapper方法获取某个接口的对象: sqlSession.getMapper(接口.class)
    3. 使用dao接口的方法,调用方法时就执行了mapper文件中的sql语句
  3. 使用条件:
    1. dao接口和mapper文件故在一起。 同-个目录
    2. dao接口和mapper文件名称一致
    3. mapper文件中的namespice的值是dao按口的全限定名称
    4. mapper文件中的. .cupdate> , 等的d是接口中方法名称
    5. dao接口中不要使用重载方法.不要使用同名的.不同参数的方法

Dao 动态代理实现 CURD

  1. 去掉 Dao 接口实现类
  2. 通过getMapper 获取代理对象

    传统dao开发方式:
    测试:按ID查询和遍历

    结果:
insert 方法:
@Test
public void testInsert() throws IOException 
 Student student = new Student();
 student.setId(1006);
 student.setName("林浩");
 student.setEmail("linhao@163.com");
 student.setAge(26);
 int nums = studentDao.insertStudent(student);
 System.out.println("使用 Dao 添加数据:"+nums);

update 方法
@Test
public void testUpdate() throws IOException 
 Student student = new Student();
 student.setId(1006);
 student.setAge(28);
 int nums = studentDao.updateStudent(student);
 System.out.println("使用 Dao 修改数据:"+nums);

delete 方法
@Test
public void testDelete() throws IOException 
 int nums = studentDao.deleteStudent(1006);
 System.out.println("使用 Dao 修改数据:"+nums);

参数传递

  1. 动态代理:使用 sqlSession.getMapper (dao接口.class)获取这个dao接口的对象
  2. 传入参数: 从java代码中把数据传入到mapper文件的sql语句中.
    1)parameterType :写在mapper文件中的一个属性. 表示dao按口中方法的参数的数据类型
    例如studentDao接口
    public Student selectStudentById (Integer Id)

一个简单类型的参数

mybatis把java的基本数据类型String都叫简单类型
在mapper文件获取简单类型的一一个参数的值,使用#任意字符

Student student = studentDao.selectById(1005);

1005就是传入的#id

多个参数-使用@Param

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

#和S

mapper 文件

<select id="selectById" resultType="work01_mybatis_dao.content.domain.Student">
 select id,name,email,age from student where id=#studentId
</select>

转为 MyBatis 的执行是:

String sql=” select id,name,email,age from student where id=?;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1005);

#和$区别

  1. #使用?在sq1语句中做占位的,使用 Preparedsta tement执行sq1,效率高
  2. #能够避兔sq1注入, 更安全。
  3. $不使用占位符,是字符串连接方式,使用statement对 象执行sql,敕率低
  4. s有sq1注 入的风险,缺乏安全性。
  5. $:可以替换表名或者列名

处理查询结果

resultType

resultType: 执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用

A、简单类型

接口方法:

int countStudent();

mapper 文件:

<select id="countStudent" resultType="int">
 select count(*) from student
</select>

测试方法:

@Test
public void testRetunInt()
 int count = studentDao.countStudent();
 System.out.println("学生总人数:"+ count);

B、 对象类型

接口方法:

Student selectById(int id);

mapper 文件:

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

框架的处理: 使用构造方法创建对象。调用 setXXX 给属性赋值

Student student = new Student();
sql 语句列 java 对象方法
id setId( rs.getInt(“id”) ) 调用列名对应的 set 方法
id 列 --- setId()
name 列 --- setName()
name setName( rs.getString(“name”) )
email setEmail( rs.getString(“email”) )
age setAge( rs.getInt(“age”) )

注意:Dao 接口方法返回是集合类型,需要指定集合中的类型,不是集合本身
Map

sql 的查询结果作为 Map 的 key 和 value

推荐使用 Map<Object,Object>

注意:Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录是错误

接口方法:

Map<Object,Object> selectReturnMap(int id);

mapper 文件:

<select id="selectReturnMap" resultType="java.util.HashMap">
 select name,email from student where id = #studentId
</select>

测试方法:

@Test
public void testReturnMap()
 Map<Object,Object> retMap = studentDao.selectReturnMap(1002);
 System.out.println("查询结果是 Map:"+retMap);

resultMap

resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系
更灵活的把列值赋值给指定属性 常用在列名和 java
对象属性名不一样的情况

使用方式

  1. 先定义 resultMap,指定列名和属性的对应关系。
  2. 在中把 resultType 替换为 resultMap
    接口方法:
List<Student> selectUseResultMap(QueryParam param);

mapper 文件:

<resultMap id="studentMap" type="com.bjpowernode.domain.Student">
 <!-- 主键字段使用 id -->
 <id column="id" property="id" />
 <!--非主键字段使用 result-->
 <result column="name" property="name"/>
 <result column="email" property="email" />
 <result column="age" property="age" />
</resultMap>

<!--resultMap: resultMap 标签中的 id 属性值-->
<select id="selectUseResultMap" resultMap="studentMap">
 select id,name,email,age from student where name=#queryName or age=#queryAge
</select>

测试方法:

@Test
public void testSelectUseResultMap()
 QueryParam param = new QueryParam();
 param.setQueryName("李力");
 param.setQueryAge(20);
 List<Student> stuList = studentDao.selectUseResultMap(param);
 stuList.forEach( stu -> System.out.println(stu));

实体类属性名和列名不同的处理方式

1) 使用列别名和<resultType>
步骤:

  1. 创建新的实体类 PrimaryStudent
/**
* <p>Description: 实体类 </p>
* <p>Company: http://www.bjpowernode.com
*/
public class PrimaryStudent 
 private Integer stuId;
 private String stuName;
 private Integer stuAge;
 // set , get 方法

  1. 接口方法
    List selectUseFieldAlias(QueryParam param);
  2. mapper 文件:
<select id="selectUseFieldAlias" 
resultType="com.bjpowernode.domain.PrimaryStudent">
 select id as stuId, name as stuName,age as stuAge
 from student where name=#queryName or age=#queryAge
</select>
  1. 测试方法
@Test
public void testSelectUseFieldAlias()
 QueryParam param = new QueryParam();
 param.setQueryName("李力");
 param.setQueryAge(20);
 List<PrimaryStudent> stuList;
 stuList = studentDao.selectUseFieldAlias(param);
 stuList.forEach( stu -> System.out.println(stu));

(2) 使用<resultMap>
步骤:

  1. 接口方法
List<PrimaryStudent> selectUseDiffResultMap(QueryParam param);
  1. mapper 文件:
<!-- 创建 resultMap
 id:自定义的唯一名称,在<select>使用
 type:期望转为的 java 对象的全限定名称或别名 
-->
<resultMap id="primaryStudentMap" 
type="com.bjpowernode.domain.PrimaryStudent">
 <!-- 主键字段使用 id -->
 <id column="id" property="stuId" />
 <!--非主键字段使用 result-->
 <result column="name" property="stuName"/>
 <result column="age" property="stuAge" />
</resultMap>
<!--resultMap: resultMap 标签中的 id 属性值-->
<select id="selectUseDiffResultMap" resultMap="primaryStudentMap">
 select id,name,email,age from student
 where name=#queryName or age=#queryAge
</select>
  1. 测试方法
@Test
public void testSelectUseDiffResultMap()
 QueryParam param = new QueryParam();
 param.setQueryName("李力");
 param.setQueryAge(20);
 List<PrimaryStudent> stuList;
 stuList = studentDao.selectUseDiffResultMap(param);
 stuList.forEach( stu -> System.out.println(stu));

like 和主键

模糊查询的实现有两种方式

  1. java 代码中给查询数据加上“%” ;
  2. 在 mapper 文件 sql 语句的条件位置加上“%”
    需求:查询姓名有“力”的

例 1: java 代码中提供要查询的 “%力%”

接口方法:

List<Student> selectLikeFirst(String name);

mapper 文件:

<select id="selectLikeFirst" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 where name like #studentName
</select>

测试方法:

@Test
public void testSelectLikeOne()
 String name="%力%";
 List<Student> stuList = studentDao.selectLikeFirst(name);
 stuList.forEach( stu -> System.out.println(stu));

例 2:mapper 文件中使用 like name “%” #xxx "%"
接口方法:

List<Student> selectLikeSecond(String name);

mapper 文件:

<select id="selectLikeSecond" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 where name like "%" #studentName "%"
</select>

测试方法:

@Test
public void testSelectLikeSecond()
 String name="力";
 List<Student> stuList = studentDao.selectLikeSecond(name);
 stuList.forEach( stu -> System.out.println(stu));

以上是关于MyBatis框架—动态代理参数处理处理查询结果like与主键的主要内容,如果未能解决你的问题,请参考以下文章

mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页

mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页

mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页

mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页

MyBatis3系列__04CRUD以及参数处理

java mybatis学习之$和#区别,mapper代理接口,动态SQL,在日志中输出mybatis的sql语句