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

笔记 同时被 3 个专栏收录
57 篇文章 0 订阅
5 篇文章 0 订阅
21 篇文章 0 订阅

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));
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值