SSM框架之Mybatis框架

MyBatis的简介

原始jdbc操作

public class ConnectionTest {
    public static void query() throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获得链接
        Connection connection= DriverManager.getConnection("jdbc:mysql:///myweb","root","root");
        //获得statement
        PreparedStatement statement=connection.prepareStatement("select id,username,password from user");
        //执行查询
        ResultSet resultSet=statement.executeQuery();
        //遍历结果集
        while (resultSet.next()){
            //封装实体
            User user=new User();
            user.setId(resultSet.getInt("id"));
            user.setUsername(resultSet.getString("username"));
            user.setPassword(resultSet.getString("password"));
            //user实体封装完毕
            System.out.println(user);
        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }

    public static void inert(String uername,String password) throws Exception{
        User user=new User();
        user.setUsername(uername);
        user.setPassword(password);
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获得链接
        Connection connection= DriverManager.getConnection("jdbc:mysql:///myweb","root","root");
        //获得statement
        PreparedStatement statement=connection.prepareStatement("insert into user(username,password) values (?,?)");
        //设置占位符
        statement.setString(1, user.getUsername());
        statement.setString(2, user.getPassword());
        //执行查询
        int resultSet=statement.executeUpdate();
        System.out.println(resultSet);
        //释放资源
        statement.close();
        connection.close();
    }

    public static void main(String[] args) throws Exception{
      /*  query();*/
        inert("tom","111");
    }
}

原始jdbc操作分析

问题:

  • 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能。
  • sql在代码中编写,不易维护,实际sql可能会变化
  • 查询操作时,需要手动将结果的数据手动封装到实体中,插入操作数据需要将实体的数据设置到sql语句的占位符位置

解决方案:

  • 使用数据库连接池初始化链接资源
  • 将sql语句抽取到xml配置文件中
  • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

什么是mybatis

  • java的持久层框架,内部封装了jdbc,就只需要关注sql语句本身
  • mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
  • 最后mybatis执行sql并将结果映射成java对象并返回,采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

Mybatis的快速入门

1、添加mybatis和mysql的jar包

在pom.xml中加载对应的依赖,mysql、mybatis、log4j、junit(mysql版本需要注意下)

2、创建数据库及User实体类

public class User {
    Integer id;
    String  username;
    String  password;

    public User() {
    }
    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3、定义接口类userDao用来管理

import java.util.List;
public interface usrDao {
    List<User> findAll();
}

3、编写映射文件userMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.controller.usrDao"> 
    //resultType 查询的结果集封装到User
    <select id="findAll" resultType="com.dao.User">
        select * from user
    </select>
</mapper>

4、编写核心文件MybatisConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
    <!-- 属性文件 -->
    <properties resource="jdbc.properties"></properties>
  <!--  配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <transactionManager type="jdbc" />
            <!--配置数据源(连接源)-->
            <dataSource type="POOLED">
                <!--配置数据库的4个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/myweb" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!-- 指定映射文件的位置,指的是每个mapper独立的配置文件 -->
    <mappers>
        <mapper resource="com/mapp/userMapper.xml"/>
    </mappers>
</configuration>

5、编写测试类

public static void main(String[] args) throws IOException {
    //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
    //第二个:使用ServletContext对象的getRealPath()
    String file = "/mybatis.xml";
     //获取配置文件流
    InputStream resources = Resources.class.getResourceAsStream(file);
     //创建SqlSessionFactory对象
    //创建工厂mybatis使用了构建者模式
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory;
    factory = builder.build(resources);
    //使用工厂产生sqlsession对象
    SqlSession session=factory.openSession();
    //使用SqlSession创建Dao接口的代理对象
    usrDao us=session.getMapper(usrDao.class);
    //使用代码对象执行方法
    List<User> users=us.findAll();
    for(User user:users){
        System.out.println(user);
    }
    //释放资源
    session.close();
    resources.close();
}

Mybatis的映射文件

[图片上传失败...(image-d81560-1619415469298)]

Mybatis增删改查

增删改查:

public class mybatisTest {
    public static void main(String[] args) throws Exception {
        delete();
    }

    public static void queryAll() throws Exception {
        //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
        //第二个:使用ServletContext对象的getRealPath()
        String file = "/mybatis.xml";
        //获取配置文件流
        InputStream resources = Resources.class.getResourceAsStream(file);
        //创建SqlSessionFactory对象
        //创建工厂mybatis使用了构建者模式
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory;
        factory = builder.build(resources);
        //使用工厂产生sqlsession对象
        SqlSession session=factory.openSession();
        //使用SqlSession创建Dao接口的代理对象
        usrDao us=session.getMapper(usrDao.class);
        //使用代码对象执行方法
        List<User> users=us.findAll();
        for(User user:users){
            System.out.println(user);
        }
        //释放资源
        session.close();
        resources.close();
    }

    public static void insert() throws Exception{
        //模拟user对象
        User user=new User();
        user.setUsername("lili3");
        user.setPassword("222");
        //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
        //第二个:使用ServletContext对象的getRealPath()
        String file = "/mybatis.xml";
        //获取配置文件流
        InputStream resources = Resources.class.getResourceAsStream(file);
        //创建SqlSessionFactory对象
        //创建工厂mybatis使用了构建者模式
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory;
        factory = builder.build(resources);
        //使用工厂产生sqlsession对象
        SqlSession session=factory.openSession();
        //使用SqlSession创建Dao接口的代理对象
        usrDao us=session.getMapper(usrDao.class);
        us.addUser(user);
    /*    session.insert("usrDao.addUser",user);*/
        //mybatis执行更新操作,需要提交事务
        session.commit();
        //释放资源
        session.close();
        resources.close();
    }

    public static void update() throws Exception{
        //模拟user对象
        User user=new User();
        user.setId(2);
        user.setUsername("lili2");
        user.setPassword("222");
        //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
        //第二个:使用ServletContext对象的getRealPath()
        String file = "/mybatis.xml";
        //获取配置文件流
        InputStream resources = Resources.class.getResourceAsStream(file);
        //创建SqlSessionFactory对象
        //创建工厂mybatis使用了构建者模式
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory;
        factory = builder.build(resources);
        //使用工厂产生sqlsession对象
        SqlSession session=factory.openSession();
        //使用SqlSession创建Dao接口的代理对象
        usrDao us=session.getMapper(usrDao.class);
        us.updatUser(user);
        //mybatis执行更新操作,需要提交事务
        session.commit();
        //释放资源
        session.close();
        resources.close();
    }
    public  static void delete() throws Exception{
        //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
        //第二个:使用ServletContext对象的getRealPath()
        String file = "/mybatis.xml";
        //获取配置文件流
        InputStream resources = Resources.class.getResourceAsStream(file);
        //创建SqlSessionFactory对象
        //创建工厂mybatis使用了构建者模式
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory;
        factory = builder.build(resources);
        //使用工厂产生sqlsession对象
        SqlSession session=factory.openSession();
        //使用SqlSession创建Dao接口的代理对象
        usrDao us=session.getMapper(usrDao.class);
        us.deleteUser(1);
        //mybatis执行更新操作,需要提交事务
        session.commit();
        //释放资源
        session.close();
        resources.close();
    }
}

插入操作注意:

  • 在映射文件中使用parameterType属性指定要插入的数据类型
  • sql语句中使用#{实体属性名}方式引用实体中的属性值
  • 插入操作涉及数据库变化,所以使用sqlsession对象显示的提交事务,即sqlsession.commit()

删除操作注意:

  • sql语句中使用#{任意字符串}方式传递的单个参数

Mybastic核心配置文件概述

概述:

[图片上传失败...(image-aa1d35-1619415469299)]

MyBatis常用配置解析

1、environments标签

数据库环境的配置,支持多环境配置

[图片上传失败...(image-b85721-1619415469299)]

事务管理器(transactionManager)类型有两种:

  • JDBC:这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域;
  • MANAGED:这个配置几乎没做什么

数据源(dataSource)类型有三种:

  • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
  • POOLED:这种数据源的实现利用“池”的概念将JDBC连接对象组织起来。

2、mapper标签

加载映射文件mapper,加载方式有如下几种:

  • 相对于类路径的资源;<mapper resource="com/mapp/userMapper.xml"/>
  • 使用完全限定资源定位符;<mapper url="file:///com/mapp/userMapper.xml"/>
  • 使用映射器接口实现类的完全限定类名;<mapper class="com.mapp.userMapper"/>
  • 将包内的映射器接口实现全部注册为映射器;<mapper name="com.mapp"/>

3、Properties标签

实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载配置的properties文件

[图片上传失败...(image-e9fa0-1619415469299)]

4、typeAliases标签

类型别名是为java类型设置一个短的名字。原来的类型名称配置如下

[图片上传失败...(image-f58aec-1619415469299)]

MyBatis相应API

1、SqlSession工厂构建器SqlSessionFactoryBuilder

[图片上传失败...(image-7aa565-1619415469299)]

2、sqlsession工厂对象sqlsessionFactory

[图片上传失败...(image-6fe883-1619415469299)]

3、sqlsession会话对象

[图片上传失败...(image-9a97a-1619415469299)]

Mybatis的Dao层实现

传统开发方式

编写UserDao接口

public interface usrDao {
    public List<User> findAll();
    public void addUser(User user);
    public void updatUser(User user);
    public void deleteUser(Integer id);
}

编写对应的实现类

public class userDaoImpl implements usrDao{

    public List<User> findAll() throws Exception {
        //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
        //第二个:使用ServletContext对象的getRealPath()
        String file = "/mybatis.xml";
        //获取配置文件流
        InputStream resources = Resources.class.getResourceAsStream(file);
        //创建SqlSessionFactory对象
        //创建工厂mybatis使用了构建者模式
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory;
        factory = builder.build(resources);
        //使用工厂产生sqlsession对象
        SqlSession session=factory.openSession();
        //使用SqlSession创建Dao接口的代理对象
        usrDao us=session.getMapper(usrDao.class);
        //使用代码对象执行方法
        List<User> users=us.findAll();
        return users;
    }

    public void addUser(User user) {

    }

    public void updatUser(User user) {

    }

    public void deleteUser(Integer id) {

    }
}

再根据实现类去调用对应的方法。

代理开发方式

Mapper接口开发方法只需要编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、Mapper.xml文件中namespace与mapper接口的全限定名相同

2、mapper接口方法名和Mapper.xml中定义的statement的id相同

3、mapper接口方法输入的参数与Mapper.xml中parameterType一致

4、mapper接口方法输出的参数与Mapper.xml中resultType一致

实现:

userMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.controller.usrDao">
    <select id="findAll" resultType="com.dao.User">
        select * from user
    </select>
    <insert id="addUser" parameterType="com.dao.User">
        insert into user values (#{id},#{username},#{password})
    </insert>
    <update id="updatUser" parameterType="com.dao.User">
        update user set username=#{username},password=#{password} where id=#{id}
    </update>
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id}
    </delete>
</mapper>

mapper接口----usrDao.class

public interface usrDao {
    List<User> findAll() throws Exception;
    void addUser(User user);
    void updatUser(User user);
    void deleteUser(Integer id);
}

使用时需要对dao进行实现

//使用SqlSession创建Dao接口的代理对象
usrDao us=session.getMapper(usrDao.class);

[图片上传失败...(image-342e08-1619415469299)]

Mybatis隐射文件深入

动态sql语句

  • if
  • foreach

动态SQL之if

如传入查询的条件可能传入多个查询条件,如 id= and username =

<select id="finduer" resultType="com.dao.User" parameterType="com.dao.User">
    select * from user
    <where>
        <if test="id!=0">
            and id=#{id}
        </if>
        <if test="username!=null">
            and username=#{username}
        </if>
        <if test="password!=null">
            and password=#{password}
        </if>
    </where>
</select>

动态SQL之foreach

要查询的条件有多个,如id=1 or id=2...

<select id="findByids" resultType="com.dao.User" parameterType="list">
    select * from user
    <where>
       <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
       </foreach>
    </where>
</select>
接口:List<User> findByids(List<Integer> id);
测试:List<Integer> list = new ArrayList<Integer>();
        list.add(2);
        list.add(3);
        findbyids(list);

SQL片段抽取

sql中可以将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

<!-- sql语句的抽取-->
 <sql id="selectUser">select * from user</sql>
    
 <select id="findAll" resultType="com.dao.User">
     <include refid="selectUser"/>
 </select>

Mybatis核心配置文件深入

typeHandlers标签

无论mybatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成java类型。

[图片上传失败...(image-f7616d-1619415469299)]

plugins标签

Mybatis可以使用第三方插件对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据

开发步骤:

①导入通用PageHelper的坐标

②在mybatis核心配置文件中配置pageHelper插件

③测试分页数据获取

导入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>
<dependency>
     <groupId>net.sf.jsqlparser</groupId>
     <artifactId>jsqlparser</artifactId>
     <version>0.8.0</version>
</dependency>

在mybatis核心配置文件中配置pageHelper插件

<!--配置分页助手插件-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
    </plugin>
</plugins>

测试分页数据获取

public static void queryAll() throws Exception {
    //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
    //第二个:使用ServletContext对象的getRealPath()
    String file = "/mybatis.xml";
    //获取配置文件流
    InputStream resources = Resources.class.getResourceAsStream(file);
    //创建SqlSessionFactory对象
    //创建工厂mybatis使用了构建者模式
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory;
    factory = builder.build(resources);
    //使用工厂产生sqlsession对象
    SqlSession session=factory.openSession();
    //使用SqlSession创建Dao接口的代理对象
    usrDao us=session.getMapper(usrDao.class);

    //设置分页相关参数,当前页+每页显示的条数
    PageHelper.startPage(1,3);
    
    //使用代码对象执行方法
    List<User> users=us.findAll();
    for(User user:users){
        System.out.println(user);
    }
    //释放资源
    session.close();
    resources.close();
}
/*获取分页相关参数*/
PageInfo<User> pageInfo=new PageInfo<User>();
System.out.println("当前页"+pageInfo.getPageNum());
System.out.println("每页显示条数"+pageInfo.getPageSize());
System.out.println("总条数"+pageInfo.getTotal());
System.out.println("总页数"+pageInfo.getPages());
System.out.println("上一页"+pageInfo.getPrePage());
System.out.println("下一页"+pageInfo.getNextPage());
System.out.println("是否是第一页"+pageInfo.isIsFirstPage());
System.out.println("是否是最后一页"+pageInfo.isIsLastPage());

Mybatis多表操作

一对一查询

<mapper namespace="com.controller.taskDao">
    <resultMap id="taskMap" type="task">
        <!--手动指定字段与实体属性的映射关系
            column:数据表的字段名称
            property:实体的属性名称
        -->
        <id column="tid" property="id"></id>
        <result column="userid" property="userid"></result>
        <result column="taskname" property="taskname"></result>
        <result column="taskexplain" property="taskexplain"></result>
        <result column="taskstatus" property="taskstatus"></result>
        <result column="taskresult" property="taskresult"></result>
        <result column="tasktime" property="tasktime"></result>
        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>
    </resultMap>
    
    <select id="findAll" resultMap="taskMap">
        SELECT *,t.id tid FROM task t,USER u WHERE t.userid=u.id
    </select>
</mapper>

另外一种写法:

<mapper namespace="com.controller.taskDao">
    <resultMap id="taskMap" type="task">
        <!--手动指定字段与实体属性的映射关系
            column:数据表的字段名称
            property:实体的属性名称
        -->
        <id column="tid" property="id"></id>
        <result column="userid" property="userid"></result>
        <result column="taskname" property="taskname"></result>
        <result column="taskexplain" property="taskexplain"></result>
        <result column="taskstatus" property="taskstatus"></result>
        <result column="taskresult" property="taskresult"></result>
        <result column="tasktime" property="tasktime"></result>
<!--        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>-->
        <association property="user" javaType="user">
            <id column="uid" property="id"></id>
            <result column="uid" property="user.id"></result>
            <result column="username" property="username"></result>
            <result column="password" property="password"></result>
        </association>
    </resultMap>
    
    <select id="findAll" resultMap="taskMap">
        SELECT *,t.id tid FROM task t,USER u WHERE t.userid=u.id
    </select>
</mapper>

一对多

<resultMap id="userMapper" type="com.dao.User">
    <id column="uid" property="id"></id>
    <result column="username" property="username"></result>
    <result column="password" property="password"></result>
   <!-- 配置集合信息
        property:集合名称
   -->
    <collection property="taskList" ofType="com.dao.Task">
        <id column="tid" property="id"></id>
        <result column="userid" property="userid"></result>
        <result column="taskname" property="taskname"></result>
        <result column="taskexplain" property="taskexplain"></result>
        <result column="taskstatus" property="taskstatus"></result>
        <result column="taskresult" property="taskresult"></result>
        <result column="tasktime" property="tasktime"></result>
    </collection>
</resultMap>

 <!--一对多查询-->
<select id="findUser" resultMap="">
select * from user u,task t where u.id=t.userid
</select>

多对多

总结

image.png

Mybatis注解开发

常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写mapper映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。

@insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@result一起使用,封装多个

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

注解开发-xml完成基本的crud

1、使用@Before来优化测试

public class testUser {
    usrDao us;
    @Before
    public void before(){
        //第一个:加载配置文件使用类加载器,只能读类路径的配置文件
        String file = "/mybatis.xml";
        InputStream in= Resources.class.getResourceAsStream(file);
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        SqlSessionFactory factory;
        factory = builder.build(in);
        //使用工厂产生sqlsession对象
        SqlSession session=factory.openSession();
        //使用SqlSession创建Dao接口的代理对象
        us=session.getMapper(usrDao.class);
    }
    @Test
    public void insert(){
        //模拟user对象
        User user=new User();
        user.setUsername("lili9");
        user.setPassword("222");
        us.addUser(user);
        /*    session.insert("usrDao.addUser",user);*/
    }

    @Test
    public void query()throws Exception{
        //使用代码对象执行方法
        List<User> users=us.findAll();
        for(User user:users){
            System.out.println(user);
        }
    }

    @Test
    public void modify() throws Exception{
        //模拟user对象
        User user=new User();
        user.setId(2);
        user.setUsername("lili2");
        user.setPassword("222");
        us.updatUser(user);
    }

    @Test
    public void delete()throws Exception{
        us.deleteUser(2);
    }

}

使用简单注解来

1、修改Mybatis.xml

<mappers>
    <package name="com.controller"/>
</mappers>

2、配置下User的接口

public interface usrDao {
    @Select("select * from user")
    List<User> findAll() throws Exception;
    
    @Insert("insert into user values (#{id},#{username},#{password})")
    void addUser(User user);
    
    @Update("update user set username=#{username},password=#{password} where id=#{id}")
    void updatUser(User user);
    
    @Delete("delete from user where id=#{id}")
    void deleteUser(Integer id);
}

3、进行测试

Mybatis的注解实现复杂映射开发

实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系配置

@Results:代替的是标签<resultMap>该注解中可以使用当个@result注解,也可以使用@result集合,使用格式:

@Results({
    @Result(),
    @Result(),
    @Result()
})

@Result:代替了<id>标签和<result>标签,

            @Result属性有:column:数据库的列名;property:需要装配的属性名;one:需要使用的@One注解(@Result(one=@One)());many:需要使用的@Many注解

一对一封装

1、修改taskDao

public interface taskDao {
    @Select("SELECT *,t.id tid FROM task t,USER u WHERE t.userid=u.id")
    @Results({
        @Result(column="tid",property="id"),
        @Result(column="userid",property="userid"),
        @Result(column="taskname",property="taskname"),
        @Result(column="taskexplain",property="taskexplain"),
        @Result(column="taskstatus", property="taskstatus"),
        @Result(column="taskresult", property="taskresult"),
        @Result(column="tasktime", property="tasktime"),
        @Result(column="uid", property="user.id"),
        @Result(column="username", property="user.username"),
        @Result(column="password", property="user.password")
    })
    List<Task> findAll();
}

另外一种方式:

public interface taskDao {
    @Select("SELECT *,t.id tid FROM task t,USER u WHERE t.userid=u.id")
    @Results({
        @Result(column="tid",property="id"),
        @Result(column="userid",property="userid"),
        @Result(column="taskname",property="taskname"),
        @Result(column="taskexplain",property="taskexplain"),
        @Result(column="taskstatus", property="taskstatus"),
        @Result(column="taskresult", property="taskresult"),
        @Result(column="tasktime", property="tasktime"),
        @Result(
                property = "userList",//要封装的属性名称
                column = "uid",//根据哪个字段去查询User表的数据
                javaType = User.class,//要封装的实体类
                //select属性 代表查询那个接口的方法获取数据
                one = @One(select = "com.controller.userDao.findUserByid")
        )
    })
    List<Task> findAll();
}

一对多

@Select("select * from user u,task t where u.id=t.userid")
@Results({
        @Result(column="uid",property="id"),
        @Result(column="username",property="username"),
        @Result(column="password",property="password"),
        @Result(
                property = "taskList",//要封装的属性名称
                column = "tid",//根据哪个字段去查询User表的数据
                javaType = Task.class,//要封装的实体类
                //select属性 代表查询那个接口的方法获取数据
                many = @Many(select = "com.controller.taskDao.findTaskAll")
        )
})
List<User> findUser();
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容