只需调用 SqlSession 的 getMapper()方法,即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值。
SqlSession session = factory.openSession();
StudentDao dao = session.getMapper(StudentDao.class);
复制代码
使用工具类:
StudentDao studentDao =
MyBatisUtil.getSqlSession().getMapper(StudentDao.class);
复制代码
select 方法:
@Test
public void testSelect() throws IOException {
final List studentList = studentDao.selectStudents();
studentList.forEach( stu -> System.out.println(stu));
}
复制代码
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);
}
复制代码
动态代理
MapperProxy 类定义:
invoke()方法:
重点方法:
parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。
int 或 java.lang.Integer
hashmap 或 java.util.HashMap
list 或 java.util.ArrayList
student 或 com.bjpowernode.domain.Student
select,insert,update,delete 都可以使用 parameterType 指定类型。
例如:
delete from student where id=#{studentId}
复制代码
等同于
delete from student where id=#{studentId}
复制代码
从 java 代码中把参数传递到 mapper.xml 文件。
Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方法的参数名无关。
接口方法:
Student selectById(int id);
复制代码
mapper 文件:
复制代码
#{studentId} , studentId 是自定义的变量名称,和方法参数名无关。
测试方法:
@Test
public void testSelectById(){
//一个参数
Student student = studentDao.selectById(1005);
System.out.println("查询 id 是 1005 的学生:"+student);
}
复制代码
当 Dao 接口方法多个参数,需要通过名称使用参数。 在方法形参前面加入@Param(“自定义参数名”),mapper 文件使用#{自定义参数名}。
例如定义 List selectStudent( @Param(“personName”) String name ) { … }
mapper 文件 select * from student where name = #{ personName}
接口方法:
List selectMultiParam(@Param("personName") String name,
@Param("personAge") int age);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testSelectMultiParam(){
List stuList = studentDao.selectMultiParam("李力",20);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。
语法格式: #{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 }
javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property }
创建保存参数值的对象 QueryParam
package com.bjpowernode.vo;
public class QueryParam {
private String queryName;
private int queryAge;
//set ,get 方法
}
复制代码
接口方法:
List selectMultiObject(QueryParam queryParam);
复制代码
mapper 文件:
复制代码
或
复制代码
测试方法:
@Test
public void selectMultiObject(){
QueryParam qp = new QueryParam();
qp.setQueryName("李力");
qp.setQueryAge(20);
List stuList = studentDao.selectMultiObject(qp);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是#{arg0}, 第二个是#{arg1}
注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。
接口方法:
List selectByNameAndAge(String name,int age);
复制代码
mapper 文件
复制代码
测试方法:
@Test
public void testSelectByNameAndAge(){
//按位置参数
List stuList = studentDao.selectByNameAndAge("李力",20);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
Map 集合可以存储多个值,使用 Map 向 mapper 文件一次传入多个参数。Map 集合使用 String 的 key,Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值。
例如:
Map data = new HashMap();
data.put(“myname”,”李力”);
data.put(“myage”,20);
复制代码
接口方法:
List selectMultiMap(Map map);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testSelectMultiMap(){
Map data = new HashMap<>();
data.put("myname","李力");// #{myname}
data.put("myage",20); // #{myage}
List stuList = studentDao.selectMultiMap(data);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
mapper 文件
复制代码
转为 MyBatis 的执行是:
String sql=” select id,name,email,age from student where id=?”;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1005);
复制代码
解释:
例 1: 分别使用 id , email 列查询 Student
接口方法:
Student findById(int id);
Student findByEmail(String email);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testFindStuent(){
Student student1 = studentDao.findById(1002);
System.out.println("findById:"+student1);
Student student2 = studentDao.findByEmail("zhou@126.net");
System.out.println("findByEmail:"+student2);
}
复制代码
例 2:通用方法,使用不同列作为查询条件
接口方法:
Student findByDiffField(@Param("col") String colunName,@Param("cval") Object value);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testFindDiffField(){
Student student1 = studentDao.findByDiffField("id",1002);
System.out.println("按 id 列查询:"+student1);
Student student2 = studentDao.findByDiffField("email","zhou@126.net");
System.out.println("按 email 列查询:"+student2);
}
复制代码
接口方法:
int countStudent();
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testRetunInt(){
int count = studentDao.countStudent();
System.out.println("学生总人数:"+ count);
}
复制代码
接口方法:
Student selectById(int id);
复制代码
mapper 文件:
复制代码
框架的处理: 使用构造方法创建对象。调用 setXXX 给属性赋值。 Student student = new Student();
注意:Dao 接口方法返回是集合类型,需要指定集合中的类型,不是集合本身。
sql 的查询结果作为 Map 的 key 和 value。推荐使用 Map
接口方法:
Map
mapper 文件:
复制代码
测试方法:
@Test
public void testReturnMap(){
Map
resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。常用在列名和 java 对象属性名不一样的情况。
使用方式:1.先定义 resultMap,指定列名和属性的对应关系。 2.在select中把 resultType 替换为 resultMap。
接口方法:
List selectUseResultMap(QueryParam param);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testSelectUseResultMap(){
QueryParam param = new QueryParam();
param.setQueryName("李力");
param.setQueryAge(20);
List stuList = studentDao.selectUseResultMap(param);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
步骤:
package com.bjpowernode.domain;
/**
* Description: 实体类
* Company: http://www.bjpowernode.com
*/
public class PrimaryStudent {
private Integer stuId;
private String stuName;
private Integer stuAge;
// set , get 方法
}
复制代码
List selectUseFieldAlias(QueryParam param);
复制代码
复制代码
4.测试方法
@Test
public void testSelectUseFieldAlias(){
QueryParam param = new QueryParam();
param.setQueryName("李力");
param.setQueryAge(20);
List stuList;
stuList = studentDao.selectUseFieldAlias(param);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
步骤:
List selectUseDiffResultMap(QueryParam param);
复制代码
复制代码
@Test
public void testSelectUseDiffResultMap(){
QueryParam param = new QueryParam();
param.setQueryName("李力");
param.setQueryAge(20);
List stuList;
stuList = studentDao.selectUseDiffResultMap(param);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
模糊查询的实现有两种方式, 一是 java 代码中给查询数据加上“%” ; 二是在 mapper 文件 sql 语句的条件位置加上“%”
需求:查询姓名有“力”的
例 1: java 代码中提供要查询的 “%力%”
接口方法:
List selectLikeFirst(String name);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testSelectLikeOne(){
String name="%力%";
List stuList = studentDao.selectLikeFirst(name);
stuList.forEach( stu -> System.out.println(stu));
}
复制代码
例 2:mapper 文件中使用 like name "%" #{xxx} "%"
接口方法:
List selectLikeSecond(String name);
复制代码
mapper 文件:
复制代码
测试方法:
@Test
public void testSelectLikeSecond(){
String name="力";
List stuList = studentDao.selectLikeSecond(name);
stuList.forEach( stu -> System.out.println(stu));
}
留言与评论(共有 0 条评论) “” |