一.使用注解实现
说到现在,我们发现,mybatis代码已经简化了很多了.和以前相比,我们不用去编写它的实现类.而是由mapper代理自动帮我们生成.但是我们还有一种更为经典的方式.mapper代理我们前面说的是通过xml配置文件的方式来实现的,那下面我们介绍一下使用注解来实现.annotations--注释.
我们通过注解实现的话,映射配置文件--我们前面的UserMapper就不需要了.删除即可.那我们思考一下,没有了映射文件,只有接口如何生成实现类呢?那我们下面了解一下如果通过注解代替原来的xml实现.
我们只需要在接口上的增删改查方法上面添加一些简单的注解标注即可.下面看下代码
package mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import pojo.UserInfo;
public interface UserMapper {
@Select("select * from userinfo") //把sql语句和方法对应起来
List<UserInfo> queryAll();
//和原来映射配置文件里面的写法一模一样
//这里的#{}中和原来映射文件的规则一样:如果是简单类型,随意写;如果里面是对象,同样是对象的属性名称.结果封装到哪里根据返回值类型推断
@Select("select * from userinfo where uid=#{uid}")
UserInfo queryById(int uid);
//@Insert
//@Delete
}
二.高级映射
我们先思考一下下面这个问题:我们想查询部门信息以及部门下所有员工的信息,该如何实现?查询设计的两张表我贴在下面.
员工表
部门表
我们先用sql语句写一下上面的要求:
SELECT * FROM dept LEFT JOIN emp ON dept.deptno = emp.deptno;
我们发现这两个表,存在一对多的关系.首先实体类就不像上面一样是单一的了.那就需要部门和员工的两个实体类.正常情况下我们给实体类定义的成员属性如下:
我们前面说过,我们只需要关注定制化的sql,输入参数以及封装输出结果类型.首先输入参数这里我们是不必考虑的.sql语句也很上面一样.那就剩下了输出结果的封装了.我们sql语句查询出来的结果集的字段数肯定是比每个实体类中的成员属性都要多的,这是毫无疑问的,而对于resultType(映射文件中的定制化sql语句的一个属性,还记得么?)最大的一个特点:结果集字段名称必须和resultType值里面的对象的属性名称一致,这样才能封装.所以在这里我们就不能直接封装结果.
其实这里的问题我们不难发现:我们查询出来的结果集是把两张表的字段都结合在一起了,但是我们上面声明的类的属性并没有声明出来可以产生结合到一个地方去.所以我们要对两个类进行改写.让这两个类产生上面说的一对多关系.那我们将部门类修改一下
这样就让部门这个类和员工类呈现出了一对多的关系.这样我们期望将结果集中的前三个字段(deptno,dname,loc)封装到这个部门类的前三个属性中,将结果集后面的属性封装到部