本文的创作来源于朋友在自学mybatis遇到的问题,问题如文章标题所示Cannot determine value type from string ‘xxx’。他在网上搜索出来的答案基本上都是加上一个无参构造器,就可以解决问题。他的疑问点在于他实体没有使用无参构造器,而使用了有参构造器,有的查询方法不会报错,有的查询方法却报错了。下面将演示他出现的这种场景的示例。
注: mybatis的搭建过程忽略,仅演示案例。案例代码取自朋友
示例
1、entity
public class Student {
private int id;
private String name;
private String email;
private int age;
public Student(String aa,int bb){
System.out.println("===============执行student的有参数构造方法 aa = "+aa+" bb = "+bb+"================");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + ''' +
", email='" + email + ''' +
", age=" + age +
'}';
}
}
2、dao
public interface StudentDao {
Student getStudentById(int id);
List getStudents(@Param("myname") String name, @Param("myage") int age);
List getStudentByObj(Student student);
}
3、mapper.xml
select id, name, email, age from student where id = #{sid}
4、单元测试
@Test
public void testgetStudentById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student student = dao.getStudentById(1034);
sqlSession.close();
System.out.println(student);
}
@Test
public void testgetStudents(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List students = dao.getStudents("张三", 22);
sqlSession.close();
students.forEach(student -> System.out.println(student));
}
5、运行单元测试
从截图看出,当实体没有使用无参构造器时,出现朋友所说的有一些方法成功,一些方法报错,报错信息为
Cannot determine value type from string 'xxx'
采用网上介绍的方法,给实体加上无参构造器,如下:
public class Student {
private int id;
private String name;
private String email;
private int age;
public Student(){
}
public Student(String aa,int bb){
System.out.println("===============执行student的有参数构造方法 aa = "+aa+" bb = "+bb+"================");
}
public class Student {
private int id;
private String name;
private String email;
private int age;
public Student(String aa,int bb){
System.out.println("===============执行student的有参数构造方法 aa = "+aa+" bb = "+bb+"================");
}
同时把mapper.xml修改为如下
select id, name, email, age from student where id = #{sid}
select name, age from student where name = #{myname} or age = #{myage}
select id, name, email, age from student where name = #{name} or age = #{age}