精华内容
下载资源
问答
  • parametertype
    千次阅读
    2018-05-23 22:00:44

    CRUD标签都有一个属性parameterType,statement通过它指定接收的参数类型。
    接收参数的方式有两种:

    1、 #{}预编译
    2、${}非预编译(直接的sql拼接,不能防止sql注入)

    参数类型有三种:

    1、 基本数据类型
    2、 HashMap(使用方式和pojo类似
    3、 Pojo自定义包装类型

    ${}和#{}的5个区别:

    1、 预编译和非预编译
    2、 编译成占位符,直接拼接
    3、 防sql注入和不防的区别
    4、 自动判断参数类型,一个需要自行判断
    5、 一个参数时#{}可以使用任意名称接收参数,${}只能使用value

    对于基本数据类型和String类型 因为没有set方法(#{}和${}底层是用set来取形参的值)
    所以最终的解决方法是:
    在Mapper接口的方法中给形参加上@Param注解

    User login(@Param("userName")String userName,@Param("password")String password);
    
    更多相关内容
  • 本文详细介绍了在Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式,以及如何实现的案列,同时#和$传参的区别。
  • 主要给大家介绍了关于MyBatis中传入参数parameterType类型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • mapper parameterType

    2021-05-31 14:54:44
    Mybatis的Mapper文件中的select、insert、update、delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型。本文主要给大家介绍了关于MyBatis传入参数parameterType类型的相关内容,分享出来...

    前言

    Mybatis的Mapper文件中的select、insert、update、delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型。本文主要给大家介绍了关于MyBatis传入参数parameterType类型的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

    1. MyBatis的传入参数parameterType类型分两种

       1. 1. 基本数据类型:int,string,long,Date;

       1. 2. 复杂数据类型:类和Map

    2. 如何获取参数中的值:

       2.1  基本数据类型:#{参数} 获取参数中的值

       2.2  复杂数据类型:#{属性名}  ,map中则是#{key}

    3.案例:

     3.1 基本数据类型案例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <sql id="Base_Column_List" >

     id, car_dept_name, car_maker_name, icon,car_maker_py,hot_type

     </sql>

     <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >

     select

     <include refid="Base_Column_List" />

     from common_car_make

     where id = #{id,jdbcType=BIGINT}

     </select>

     3.2 复杂类型--map类型    

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    <select id="queryCarMakerList" resultMap="BaseResultMap" parameterType="java.util.Map">

      select

      <include refid="Base_Column_List" />

      from common_car_make cm

      where 1=1

      <if test="id != null">

       and cm.id = #{id,jdbcType=DECIMAL}

      </if>

      <if test="carDeptName != null">

       and cm.car_dept_name = #{carDeptName,jdbcType=VARCHAR}

      </if>

      <if test="carMakerName != null">

       and cm.car_maker_name = #{carMakerName,jdbcType=VARCHAR}

      </if>

      <if test="hotType != null" >

       and cm.hot_type = #{hotType,jdbcType=BIGINT}

      </if>

      ORDER BY cm.id

     </select>

      3.3 复杂类型--类类型

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    <update id="updateByPrimaryKeySelective" parameterType="com.epeit.api.model.CommonCarMake" >

     update common_car_make

     <set >

      <if test="carDeptName != null" >

      car_dept_name = #{carDeptName,jdbcType=VARCHAR},

      </if>

      <if test="carMakerName != null" >

      car_maker_name = #{carMakerName,jdbcType=VARCHAR},

      </if>

      <if test="icon != null" >

      icon = #{icon,jdbcType=VARCHAR},

      </if>

      <if test="carMakerPy != null" >

       car_maker_py = #{carMakerPy,jdbcType=VARCHAR},

      </if>

      <if test="hotType != null" >

       hot_type = #{hotType,jdbcType=BIGINT},

      </if>

     </set>

     where id = #{id,jdbcType=BIGINT}

     </update>

     3.4 复杂类型--map中包含数组的情况

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <select id="selectProOrderByOrderId" resultType="com.epeit.api.model.ProOrder" parameterType="java.util.HashMap" >

      select sum(pro_order_num) proOrderNum,product_id productId,promotion_id promotionId

      from pro_order

      where 1=1

      <if test="orderIds != null">

       and

       <foreach collection="orderIds" item="item" open="order_id IN(" separator="," close=")">

        #{item,jdbcType=BIGINT}

       </foreach>

      </if>

      GROUP BY product_id,promotion_id

     </select>

     

    4.注解@Param:这个比较特殊,但是很好理解

    案例一:

    @Param(value="startdate") String startDate :注解单一属性;这个类似于将参数重命名了一次

    如调用mybatis的*mapper.xml中配置sql语句(DAO层)

    1

    List<String> selectIdBySortTime(@Param(value="startdate")String startDate);

    则xml中的语句,需要配合@param括号中的内容:参数为startdate

    1

    2

    3

    4

    <select id="selectIdBySortTime" resultType="java.lang.String" parameterType="java.lang.String">

     select distinct ajlcid from ebd_fh_ajlc where sorttime >= to_date(#{startdate,jdbcType=VARCHAR},'YYYY-MM-DD') and created_date=updated_date

     and keyvalue in (select distinct companyname from ebd_fh_company_list where isupdate='0')

     </select>

    案例二:

    注解javaBean,@Param(value="dateVo") DateVo dateVo;则需要注意编写的参数

    1

    List<String> selectIds(@Param(value="dateVo")DateVo dateVo);

    对应的mapping文件

    1

    2

    3

    4

    <select id="selectIds" resultType="java.lang.String" parameterType="com.api.entity.DateVo">

     select distinct ajlcid from ebd_fh_ajlc where sorttime >= to_date(#  {dateVo.startDate,jdbcType=VARCHAR},'YYYY-MM-DD') and created_date=updated_date

     and keyvalue in (select distinct companyname from ebd_fh_company_list where isupdate='0')

     </select>

    至于要说优缺点的话,看个人喜好

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • 一、MyBatis传参parameterType parameterType:接口中方法参数的类型, 类型的完全限定名或别名 如:parameterType = "java.lang.Integer" parameterType = "int" 这个属性是可选的,因为可以推断出具体传入语句...

    一、MyBatis传参parameterType

    parameterType:接口中方法参数的类型, 类型的完全限定名或别名

    如:parameterType = "java.lang.Integer" parameterType = "int"

    这个属性是可选的,因为可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到 mapper 文件的 sql 语句

    注:

    parameterType不是强制的,mybatis通过反射机制能够发现接口参数的数据类型 可以省略不写(一般省略不写)

    别名

    映射的类型

    _byte

    byte

    _long

    long

    _short

    short

    _int

    int

    _integer

    int

    _double

    double

    _float

    float

    _boolean

    boolean

    string

    String

    byte

    Byte

    long

    Long

    short

    Short

    int

    Integer

    integer

    Integer

    double

    Double

    float

    Float

    boolean

    Boolean

    date

    Date

    decimal

    BigDecimal

    bigdecimal

    BigDecimal

    mapMap/HashMap

    1、一个简单类型参数

    UserDao接口文件

    /**
         * 一个简单类型参数
         * 简单类型: mybatis把java的基本数据类型和String都叫简单类型
         * 在mapper文件获取简单类型的一个参数的至,使用 #{任意字符}
         */
        public User selectUserByUserId(@Param("userId") Integer id);

     UserDao.xml文件

    <select id="selectUserByUserId" parameterType="int" resultType="com.mycompany.domain.User">
            select user_id,user_name,email,age
            from user
            where user_id = #{userId}
    </select>

    TestMyBatis测试类

    @Test
        public void testSelectUserByUserId(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                User user = userDao.selectUserByUserId(1);
                System.out.println("user="+user);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    2、多个参数,使用@Param命名参数

    当Dao 接口方法中有多个参数,需要通过名称使用参数。

    在方法形参前面加入@Param(“自定义参数名”), mapper 文件使用#{自定义参数名}

    UserDao接口文件

    /**
         * 多个参数:命名参数,在形参前面加入 @Param("自定义参数名称")
         */
        List<User> selectMultiParam(@Param("username") String userName,
                                    @Param("userage") Integer age);

    UserDao.xml文件

    <!--多个参数,使用@Param命名-->
        <select id="selectMultiParam" resultType="com.mycompany.domain.User" >
            select user_id,user_name,email,age
            from user
            where user_name = #{username} or age = #{userage}
        </select>

    TestMyBatis测试类

    @Test
        public void testSelectMultiParam(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                List<User> userList = userDao.selectMultiParam("zhangsan",20);
                for(User user: userList){
                    System.out.println("用户="+user);
                }
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    3、多个参数,使用Java对象

    使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。

    语法格式: #{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 }

    javaType, jdbcType 的类型 MyBatis 可以通过反射机制检测出来,一般不需要设置。常用格式 #{ property }

    UserDao接口文件

    /**
         * 多个参数,使用Java对象作为接口中方法的参数
         */
        List<User> selectMultiObject(QueryParam param);
    
        List<User> selectMultiObjectSimplified(QueryParam param);
    
        List<User> selectMultiUsers(User user);

    UserDao.xml文件

    <!-- 多个参数,使用Java对象的属性值,作为参数实际值
             使用对象语法:
                #{属性名,javaType=类型名称,jdbcType=数据类型}
                javaType:Java中的属性数据类型
                jdbcType:数据库中的数据类型
                如:#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
    
             简化方式:#{属性名},javaType,jdbcType的值mybatis反射能获取,不用提供
         -->
        <select id="selectMultiObject" resultType="com.mycompany.domain.User">
            select user_id,user_name,email,age
            from user
            where user_name=#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
                    or age=#{paramAge,javaType=java.lang.Integer,jdbcType=INTEGER}
        </select>
    
        <select id="selectMultiObjectSimplified" resultType="com.mycompany.domain.User">
            select user_id,user_name,email,age
            from user
            where user_name=#{paramName}
               or age=#{paramAge}
        </select>
    
        <select id="selectMultiUsers" resultType="com.mycompany.domain.User">
            select user_id,user_name,email,age
            from user
            where user_name=#{userName}
               or age=#{age}
        </select>

    TestMyBatis测试类

    @Test
        public void testSelectMultiObject(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                QueryParam param = new QueryParam();
                param.setParamName("zhangsan");
                param.setParamAge(18);
    
                List<User> userList = userDao.selectMultiObject(param);
                for(User user: userList){
                    System.out.println("用户="+user);
                }
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void testSelectMultiObjectSimplified(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                QueryParam param = new QueryParam();
                param.setParamName("zhangsan");
                param.setParamAge(18);
    
                List<User> userList = userDao.selectMultiObjectSimplified(param);
                for(User user: userList){
                    System.out.println("用户="+user);
                }
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void testSelectMultiUsers(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                User user = new User();
                user.setUserName("zhangsan");
                user.setAge(18);
    
                List<User> userList = userDao.selectMultiUsers(user);
                for(User users: userList){
                    System.out.println("用户="+users);
                }
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    4、多个参数,按位置

    参数位置从 0 开始,引用参数语法 #{ arg 位置 } ,第一个参数是#{arg0},第二个是#{arg1}

    注:

    mybatis-3.3 版本和之前的版本使用#{0},#{1}方式,从 mybatis3.4 开始使用#{arg0}方式

    UserDao接口文件

    /**
         * 多个参数-简单类型,按位置传值
         * mybatis 3.4之前,使用 #{0} ,#{1}
         * mybatis 3.4之后 ,使用 #{arg0} ,#{arg1}
         */
        List<User> selectMultiPosition(String userName,Integer age);

    UserDao.xml文件

    <!--多个参数使用位置-->
        <select id="selectMultiPosition" resultType="com.mycompany.domain.User">
            select user_id,user_name,email,age
            from user
            where user_name=#{arg0}
               or age=#{arg1}
        </select>

    TestMyBatis测试类

    @Test
        public void testSelectMultiPosition(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                List<User> userList = userDao.selectMultiPosition("zhangsan",20);
                for(User user: userList){
                    System.out.println("用户="+user);
                }
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    5、多个参数,使用Map

    Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数

    Map 集合使用 String的 key,Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值

    UserDao接口文件

    /**
         * 多个参数,使用Map存放多个值
         */
        List<User> selectMultiByMap(Map<String,Object> map);

    UserDao.xml文件

    <!--多个参数,使用Map , 使用语法 #{map的key}-->
        <select id="selectMultiByMap" resultType="com.mycompany.domain.User">
            select user_id,user_name,email,age
            from user
            where user_name=#{userName}
               or age=#{userAge}
        </select>

    TestMyBatis测试类

    @Test
        public void testSelectMultiByMap(){
            try {
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
                UserDao userDao = sqlSession.getMapper(UserDao.class);
    
                Map<String,Object> map = new HashMap<>();
                map.put("userName","zhangsan");
                map.put("userAge",20);
    
                List<User> userList = userDao.selectMultiByMap(map);
                for(User user: userList){
                    System.out.println("用户="+user);
                }
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    展开全文
  • mybatis parameterType

    2021-01-15 22:01:38
    parameterType可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)同时也可以使用实体类的包装类 基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang....

    parameterType可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)同时也可以使用实体类的包装类

    基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang.String
    实体类类型,目前我们只能使用全限定类名。

    原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
    TypeAliasRegistery.class中定义:

            this.registerAlias("string", String.class);
            this.registerAlias("byte", Byte.class);
            this.registerAlias("long", Long.class);
            this.registerAlias("short", Short.class);
            this.registerAlias("int", Integer.class);
            this.registerAlias("integer", Integer.class);
            this.registerAlias("double", Double.class);
            this.registerAlias("float", Float.class);
            this.registerAlias("boolean", Boolean.class);
            this.registerAlias("byte[]", Byte[].class);
            this.registerAlias("long[]", Long[].class);
            this.registerAlias("short[]", Short[].class);
            this.registerAlias("int[]", Integer[].class);
            this.registerAlias("integer[]", Integer[].class);
            this.registerAlias("double[]", Double[].class);
            this.registerAlias("float[]", Float[].class);
            this.registerAlias("boolean[]", Boolean[].class);
            this.registerAlias("_byte", Byte.TYPE);
            this.registerAlias("_long", Long.TYPE);
            this.registerAlias("_short", Short.TYPE);
            this.registerAlias("_int", Integer.TYPE);
            this.registerAlias("_integer", Integer.TYPE);
            this.registerAlias("_double", Double.TYPE);
            this.registerAlias("_float", Float.TYPE);
            this.registerAlias("_boolean", Boolean.TYPE);
            this.registerAlias("_byte[]", byte[].class);
            this.registerAlias("_long[]", long[].class);
            this.registerAlias("_short[]", short[].class);
            this.registerAlias("_int[]", int[].class);
            this.registerAlias("_integer[]", int[].class);
            this.registerAlias("_double[]", double[].class);
            this.registerAlias("_float[]", float[].class);
            this.registerAlias("_boolean[]", boolean[].class);
            this.registerAlias("date", Date.class);
            this.registerAlias("decimal", BigDecimal.class);
            this.registerAlias("bigdecimal", BigDecimal.class);
            this.registerAlias("biginteger", BigInteger.class);
            this.registerAlias("object", Object.class);
            this.registerAlias("date[]", Date[].class);
            this.registerAlias("decimal[]", BigDecimal[].class);
            this.registerAlias("bigdecimal[]", BigDecimal[].class);
            this.registerAlias("biginteger[]", BigInteger[].class);
            this.registerAlias("object[]", Object[].class);
            this.registerAlias("map", Map.class);
            this.registerAlias("hashmap", HashMap.class);
            this.registerAlias("list", List.class);
            this.registerAlias("arraylist", ArrayList.class);
            this.registerAlias("collection", Collection.class);
            this.registerAlias("iterator", Iterator.class);
            this.registerAlias("ResultSet", ResultSet.class);
    
    展开全文
  • parameterType 用法

    万次阅读 多人点赞 2020-08-26 14:20:59
    一个参数的这种其实没有必要写parameterType,而且还有就是多个参数的时候也没有必要写parameterType,也就是说,其实该参数的存在是不是特别必要的。其中@Param和parameterType 二者存其一即可。看名字就能知道...
  • parameterType可省略

    2022-07-13 22:12:11
    parameterType可省略,但是不建议省略,不利于后期维护
  • Mybatis的参数-parameterType(输入类型) 1.传递简单类型 int ,String 等 2.传递pojo对象 (实体类对象) Mybatis使用OGNL表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称 3.转递pojo包装对象(实际开发...
  • 认识了框架,回顾了JDBC连接数据库,初步建立了使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,本篇博客记录一下parameterType属性和它的使用。...
  • parameterType 前端发给后端的值,接到后指定类型,当然自己定义的实体类也可以 下面来个指定为Long类型的例子: <select id="checkDeptExistUser" parameterType="Long" resultType="int"> select count(1) from ...
  • 映射配置文件中配置解读 <!-- 保存用户--> <insert id="saveUser" parameterType="com.itheima.domain.User"> insert into user...parameterType 属性:代表参数的类型,因为我们要传入的是一个类的
  • resultType与parameterType的基本使用和区别
  • parametertype和resulttype的区别

    千次阅读 2022-03-26 21:31:38
    resultType 与 parameterType的基本使用的区别 : resultType :需要从数据库中提取相应的数据出来时使用,如查询 parameterType :将信息存入到数据库中 使用 如:插入 一般用于***XmlMapper.xml文件中
  • mybatis中resultMap与resultType以及parameterType和parameterMap的区别
  • 形式 这是关键步骤,这里构造sqlsource的时候使用到了parameterType,继续看下面 step4、org.apache.ibatis.mapping.ParameterMapping.Builder#resolveTypeHandler 这里将parameterType转化为了一个TypeHandler ...
  • 关于resultType与parameterType 的基本使用的区别 : 1、使用resultType :主要针对于从数据库中提取相应的数据出来 如:select从数据库查询。(sql输出结果类型) 2、使用parameterType :主要针对于将信息存入到...
  • name,birth) value (#{xuehao},#{xingming},#{shengri}) insert> <select id="mutSel" parameterType="map" resultType="Emp"> select e.* from emp e join dept d on e.deptno = d.deptno where d.dname = #{dname}...
  • parameterType 仅代码 传入简单类型 public User get(Long id) { return (User) getSqlSession().get(id); } <select id="get" parameterType="java.lang.Long" resultType="User"> select * from ...
  • 通过封装一个对象,把参数用一个对象封装起来,保证类里有构造函数,在mapper接口里传对象,在mapper.xml里parameterType里传入对象类 public Student(Integer SID, String sname, String ssex, Integer sage) ...
  • parameterType parameterType:接口中方法参数的类型,类型必须是完全限定名或别名(稍后讲别名)。该属性非必须,因为Mybatis框架能自行判断具体传入语句的参数,默认值为未设置(unset)。 解决方案 1.多个参数...
  • Mybatis入参parameterType和取值类型
  • 在MyBatis的select、insert、update、delete这些元素中都提到了parameterType这个属性。MyBatis现在可以使用的parameterType有基本数据类型和JAVA复杂数据类型。 基本数据类型:包含int,String,Date等。基本数据类型...
  • 在使用Mybatis开发时,借助xml来写具体的sql,再写传参类型或者返回结果类型时,通常会与ParameterType, ParameterMap, ResultMap, ResultType这四个打交到,那么这个Type与Map到底怎么区别,什么时候要指定类型,...
  • } } 这个是ItEye上的一篇文章,其中配置文件中的parameterType是可以不配置的,mybatis会自动传入的。当您想传入collection时,并不能直接传入collection对象,要将其先转换为list,然后才能传入。因为mybatis生成...
  • resultType 与 parameterType 的基本使用的区别 : 1、使用 resultType : 主要针对于从数据库中提取相应的数据出来 2、使用parameterType : 主要针对于 将信息存入到数据库中 如: insert 增加数据到数据库zhong ...
  • //事务 方法2:Map 原理是将参数放到HashMap里,传一个Map对象,通过键值对的形式获取 1.xml文件 <update id="updateSnameById" parameterType="Map" > update Student set sname = #{sname} where sid = #{sid} ...
  • parameterType 精简配置 在你的application.yml或bootstrap.yml下面 为mybatis添加 type-aliases-package 为实体类所在位置 mapperLocations 对应的是*Mapper.xml的位置

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,940
精华内容 56,776
关键字:

parametertype