Ego的MyBatis框架笔记

MyBatis

​ 简介:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录。

开发步骤

  1. 添加MyBatis坐标
  2. 创建user数据表
  3. 编写User实体类
  4. 编写映射文件UserMapper.xml
  5. 编写核心文件SqlMapConfig.xml
  6. 编写测试类
<?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="userMapper">
    <select id="findAll" resultType="com.ego.domain.User">
        select * from student
    </select>
</mapper>
<?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">
<configuration>

    <!--加载外部资源文件-->
    <properties resource="jdbc.properties"></properties>

    <!--数据源环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>


    <!--加载映射文件-->
    <mappers>
        <mapper resource="com.ego.mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>
jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=test
jdbc.username=sa
jdbc.password=root
package com.ego;

import com.ego.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public class MybatisTest {

    @Test
    public void test1() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操操作   参数:namespace + id
        List<User> list = sqlSession.selectList("userMapper.findAll");
        //打印数据
        for (User user : list) {
            System.out.println(user.toString());
        }
        //释放资源
        sqlSession.close();
    }
}

增删改查操作

package com.ego;

import com.ego.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public class MybatisTest {

    @Test
    public void test1() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操操作   参数:namespace + id
        List<User> list = sqlSession.selectList("userMapper.findAll");
        //打印数据
        for (User user : list) {
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();
    }

    @Test
    public void test2() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操操作   参数:namespace + id
        User user = new User(4, "ego", 21);
        sqlSession.insert("userMapper.save", user);

        //提交事务
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

    @Test
    public void test3() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操操作   参数:namespace + id
        User user = new User(1, "ego123", 100);
        sqlSession.update("userMapper.update", user);

        //提交事务
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }


    @Test
    public void test4() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操操作   参数:namespace + id
        User user = new User();
        user.setId(4);
        sqlSession.update("userMapper.delete", user);

        //提交事务
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

}

<?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="userMapper">

    <!--删除操作-->
    <delete id="delete" parameterType="java.lang.Integer">
        delete from student where id = #{id}
    </delete>

    <!--修改操作-->
    <update id="update" parameterType="com.ego.domain.User">
        update student set name = #{name}, age = #{age} where id = #{id}
    </update>

    <!--插入操作-->
    <insert id="save" parameterType="com.ego.domain.User">
        insert into student values (#{id}, #{name}, #{age})
    </insert>


    <!--查询操作-->
    <select id="findAll" resultType="com.ego.domain.User">
        select * from student
    </select>
</mapper>
typeAliases标签:设置类型别名
<typeAliases>
        <typeAlias type="com.ego.domain.User" alias="user"></typeAlias>
    </typeAliases>

注意要放在properties下面

Dao层实现

传统方式
package com.ego.dao;

import com.ego.domain.User;

import java.io.IOException;
import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public interface UserMapper {
    public List<User> findAll() throws IOException;
}

package com.ego.dao.impl;

import com.ego.dao.UserMapper;
import com.ego.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


/**
 * @author 袁梦达 2019012364
 */
public class UserMapperImpl implements UserMapper {
    public List<User> findAll() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list = sqlSession.selectList("userMapper.findAll");
        return list;
    }
}

package com.ego.service;

import com.ego.dao.impl.UserMapperImpl;
import com.ego.domain.User;

import java.io.IOException;
import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public class ServiceDemo {
    public static void main(String[] args) throws IOException {
        UserMapperImpl userMapper = new UserMapperImpl();
        List<User> users = userMapper.findAll();
        System.out.println(users);
    }
}

代理开发方式

采用Mybatis的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流。

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

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

  1. Mapper.xml文件中的namespace与mapper接口的全限定名相同
  2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  3. Mapper接口方法的输入参数类型和mapper.xmI中定义的每个sql的parameterType的类型相同
  4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
package com.ego.dao;

import com.ego.domain.User;

import java.io.IOException;
import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public interface UserMapper {
    public List<User> findAll();
    public User findById(int id);
}

<?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.ego.dao.UserMapper">

    <select id="findAll" resultType="com.ego.domain.User">
        select * from student
    </select>

    <select id="findById" parameterType="int" resultType="com.ego.domain.User">
        select * from student where id = #{id}
    </select>
</mapper>
package com.ego.service;

import com.ego.dao.UserMapper;
import com.ego.dao.impl.UserMapperImpl;
import com.ego.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public class ServiceDemo {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        List<User> users = mapper.findAll();
        System.out.println(users);
        User user = mapper.findById(1);
        System.out.println(user);
    }
}

映射文件深入

动态sql
if
<?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.ego.mapper.UserMapper">
    <select id="findByCondition" parameterType="com.ego.domain.User" resultType="com.ego.domain.User">
        select * from student
        <where>
            <if test="id != 0">
                and id = #{id}
            </if>
            <if test="name != null">
                and name = #{name}
            </if>
            <if test="age != null">
                and age = #{age}
            </if>
        </where>

    </select>

</mapper>
foreach
<?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.ego.mapper.UserMapper">
    <select id="findByCondition" parameterType="com.ego.domain.User" resultType="com.ego.domain.User">
        select * from student
        <where>
            <if test="id != 0">
                and id = #{id}
            </if>
            <if test="name != null">
                and name = #{name}
            </if>
            <if test="age != null">
                and age = #{age}
            </if>
        </where>

    </select>

    <select id="findByIds" parameterType="list" resultType="com.ego.domain.User">
        select * from student
        <where>
            <foreach collection="list" open="age in(" close=")" item="age" separator=",">
                #{age}
            </foreach>
        </where>

    </select>

</mapper>
sql片段抽取
<?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.ego.mapper.UserMapper">
    <sql id="selectStudent">select * from student</sql>
    <select id="findByCondition" parameterType="com.ego.domain.User" resultType="com.ego.domain.User">
        <include refid="selectStudent"></include>
        <where>
            <if test="id != 0">
                and id = #{id}
            </if>
            <if test="name != null">
                and name = #{name}
            </if>
            <if test="age != null">
                and age = #{age}
            </if>
        </where>

    </select>

    <select id="findByIds" parameterType="list" resultType="com.ego.domain.User">
        <include refid="selectStudent"></include>
        <where>
            <foreach collection="list" open="age in(" close=")" item="age" separator=",">
                #{age}
            </foreach>
        </where>

    </select>

</mapper>

核心配置文件深入

TypeHandler

当我们在javabean中自定义了枚举类型或者其它某个类型,但是在数据库中存储时往往需要转换成数据库对应的类型,并且在从数据库中取出来时也需要将数据库类型转换为javabean中的对应类型。比如:javabean中字段类型为Date,数据库中存储的是varchar类型;javabean中字段类型是Enum,数据库中存储的是String或者Integer。因为有大量类似数据的转换,手动转换类型进行存储和查询已经过于麻烦。MyBatis为我们提供了解决办法:TypeHandler类型处理器。

MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值。MyBatis 内置了大部分基本类型的类型处理器,所以对于基本类型可以直接处理,当我们需要处理其他类型的时候就需要自定义类型处理器。

#####开发步骤

  1. 定义转换类继承类BaseTypeHandler<T
  2. 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java的Type类型的方法
  3. 在MyBatis核心配置文件中进行注册
  4. 测试转换是否正确
package com.ego.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

/**
 * @author 袁梦达 2019012364
 */
public class DateTypeHandler extends BaseTypeHandler<Date> {

    //将java数据转换到数据库类型
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        long time = date.getTime();
        preparedStatement.setLong(i, time);
    }

    //将数据库类型转换到java类型
    @Override
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        long aLong = resultSet.getLong(s);
        return new Date(aLong);
    }

    //将数据库类型转换到java类型
    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        long aLong = resultSet.getLong(i);
        return new Date(aLong);
    }

    //将数据库类型转换到java类型
    @Override
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        long aLong = callableStatement.getLong(i);
        return new Date(aLong);
    }
}

<?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">
<configuration>

    <!--加载外部资源文件-->
    <properties resource="jdbc.properties"></properties>

    <!--注册类型处理器-->
    <typeHandlers>
        <typeHandler handler="com.ego.handler.DateTypeHandler"></typeHandler>
    </typeHandlers>

    <!--数据源环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>


    <!--加载映射文件-->
    <mappers>
        <mapper resource="com.ego.mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>
<?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.ego.mapper.UserMapper">
   <insert id="save" parameterType="com.ego.domain.User">
       insert into student values(#{id}, #{name}, #{age}, #{birthday})
   </insert>

    <select id="findById" parameterType="int" resultType="com.ego.domain.User">
        select * from student where id = #{id}
    </select>
</mapper>
package com.ego.domain;

import java.util.Date;

/**
 * @author 袁梦达 2019012364
 */
public class User {

    private int id;
    private String name;
    private int age;
    private Date birthday;

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public User(int id, String name, int age, Date birthday) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public User() {
    }


    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

package com.ego.mapper;

import com.ego.domain.User;

import java.util.List;

/**
 * @author 袁梦达 2019012364
 */
public interface UserMapper {
    public List<User> findByCondition(User user);

    public List<User> findByIds(List<Integer> list);

    public void save(User user);

    public User findById(int id);
}

package com.ego;

import com.ego.domain.User;
import com.ego.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;


/**
 * @author 袁梦达 2019012364
 */
public class MapperTest {
    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactoryBuilder.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User user = new User();
        user.setId(5);
        user.setName("sbzj");
        user.setAge(22);
        user.setBirthday(new Date());
        mapper.save(user);

        sqlSession.commit();
        sqlSession.close();


    }

    @Test
    public void test2() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactoryBuilder.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User user = mapper.findById(4);
        System.out.println(user.getBirthday());
    }
}

####plugins标签

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

开发步骤
  1. 导入通用PageHelper坐标
  2. 在mybatis核心配置文件中配置PageHelper插件
  3. 测试分页数据获取
多表查询
一对一

第一种写法

<?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.ego.mapper.OrderMapper">

    <resultMap id="orderMap" type="com.ego.domain.Order">
        <!--手动指定字段与实体属性的映射关系-->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
        <result column="uid" property="user.id"></result>
        <result column="name" property="user.name"></result>
        <result column="age" property="user.age"></result>
    </resultMap>
    
    <select id="findAll" resultMap="orderMap">
        select *, o.id oid
        from orders o, student s
        where o.uid = s.id;
    </select>

</mapper>

第二种写法

<?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.ego.mapper.OrderMapper">

    <resultMap id="orderMap" type="com.ego.domain.Order">
        <!--手动指定字段与实体属性的映射关系-->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
<!--        <result column="uid" property="user.id"></result>-->
<!--        <result column="name" property="user.name"></result>-->
<!--        <result column="age" property="user.age"></result>-->
        <!--property:Order中的user(private User user), javaType是类名-->
        <association property="user" javaType="com.ego.domain.User">
            <id column="uid" property="id"></id>
            <result column="name" property="name"></result>
            <result column="age" property="age"></result>
        </association>
    </resultMap>
    
    <select id="findAll" resultMap="orderMap">
        select *, o.id oid
        from orders o, student s
        where o.uid = s.id;
    </select>

</mapper>
一对多
<?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.ego.mapper.UserMapper">
   
    <resultMap id="userMap" type="com.ego.domain.User">

        <id column="uid" property="id"></id>
        <result column="name" property="name"></result>
        <result column="age" property="age"></result>
        <collection property="orderList" ofType="com.ego.domain.Order">
            <id column="oid" property="id"></id>
            <result column="ordertime" property="ordertime"></result>
            <result column="total" property="total"></result>
        </collection>
    </resultMap>
    
    <select id="findAll" resultMap="userMap">
        select *, orders.id oid
        from orders, student
        where orders.uid = student.id;
    </select>
</mapper>

MyBatis注解开发

常用注解

@Insert 实现新增

@Update 实现更新

@Delete 实现删除

@Select 实现查询

@Result 实现结果集封装

@Results 可以与@Result一起使用,封装多个结果集

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

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

public interface UserDao{
    // 查询所有用户
    @Select("select * from user")
    public List<User> findAll();
    
    // 根据id查询用户
    @Select("select * from user where id = #{id}")
    public User findById(int id);
    
    // 删除
    @Delete("delete from user where id = #{id})
    public void delUser(int id);
    
    // 添加
    @Insert("insert into user(username,sex) values(#{username},#{sex})
    public void save(User user);
    
    // 更新
    @Update("update user set username = #{username},sex=#{sex} where id = #{id}")
    public void updateUser(User user);
    
}

一对一
public interface IAccountDao {

    /**
     * 查询所有账户,并且获取每个账户下的用户信息,一对一
     * @return
     */
    @Select("select * from account")
    @Results(id="accountMap",value = {
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "uid",property = "uid"),
            @Result(column = "money",property = "money"),
            @Result(property = "user",column = "uid",one=@One(select="com.keafmd.dao.IUserDao.findById",fetchType= FetchType.EAGER))
    })
    List<Account> findAll();

}
public interface IAccountDao {

    /**
     * 查询所有账户,并且获取每个账户下的用户信息,一对一 ,* 这里用不到这个findAll()
     * @return
     */
    @Select("select * from account")
    @Results(id="accountMap",value = {
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "uid",property = "uid"),
            @Result(column = "money",property = "money"),
            @Result(property = "user",column = "uid",one=@One(select="com.keafmd.dao.IUserDao.findById",fetchType= FetchType.EAGER))
    })
    List<Account> findAll();


    /**
     * 根据用户id查询账户信息
     * @param userId
     * @return
     */
    @Select("select * from account where uid = #{userId}")
    List<Account> findAccountByUid(Integer userId);

}

一对多
package com.keafmd.dao;

import com.keafmd.domain.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface IUserDao {

    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    @Results(id="userMap",value={
            @Result(id = true,column = "id",property = "userId"),
            @Result(column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "birthday",property = "userBirthday"),
            @Result(property = "accounts" ,column = "id",
                    many = @Many(select = "com.keafmd.dao.IAccountDao.findAccountByUid",
                            fetchType = FetchType.LAZY))

    })
    List<User> findAll();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ego-Planner是一个基于ROS的路径规划器,它可以在给定的地图和起点、终点信息下,生成一条可行的路径。以下是Ego-Planner的代码框架: 1. 首先需要定义一个EgoPlanner类,其中包含了一些必要的成员变量和函数。 ```c++ class EgoPlanner { private: ros::NodeHandle nh_; ros::Subscriber sub_map_; ros::Subscriber sub_pose_; ros::Subscriber sub_goal_; ros::Publisher pub_path_; nav_msgs::OccupancyGrid map_; geometry_msgs::PoseStamped start_; geometry_msgs::PoseStamped goal_; public: EgoPlanner(); // 构造函数 ~EgoPlanner(); // 析构函数 void mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg); // 地图回调函数 void poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); // 当前位置回调函数 void goalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); // 目标位置回调函数 void plan(); // 路径规划函数 }; ``` 2. 在构造函数中,需要完成ROS节点的初始化、订阅和发布话题的设置。 ```c++ EgoPlanner::EgoPlanner() { nh_ = ros::NodeHandle("~"); sub_map_ = nh_.subscribe("map", 1, &EgoPlanner::mapCallback, this); sub_pose_ = nh_.subscribe("pose", 1, &EgoPlanner::poseCallback, this); sub_goal_ = nh_.subscribe("goal", 1, &EgoPlanner::goalCallback, this); pub_path_ = nh_.advertise<nav_msgs::Path>("path", 1); } ``` 3. 在地图、当前位置和目标位置的回调函数中,需要将接收到的信息保存到对应的成员变量中。 ```c++ void EgoPlanner::mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg) { map_ = *msg; } void EgoPlanner::poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) { start_ = *msg; } void EgoPlanner::goalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) { goal_ = *msg; } ``` 4. 在路径规划函数中,需要调用路径规划算法,生成一条可行的路径,并将路径发布出去。 ```c++ void EgoPlanner::plan() { // 调用路径规划算法,生成一条可行的路径 std::vector<geometry_msgs::PoseStamped> path = pathPlanning(map_, start_, goal_); // 将路径发布出去 nav_msgs::Path path_msg; path_msg.header.frame_id = "map"; path_msg.header.stamp = ros::Time::now(); path_msg.poses = path; pub_path_.publish(path_msg); } ``` 5. 在主函数中,创建EgoPlanner对象,并进入ROS循环。 ```c++ int main(int argc, char** argv) { ros::init(argc, argv, "ego_planner"); EgoPlanner planner; ros::Rate rate(10); while (ros::ok()) { planner.plan(); ros::spinOnce(); rate.sleep(); } return 0; } ``` 以上就是Ego-Planner的代码框架,其中路径规划算法需要根据具体情况进行选择和实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值