MyBatis教程之数据的增删改查和关联数据的查询

来源:互联网 发布:淘宝618和双11 编辑:程序博客网 时间:2024/04/29 17:04
前面已经讲到用接口的方式编程,这一章主要在上一讲基于接口编程的基础上完成如下事情:
1. 用 mybatis 查询数据,包括列表;
2. 用 mybatis 增加数据;
3. 用 mybatis 更新数据;

4. 用 mybatis 删除数据;

然后实现关联数据的查询


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);   <span style="font-family: 微软雅黑, Verdana, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

现在在 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(),这样才会真正对数据库进行操作,否则是没有提交的。

整个工程的目录机构:


MyBatis教程


MyBatis教程之实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个Article 这个表,并初始化数据.

Drop TABLE IF EXISTS `article`;Create TABLE `article` (  `id` int(11) NOT NULL auto_increment,  `userid` int(11) NOT NULL,  `title` varchar(100) NOT NULL,  `content` text NOT NULL,  PRIMARY KEY  (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;– —————————-– 添加几条测试数据– —————————-Insert INTO `article` VALUES (’1′, ’1′, ‘test_title’, ‘test_content’);Insert INTO `article` VALUES (’2′, ’1′, ‘test_title_2′, ‘test_content_2′);Insert INTO `article` VALUES (’3′, ’1′, ‘test_title_3′, ‘test_content_3′);Insert INTO `article` VALUES (’4′, ’1′, ‘test_title_4′, ‘test_content_4′);


你应该发现了,这几个文章对应的userid都是1,所以需要用户表user里面有id=1的数据。可以修改成满足自己条件的数据.按照orm的规则,表已经创建了,那么肯定需要一个对象与之对应,所以我们增加一个 Article 的class。

package com.yihaomen.mybatis.model;public class Article {    private int id;    private User user;    private String title;    private String content;        public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }        public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }}

注意一下,文章的用户是怎么定义的,是直接定义的一个User对象。而不是int类型。

多对一的实现

场景:在读取某个用户发表的所有文章。当然还是需要在User.xml 里面配置 select 语句, 但重点是这个 select 的resultMap 对应什么样的数据呢。这是重点,这里要引入 association 看定义如下:

<!– User 联合文章进行查询 方法之一的配置 (多对一的方式)  –>        <resultMap id=”resultUserArticleList” type=”Article”>        <id property=”id” column=”aid” />        <result property=”title” column=”title” />        <result property=”content” column=”content” />                <association property=”user” javaType=”User”>            <id property=”id” column=”id” />            <result property=”userName” column=”userName” />            <result property=”userAddress” column=”userAddress” />                    </association>            </resultMap><select id=”getUserArticles” parameterType=”int” resultMap=”resultUserArticleList”>       select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article               where user.id=article.userid and user.id=#{id}</select>


这样配置之后,就可以了,将select 语句与resultMap 对应的映射结合起来看,就明白了。用association 来得到关联的用户,这是多对一的情况,因为所有的文章都是同一个用户的。


还有另外一种处理方式,可以复用我们前面已经定义好的 resultMap ,前面我们定义过一个 resultListUser ,看这第二种方法如何实现:

<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 联合文章进行查询 方法之二的配置 (多对一的方式) –>        <resultMap id=”resultUserArticleList-2″ type=”Article”>        <id property=”id” column=”aid” />        <result property=”title” column=”title” />        <result property=”content” column=”content” />                <association property=”user” javaType=”User” resultMap=”resultListUser” />                 </resultMap>        <select id=”getUserArticles” parameterType=”int” resultMap=”resultUserArticleList”>       select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article               where user.id=article.userid and user.id=#{id}    </select>

将 association  中对应的映射独立抽取出来,可以达到复用的目的。


在 IUserOperation 接口中,加入 select 对应的id 名称相同的方法:

public List<Article> getUserArticles(int id);


好了,现在在Test 类中写测试代码:

public void getUserArticles(int userid){        SqlSession session = sqlSessionFactory.openSession();        try {            IUserOperation userOperation=session.getMapper(IUserOperation.class);                       List<Article> articles = userOperation.getUserArticles(userid);            for(Article article:articles){                System.out.println(article.getTitle()+”:”+article.getContent()+                        “:作者是:”+article.getUser().getUserName()+”:地址:”+                         article.getUser().getUserAddress());            }        } finally {            session.close();        }}

然后运行就可以测试。

整个工程的目录机构:


MyBatis


源码下载:

数据的增删改查  点击下载

关联数据的查询   点击下载

文章出处 :http://www.yihaomen.com/article/java/302.htm


0 0
原创粉丝点击