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

MyBatis框架—动态代理

  • MyBatis框架—动态代理
    • Dao 接口动态代理
      • 使用MyBatis的动态代理
      • Dao 动态代理实现 CURD
    • 参数传递
      • 一个简单类型的参数
      • 多个参数-使用@Param
      • #和S
      • #和$区别
    • 处理查询结果
      • resultType
      • A、简单类型
      • B、 对象类型
      • sql 的查询结果作为 Map 的 key 和 value
      • resultMap
      • 实体类属性名和列名不同的处理方式
    • like 和主键

MyBatis框架—动态代理

Dao 接口动态代理

MyBatis框架—动态代理、参数处理、处理查询结果、like与主键_第1张图片

使用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 接口实现类
    MyBatis框架—动态代理、参数处理、处理查询结果、like与主键_第2张图片
  2. 通过getMapper 获取代理对象
    在这里插入图片描述
    传统dao开发方式:MyBatis框架—动态代理、参数处理、处理查询结果、like与主键_第3张图片
    测试:按ID查询和遍历
    MyBatis框架—动态代理、参数处理、处理查询结果、like与主键_第4张图片
    结果:MyBatis框架—动态代理、参数处理、处理查询结果、like与主键_第5张图片
insert 方法:
@Test
public void testInsert() throws IOException {
     
 Student student = new Student();
 student.setId(1006);
 student.setName("林浩");
 student.setEmail("[email protected]");
 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}
MyBatis框架—动态代理、参数处理、处理查询结果、like与主键_第6张图片

多个参数-使用@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

注意: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 column="id" property="id" />
 
 <result column="name" property="name"/>
 <result column="email" property="email" />
 <result column="age" property="age" />
resultMap>


<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) 使用列别名和
步骤:

  1. 创建新的实体类 PrimaryStudent
/**
* 

Description: 实体类

*

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) 使用
步骤:

  1. 接口方法
List<PrimaryStudent> selectUseDiffResultMap(QueryParam param);
  1. mapper 文件:

<resultMap id="primaryStudentMap" 
type="com.bjpowernode.domain.PrimaryStudent">
 
 <id column="id" property="stuId" />
 
 <result column="name" property="stuName"/>
 <result column="age" property="stuAge" />
resultMap>

<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,Java,java,mybatis,后端)