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

前面已经讲到用接口的方式编程。这种方式,要注意的一个地方就是。在User.xml  的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.IUserOperation" ,命名空间非常重要,不能有错,必须与我们定义的package 和 接口一致。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
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(),这样才会真正对数据库进行操作,否则是没有提交的。

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

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: mybatis
相关日志:
评论: 11 | 引用: 0 | 查看次数: -
回复回复蜗牛[2016-11-18 10:29 AM | del]
更新的方法还要在,main方法里面调用才可以
回复回复[face01][2015-08-21 04:30 PM | del]
回复回复小凡[2014-10-29 03:03 PM | del]
楼主 肯定在上海哦
回复回复小凡[2014-10-29 02:11 PM | del]
good good good
回复回复小白[2014-09-19 05:13 PM | del]
设置完后,出现报错,The markup in the document following the root element must be well-formed.怎么改?
回复回复小强[2014-08-19 11:08 AM | del]
lz用的like查询,%含义是模糊的,在这里就是查询所有数据了。
引用来自 呵呵 引用来自 呵呵
public static void main(String[] args) {
        Test testUser=new Test();
        testUser.getUserList("%");
}

在上面的查询用户列表方法中,传递的“%”实参表示什么含义呀?
回复回复小强[2014-08-19 11:05 AM | del]
System.out.println("当前增加的用户 id为:"+user.getId());
我的打印出来的是默认值0.
问下您 这里的 user.getID() 有值吗?没看见那段程序给user.setid赋值啊。

我用的Oracle。

回复回复小强[2014-08-19 09:51 AM | del]
oracle里主键自增加得用序列吗?  否则插不进去
回复回复王丽兵[2014-06-18 10:01 AM | del]
楼主好,文章写的条理性非常强。我们诚邀您来我们的技术群里一起讨论。
QQ群:251592560
回复回复加源码[2014-01-23 03:37 PM | del]
真不错,楼主辛苦了。
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.