MyBatis——dao代理的使用、深入理解参数(传递一个参数、传递多个参数、使用entity实体类传递、使用自定义类传递、按位置传递、使用Map传递)
程序员文章站
2024-01-09 22:44:28
文章目录:1.MyBatis的dao代理1.1 MyBatis提供代理1.2 使用MyBatis代理的要求1.3MyBatis代理的实现方式2.深入理解相关参数2.1 parameterType2.2 dao接口的方法形参列表中只有一个参数2.3dao接口的方法形参列表中有多个参数2.4dao接口的方法形参列表中使用entity实体类对象2.5dao接口的方法形参列表中使用自定义类对象写在结尾1.MyBatis的dao代理1.1 MyBat......
文章目录:
2.2 dao接口的方法形参列表中只有一个参数(重要!!!)
2.4 dao接口的方法形参列表中使用entity实体类对象(重要!!!)
2.5 dao接口的方法形参列表中使用自定义类对象(重要!!!)
2.6 dao接口的方法形参列表中按位置传递参数(不推荐!!!)
2.7 dao接口的方法形参列表中按Map传递参数(不推荐!!!)
1.MyBatis的dao代理
1.1 MyBatis提供代理
1.2 使用MyBatis代理的要求
1.3 MyBatis代理的实现方式
@Test
public void testSelectById() {
//1.获取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao=session.getMapper(StudentDao.class);
Student student=studentDao.selectById(1001);
System.out.println("student = " + student);
//3.关闭SqlSession对象
session.close();
}
@Test
public void testSelectStudents() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
//com.sun.proxy.$Proxy == StudentDaoImpl
System.out.println("studentDao === " + studentDao.getClass().getName());
List<Student> students=studentDao.selectStudents();
students.forEach( stu-> System.out.println("stu = " + stu));
session.close();
}
StudentDao studentDao=session.getMapper(StudentDao.class);
//等同于
StudentDao studentDao=new StudentDaoImpl();
2.深入理解相关参数
2.1 parameterType
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import java.util.List;
/**
*
*/
public interface StudentDao {
Student selectById(Integer id);
}
<!--
parameterType: 指定dao接口形参的类型
这个属性的值可以使用 java 类型的全限定名称或者 mybatis定义的别名
mybatis执行的sql语句:select id,name,email,age from student where id=?
? 是占位符,使用jdbc中的PreparedStatement执行这样的sql语句
PreparedStatement pst=conn.preparedStatement("select id,name,email,age from student where id=?");
给 ? 位置赋值
参数Integer:执行pst.setInt(1,1001); 对应了mybatis中的 parameterType="java.lang.Integer"
参数String:执行pst.setString(1,"1001");
第一个用法:java类型的全限定名称 parameterType="java.lang.Integer"
第二个用法:mybatis定义的java类型的别名 parameterType="intinteger"
mybatis通过反射机制可以获取 dao 接口方法的参数类型,即parameterType可以不写
-->
<select id="selectById" parameterType="integer"
resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where id=#{studentId}
</select>
@Test
public void testSelectById() {
//1.获取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao=session.getMapper(StudentDao.class);
Student student=studentDao.selectById(1003);
System.out.println("student = " + student);
//3.关闭SqlSession对象
session.close();
}
2.2 dao接口的方法形参列表中只有一个参数(重要!!!)
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import java.util.List;
/**
*
*/
public interface StudentDao {
//dao接口的方法形参是一个简单类型
//简单类型:java基本数据类型和String
Student selectByEmail(String email);
}
<!--
dao接口是一个简单类型的参数(java 基本类型和 String)
mapper文件获取这个参数值:使用 #{任意字符}
-->
<select id="selectByEmail" resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where email=#{studentEmail}
</select>
@Test
public void testOneParameter() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
Student student=studentDao.selectByEmail("zhangsan@qq.com");
System.out.println("email === " + student);
session.close();
}
2.3 dao接口的方法形参列表中有多个参数(重要!!!)
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
*
*/
public interface StudentDao {
/*
* 多个简单类型的参数
* 使用 @Param 命名参数,注解都是mybatis提供的
* 位置:在形参定义的前面
* 属性:value 自定义的参数名称
*/
List<Student> selectByNameOrAge(@Param("myname") String name,
@Param("myage") Integer age);
}
<!--
多个简单类型的参数
当你使用了 @Param 命名后,例如 @param("myname")
在mapper中,使用 #{命名的参数},即 #{myname}
-->
<select id="selectByNameOrAge" resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>
@Test
public void testSelectByNameOrAge() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
List<Student> students=studentDao.selectByNameOrAge("张三",20);
students.forEach( stu-> System.out.println("stu = " + stu));
session.close();
}
2.4 dao接口的方法形参列表中使用entity实体类对象(重要!!!)
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import java.util.List;
/**
*
*/
public interface StudentDao {
/*
* 一个java对象作为参数(对象有属性,每个属性有set、get方法)
*/
List<Student> selectByObject(Student student);
}
<!--
一个java对象作为方法的参数,使用对象的属性作为参数值
简单的语法:#{属性名},mybatis调用此属性的getXXX()方法
-->
<select id="selectByObject" resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where name=#{name} or age=#{age}
</select>
<!--
也可以写成下面这种复杂的更详细的格式:
javaType=java中数据类型名
jdbcType=数据库中数据类型名称
-->
<select id="selectByObject" resultType="com.bjpowernode.entity.Student">
select id,name,email,age
from student
where name=#{name,javaType=java.lang.String,jdbcType=VARCHAR} or
age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>
@Test
public void testSelectByObject() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
Student student=new Student();
student.setName("张三");
student.setAge(20);
List<Student> students=studentDao.selectByObject(student);
students.forEach( stu-> System.out.println("stu = " + stu));
session.close();
}
2.5 dao接口的方法形参列表中使用自定义类对象(重要!!!)
package com.bjpowernode.vo;
/**
*
*/
public class QueryParam {
private Object p1;
private Object p2;
public Object getP1() {
return p1;
}
public void setP1(Object p1) {
this.p1 = p1;
}
public Object getP2() {
return p2;
}
public void setP2(Object p2) {
this.p2 = p2;
}
}
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import com.bjpowernode.vo.QueryParam;
import java.util.List;
/**
*
*/
public interface StudentDao {
List<Student> selectByQueryParam(QueryParam param);
}
<select id="selectByQueryParam" resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where name=#{p1} or age=#{p2}
</select>
@Test
public void testSelectByObject2() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
QueryParam param=new QueryParam();
param.setP1("李四");
param.setP2(15);
List<Student> students=studentDao.selectByQueryParam(param);
students.forEach( stu-> System.out.println("stu = " + stu));
session.close();
}
2.6 dao接口的方法形参列表中按位置传递参数(不推荐!!!)
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import java.util.List;
/**
*
*/
public interface StudentDao {
//使用位置获取参数
List<Student> selectByPosition(String name,Integer age);
}
<!--
使用位置获取参数值,dao接口方法是多个简单类型的参数
语法:#{arg0},#{arg1}...
-->
<select id="selectByPosition" resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where name=#{arg0} or age=#{arg1}
</select>
@Test
public void testSelectByPosition() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
List<Student> students=studentDao.selectByPosition("张三",15);
students.forEach( stu-> System.out.println("stu = " + stu));
session.close();
}
2.7 dao接口的方法形参列表中按Map传递参数(不推荐!!!)
package com.bjpowernode.dao;
import com.bjpowernode.entity.Student;
import java.util.List;
import java.util.Map;
/**
*
*/
public interface StudentDao {
//使用Map作为参数
List<Student> selectStudentByMap(Map<String,Object> map);
}
<!--
使用Map传递参数
在mapper文件中,获取map的值,是通过key获取的,语法:#{key}
-->
<select id="selectStudentByMap" resultType="com.bjpowernode.entity.Student">
select id,name,email,age from student where name=#{myname} or age=#{myage}
</select>
@Test
public void testSelectByMap() {
SqlSession session=MyBatisUtil.getSqlSession();
StudentDao studentDao=session.getMapper(StudentDao.class);
Map<String,Object> map=new HashMap<>();
map.put("myname","张三");
map.put("myage",20);
List<Student> students=studentDao.selectStudentByMap(map);
students.forEach( stu-> System.out.println("stu = " + stu));
session.close();
}
写在结尾
本文地址:https://blog.csdn.net/weixin_43823808/article/details/114260491