• 11、mybatis的映射xml中参数类型的别名


    在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。

    如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

    在mybatis的开发中, 实体类对应的映射xml配置文件(比如UserMapper.xml等)里面的sql语句(比如:

    <select id="findUserByid"  parameterType="int" resultType="store.cloudspace.pojo.User">
         SELECT * FROM USE WHERE id = #{id}
    </select>
    )都需要有输入/输出参数类型(上面的parameterType/resultType)。其中前者完整的写法应该是:parameterType="java.lang.Integer",但是在这里mybatis已经自动转换了,mybatis支持自动的类型有:

    所以入参的类型一般不需要我们转换,但是输出参数的类型却需要我们做一些事情,因为输出参数大部分是某个包里面的实体类型。那么,我们该如何自定义这些类型呢?

    返回值

    返回值用resultType指定其类型,类型为简单类型,map,类等。

    类型的形式为:

    string  java.lang.String

    int     java.lang.Integer

    ...

    map    java.util.Map

    类    类的全路径,如self.exercise.model.User

    举例说明:

    返回值只是一个简单的数据类型。

    <select id="getUserName" resultType="string">
        select user_name from user where id = 1
    </select>
    String userName = sqlSession.selectOne("self.eercise.dao.UserDao.getUserName");

    如果是多个字段对应的多个返回值,可以返回值类型设为map或类。

    返回值为map,字段名会自动映射成key,属性名映射为key值;返回值为类,类中的变量名必须跟数据库中的字段名或者字段别名相同才可以,否则即使数据库中的字段值不为空,在类中对应的变量值也为空。

    如果返回值不止一个,而是多个记录的结果集,返回值类型应设为为泛型,得到的结果集会自动封装到List集合中。

    <select id="load_map" resultType="map" parameterType="map">
        select * from user where id = #{id} and account = #{account}
    </select>
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("id", 1);
    map.put("account", "dva");
    List<Map<String, Object>> listMap = sqlSession.selectList("self.exercise.dao.UserDao.load_map", map);

    参数

    当只有一个参数时,参数类型用parameterType指定类型,可以是简单类型,map或者对象。

    如果参数是一个简单的数据类型,那么#{param}中的param可以任意取名。

    <select id="getUserName" resultType="string" parameterType="int">
        select user_name from user where id = #{id}
    </select>
    String userName = sqlSession.selectOne("self.exercise.dao.UserDao.getUserName",1);

    另外,在参数是一个简单类型的情况下,如果控制台报如下错误:

    Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'user_name' in 'class java.lang.String'

    那么要将param改名为_parameter,具体原因还不清楚。。。在何种情况下使用也不清楚,目前我只能通过控制台报错来获取线索。如果有知道的dalao还请告知,谢谢。

    如果有多个参数,有两种方法可以实现传参。

    一  可以将参数封装到map或者类中

    在parameterType中指明容器的类型即可;param取名要与map中的key或者类中的变量名相同,这样获取值时才会正确映射。例如上面load_map的例子。

    二  直接传递参数,这种方式只有接口代理的才能使用。

    这种情况下不用在映射文件中指明参数类型,又分三种解决方式。

    (一)用0,1,2....来指明第几个参数

    //接口中的方法
    User getUser(String user_name,String account);

    映射文件中的语句应为

    <select id="getUser" resultType="sel.exercise.dao.UserDao">
        select user_name from user where user_name = #{0} and account = #{1}
    </select>

    (二)用param1,param2...来代替参数

    //接口中的方法
    User getUser(String user_name,String account);

    映射文件中的语句应为

    <select id="getUser" resultType="sel.exercise.dao.UserDao" >
        select user_name from user where user_name = #{param1} and account = #{param2}
    </select>

    前两种方式,where语句中字段名的顺序必须严格遵循接口中方法参数的顺序。

    (三)@Param方法进行映射

    //接口中的方法
    User getUser(@Param("userName") String user_name,@Param("account") String account);

    映射文件中的语句应为

    <select id="getUser" resultType="sel.exercise.dao.UserDao" >
        select user_name from user where user_name = #{userName} and account = #{account}
    </select>

    注意,#{param}中的param名为@Param方法映射出的新的参数名

  • 相关阅读:
    Java验证码
    Java内存泄漏问题
    Java常见异常总结
    Java编码与乱码问题
    Spring:源码解读Spring IOC原理
    Quartz 定时邮件发送多个备份文件
    spring-boot 多线程
    java并发基础
    Java多线程中wait语句的具体使用技巧
    多线程的死锁
  • 原文地址:https://www.cnblogs.com/holly8/p/10523592.html
Copyright © 2020-2023  润新知