mybatis 中in 怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 中in 怎么用相关的知识,希望对你有一定的参考价值。

本来是一个String字符串 “1001,1002,1003” 然后我用split分割逗号 得到了articleIDArray 数组
String[] articleIDArray = zt.getZtContentID().split(",");

public List<Article> getArticleZTbyArticleIDArray(String[] articleIDArray)
return articleDao.getArticleZTbyArticleIDArray(articleIDArray);

我传递的是一个数组 articleIDArray 我参考着网上的写法写的 为什么有错误
<select id="findArticleZTbyArticleIDArray" resultType="article" >
select articleID, articleTitle,date_format(createtime,'%Y-%m-%d %H:%i:%s') as createtime, tag from T_article
where flag='1' and articleID in
<foreach item="articleIDArray" index="index" collection="array"
open="(" separator="," close=")">
#articleIDArray
</foreach>
</select>
这是为什么 应该怎样改

参考技术A 1. 当查询的参数只有一个时

findByIds(List<Long> ids)
1.a 如果参数的类型是List, 则在使用时,collection属性要必须指定为 list

<select id="findByIdsMap" resultMap="BaseResultMap">
Select
<include refid="Base_Column_List" />
from jria where ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#item
</foreach>
</select>

findByIds(Long[] ids)
1.b 如果参数的类型是Array,则在使用时,collection属性要必须指定为 array

<select id="findByIdsMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from jria where ID in
<foreach item="item" index="index" collection="array"
open="(" separator="," close=")">
#item
</foreach>
</select>

2. 当查询的参数有多个时,例如 findByIds(String name, Long[] ids)
这种情况需要特别注意,在传参数时,一定要改用Map方式, 这样在collection属性可以指定名称
下面是一个示例

Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("ids", ids);
mapper.findByIdsMap(params);

<select id="findByIdsMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from jria where ID in
<foreach item="item" index="index" collection="ids"
open="(" separator="," close=")">
#item
</foreach>
</select>

完整的示例如下:
例如有一个查询功能,Mapper接口文件定义如下方法:
List<Jria> findByIds(Long... ids);
使用 in 查询的sql拼装方法如下:

<select id="findbyIds" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from jria where ID in
<foreach item="item" index="index" collection="array"
open="(" separator="," close=")">
#item
</foreach>
</select>追问

你别从网上摘这些了,我都看了

参考技术B

我的也是字符拆成的数组,你这样:

*Controller类中部分代码>>>

String[] section = names.getModule().split(",");

System.out.println("查询条件参数:"+list);

List<EMS_TroubleShootingData> tsList = tsdService.getDataBySections(list);

req.setAttribute("list", tsList);

return "TroubleShootingList";

Dao,Service及其实现类中都使用:(List<String> list);作为参数

最后*Mapper.xml文件中:

mybatis实战教程(mybatis in action)之三:实现数据的增删改查

前面已经讲到用接口的方式编程。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
1. 用 mybatis 查询数据,包括列表
2. 用 mybatis 增加数据
3. 用 mybatis 更新数据.
4. 用 mybatis 删除数据.

 

查询数据,前面已经讲过简单的,主要看查询出列表的
查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的

技术分享
<!-- 为了返回list 类型而定义的returnMap -->
    <resultMap type="User" id="resultListUser">
        <id column="id" property="id" />
        <result column="userName" property="userName" />
        <result column="userAge" property="userAge" />
        <result column="userAddress" property="userAddress" />
    </resultMap>
技术分享

查询列表的语句在 User.xml 中

<!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 -->
    <select id="selectUsers" parameterType="string" resultMap="resultListUser">
        select * from user where userName like #{userName}
    </select>

在 IUserOperation 接口中增加方法:public List<User> selectUsers(String userName);    
现在在 Test 类中做测试

技术分享
public void getUserList(String userName){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation=session.getMapper(IUserOperation.class);           
            List<User> users = userOperation.selectUsers(userName);
            for(User user:users){
                System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());
            }
            
        } finally {
            session.close();
        }
    }
技术分享

现在在main  方法中可以测试:

public static void main(String[] args) {
        Test testUser=new Test();
        testUser.getUserList("%");
    }

 

可以看到,结果成功查询出来。如果是查询单个数据的话,用第二讲用过的方法就可以了。

用mybatis 增加数据 
在 IUserOperation 接口中增加方法:public void addUser(User user);
在 User.xml 中配置

技术分享
<!--执行增加操作的SQL语句。id和parameterType  
       分别与IUserOperation接口中的addUser方法的名字和  
       参数类型一致。以#{name}的形式引用Student参数  
       的name属性,MyBatis将使用反射读取Student参数  
       的此属性。#{name}中name大小写敏感。引用其他  
       的gender等属性与此一致。seGeneratedKeys设置  
       为"true"表明要MyBatis获取由数据库自动生成的主  
       键;keyProperty="id"指定把获取到的主键值注入  
       到Student的id属性--> 
    <insert id="addUser" parameterType="User" 
        useGeneratedKeys="true" keyProperty="id"> 
        insert into user(userName,userAge,userAddress)  
             values(#{userName},#{userAge},#{userAddress})  
    </insert>
技术分享

然后在 Test 中写测试方法:

技术分享
/**
     * 测试增加,增加后,必须提交事务,否则不会写入到数据库.
     */
    public void addUser(){
        User user=new User();
        user.setUserAddress("人民广场");
        user.setUserName("飞鸟");
        user.setUserAge(80);
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation=session.getMapper(IUserOperation.class);
            userOperation.addUser(user);
            session.commit();
            System.out.println("当前增加的用户 id为:"+user.getId());
        } finally {
            session.close();
        }
    }
技术分享

用mybatis 更新数据
方法类似,先在 IUserOperation 中增加方法:public void addUser(User user);
然后配置 User.xml 

<update id="updateUser" parameterType="User" >
        update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
    </update>

Test 类总的测试方法如下:

技术分享
public void updateUser(){
        //先得到用户,然后修改,提交。
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation=session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(4);            
            user.setUserAddress("原来是魔都的浦东创新园区");
            userOperation.updateUser(user);
            session.commit();
            
        } finally {
            session.close();
        }
    }
技术分享

用mybatis 删除数据 
同理,IUserOperation 增加方法:public void deleteUser(int id);
配置User.xml

<delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    </delete>

然后在Test类中写测试方法:

技术分享
    /**
     * 删除数据,删除一定要 commit.
     * @param id
     */
    public void deleteUser(int id){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation=session.getMapper(IUserOperation.class);           
            userOperation.deleteUser(id);
            session.commit();            
        } finally {
            session.close();
        }
    }
技术分享

这样,所有增删改查都完成了,注意在增加,更改,删除的时候要调用session.commit(),这样才会真正对数据库进行操作,否则是没有提交的。

到此为止,简单的单表操作,应该都会了,接下来的时间了,我会讲多表联合查询,以及结果集的选取。 

 

http://blog.csdn.net/woshixuye/article/details/27521071

补充下 resultMap和resultType区别

 

补充下 

column 是对应数据库中表的字段名称
property是对应的bean里面的属性名称

以上是关于mybatis 中in 怎么用的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis的@Select注解怎么在没有xml文件时使用in查询,

mybatis sql in 查询(mybatis sql语句传入参数是list)mybatis中使用in查询时in怎么接收值

Mybatis查询实例,sql中的in在Mybatis中怎么写

Mybatis查询实例,sql中的in在Mybatis中怎么写--以list为查询条件

mybatis的foreach怎么解决in参数大于1000

mybatis实战教程(mybatis in action)之三:实现数据的增删改查