MyBatis的单表查询

返回List结果的查询

在StudentMapper.xml中添加查询的sql语句:

<select id="selectAllStudents" resultType="student">
    SELECT id,name,age,score FROM t_student
</select>

其中resultType表示该SQL语句的返回的每一条的数据类型,因为在mybatis.xml文件中添加了类的别名:

 <typeAliases>
    <package name="com.monkey1024.bean"/>
</typeAliases>

所以resultType的值可以使用别名student,这里首字母大小写均可。

在StudentDao中添加查询的方法,然后再StudentDaoImpl中重写:

 @Override
public List<Student> selectAllStudents() {

    List<Student> result = null;

    try(SqlSession sqlSession = MyBatisUtil.getSqlSession()) {
        //查询数据操作
        result = sqlSession.selectList("selectAllStudents");
    }

    return result;
}

在测试类中添加下面内容:

@Test
public void selectAllStudents(){
    List<Student> students = studentDao.selectAllStudents();
    students.forEach((student)->{
        System.out.println(student);
    });
}

在控制台中看到输出结果就表示执行成功。

查询单个对象

上面的示例查询出了数据库中的所有Student对象,有时候我们只需要查询出某一条数据,请看如下示例,在mapper中添加下面SQL语句,这里我们根据传入的主键id进行查询:

<select id="selectStudentById" resultType="student">
    SELECT id,name,age,score FROM t_student where id=#{id}
</select>

在StudentDaoImpl中添加下面方法:

@Override
public Student selectStudentById(int id){

    Student student = null;

    try(SqlSession sqlSession = MyBatisUtil.getSqlSession()) {

        //根据id查询数据操作
        student = sqlSession.selectOne("selectStudentById", id);
    }

    return student;
}

在测试类中进行测试,查询学生id是10的数据:

@Test
public void selectStudentById(){
    Student student = studentDao.selectStudentById(10);
    System.out.println(student);
}

模糊查询

下面以Student类中的name属性来演示模糊查询,在mapper文件中添加SQL:

<select id="selectStudentByName" resultType="student">
    SELECT id,name,age,score FROM t_student where name like '%' #{name} '%'
</select>

需要注意的是,这里面的’%’ #{name} ‘%’之间是没有+号的,即这里的字符串拼接不需要+号,而是需要空格。

在StudentDaoImp中添加下面方法:

@Override
public List<Student> selectStudentByName(String name) {
    List<Student> result = null;

    try(SqlSession sqlSession = MyBatisUtil.getSqlSession()) {

        //查询数据操作
        result = sqlSession.selectList("selectStudentByName",name);
    }

    return result;
}

在测试类中进行测试:

@Test
public void selectStudentByName(){
    List<Student> students = studentDao.selectStudentByName("富");
    students.forEach((student)->{
        System.out.println(student);
    });
}

当查询出数据的时候则说明运行成功。

模糊查询的另一种写法
其实在上面mapper中的sql语句我们还可以使用$进行操作:

<select id="selectStudentByName" resultType="student">
    SELECT id,name,age,score FROM t_student where name like '%${value}%'
</select>

因为我们传入的name是String字符串类型,所以这里需要注意的是${}中的内容只能写value,可以通过控制台打印的sql语句看出来,这种方式其实就是是字符串拼接,该方式可能会有SQL注入的问题。

$和#的区别

  • #其实是占位符,通过控制台打印的sql语句可以看出,他是以?进行占位的,类似JDBC的PreparedStatement,可以防止SQL注入的问题,在上面的sql语句中我们写的是#{id},实际上#{}里面的内容可以写成其他字符串#{xxx},这里只是起着占位符的作用,mybatis会将sqlSession.selectList或sqlSession.selectOne等方法中的第二个参数赋值进去。因此如果sql语句需要获取用户的输入从而进行动态拼接的话,就需要使用#{}。
  • $是字符串拼接,参数会被直接拼接到SQL语句中,该方式会有SQL注入问题,如果SQL语句有我们程序员直接写好,不需要用户输入的话,可以使用${},不过一般还是建议使用#{}。