MyBatis框架—动态代理参数处理处理查询结果like与主键
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis框架—动态代理参数处理处理查询结果like与主键相关的知识,希望对你有一定的参考价值。
MyBatis框架—动态代理
MyBatis框架—动态代理
Dao 接口动态代理
使用MyBatis的动态代理
- 动态代理:
MyBatis已经在框架中创建了dao接口的实现类,在实现类中调用SqlSession的方法执行sql语句 - 使用动态代理方式的步骤:
1. 获取SqlSession对象,SqlSessionFactory.openSesson()
2. 使用getMapper方法获取某个接口的对象: sqlSession.getMapper(接口.class)
3. 使用dao接口的方法,调用方法时就执行了mapper文件中的sql语句 - 使用条件:
1. dao接口和mapper文件故在一起。 同-个目录
2. dao接口和mapper文件名称一致
3. mapper文件中的namespice的值是dao按口的全限定名称
4. mapper文件中的. .cupdate> , 等的d是接口中方法名称
5. dao接口中不要使用重载方法.不要使用同名的.不同参数的方法
Dao 动态代理实现 CURD
- 去掉 Dao 接口实现类
- 通过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);
参数传递
- 动态代理:使用
sqlSession.getMapper (dao接口.class)
获取这个dao接口的对象 - 传入参数: 从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);
#和$区别
- #使用?在sq1语句中做占位的,使用 Preparedsta tement执行sq1,效率高
- #能够避兔sq1注入, 更安全。
- $不使用占位符,是字符串连接方式,使用statement对 象执行sql,敕率低
- s有sq1注 入的风险,缺乏安全性。
- $:可以替换表名或者列名
处理查询结果
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
对象属性名不一样的情况
使用方式:
- 先定义 resultMap,指定列名和属性的对应关系。
- 在中把 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>
步骤:
- 创建新的实体类 PrimaryStudent
/**
* <p>Description: 实体类 </p>
* <p>Company: http://www.bjpowernode.com
*/
public class PrimaryStudent
private Integer stuId;
private String stuName;
private Integer stuAge;
// set , get 方法
- 接口方法
List selectUseFieldAlias(QueryParam param); - 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>
- 测试方法
@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>
步骤:
- 接口方法
List<PrimaryStudent> selectUseDiffResultMap(QueryParam param);
- 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>
- 测试方法
@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 和主键
模糊查询的实现有两种方式
- java 代码中给查询数据加上“%” ;
- 在 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分页