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教程之实现关联数据的查询
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个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(); }}
然后运行就可以测试。
整个工程的目录机构:
源码下载:
数据的增删改查 点击下载
关联数据的查询 点击下载
文章出处 :http://www.yihaomen.com/article/java/302.htm
- MyBatis教程之数据的增删改查和关联数据的查询
- mybatis实战教程(mybatis in action)之三:实现数据的增删改查
- mybatis实战教程(mybatis in action)之三:实现数据的增删改查
- mybatis实战教程(mybatis in action)之三:实现数据的增删改查
- mybatis ---- 实现数据的增删改查
- MyBatis实现数据的增删查改
- Mybatis实现数据的增删改查
- mybatis实战教程之开发环境搭建、以接口的方式编程、实现数据的增删改查
- 数据的增删改查:单表查询,多表查询,集合查询和子查询
- 数据的增删改查
- 数据的增删改查
- mybatis实现的对数据的增删查改
- mybatis实现的对数据的增删查改
- Mybatis实现的对数据的增删查改
- MyBatis系列教程(三)--实现数据的增删改查(CRUD)
- mybatis实战教程之四:实现关联数据的查询
- Mybatis学习(3)实现数据的增删改查
- Mybatis实现数据的增删改查(CRUD)
- mtd-utils源码官方下载地址
- error C2039: “ReadHuge”: 不是“CFile”的成员
- ubuntu账户操作
- 利用dimens.xml来达到资源的重用
- 欢迎使用CSDN-markdown编辑器
- MyBatis教程之数据的增删改查和关联数据的查询
- SDL2.0多分屏显示
- mybatis逆向工程,自动生成代码
- Linux多线程技术总结
- 获取魅族底部smartbar的高度
- 自定义View常处理的回调函数
- 通过js保存图片到本地
- 【java开发系列】—— 自定义注解(转)
- 程序员的健康之道