Java通过MyBatis框架对MySQL数据进行增删查改的基本方法
作者:czj4451 发布时间:2024-01-17 10:27:12
标签:Java,MyBatis,MySQL
1. 查询
除了单条记录的查询,这里我们来尝试查询一组记录。
IUserMapper接口添加下面方法:
List<User> getUsers(String name);
在User.xml中添加:
<resultMap type="User" id="userList"><!-- type为返回列表元素的类全名或别名 -->
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<result column="address" property="address" />
</resultMap>
<select id="getUsers" parameterType="string" resultMap="userList"><!-- resultMap为上面定义的User列表 -->
select * from `user` where name like #{name}
</select>
测试方法:
@Test
public void queryListTest() {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserMapper mapper = session.getMapper(IUserMapper.class);
List<User> users = mapper.getUsers("%a%"); // %在sql里代表任意个字符。
for (User user : users) {
log.info("{}: {}", user.getName(), user.getAddress());
}
} finally {
session.close();
}
}
如果联表查询,返回的是复合对象,需要用association关键字来处理。
如User发表Article,每个用户可以发表多个Article,他们之间是一对多的关系。
(1) 创建Article表,并插入测试数据:
-- Drop the table if exists
DROP TABLE IF EXISTS `Article`;
-- Create a table named 'Article'
CREATE TABLE `Article` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- Add several test records
INSERT INTO `article`
VALUES
('1', '1', 'title1', 'content1'),
('2', '1', 'title2', 'content2'),
('3', '1', 'title3', 'content3'),
('4', '1', 'title4', 'content4');
(2) com.john.hbatis.model.Article类:
public class Article {
private int id;
private User user;
private String title;
private String content;
// Getters and setters are omitted
}
(3) 在IUserMapper中添加:
List<Article> getArticlesByUserId(int id);
(4) 在User.xml中添加:
<resultMap type="com.john.hbatis.model.Article" id="articleList">
<id column="a_id" property="id" />
<result column="title" property="title" />
<result column="content" property="content" />
<association property="user" javaType="User"><!-- user属性映射到User类 -->
<id column="id" property="id" />
<result column="name" property="name" />
<result column="address" property="address" />
</association>
</resultMap>
<select id="getArticlesByUserId" parameterType="int" resultMap="articleList">
select u.id, u.name, u.age, u.address, a.id a_id, a.title, a.content
from article a
inner join user u
on a.user_id=u.id and u.id=#{id}
</select>
(5)测试方法:
@Test
public void getArticlesByUserIdTest() {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserMapper mapper = session.getMapper(IUserMapper.class);
List<Article> articles = mapper.getArticlesByUserId(1);
for (Article article : articles) {
log.info("{} - {}, author: {}", article.getTitle(), article.getContent(), article.getUser().getName());
}
} finally {
session.close();
}
}
附:
除了在association标签内定义字段和属性的映射外,还可以重用User的resultMap:
<association property="user" javaType="User" resultMap="userList" />
2. 新增
IUserMapper接口添加下面方法:
int addUser(User user);
User.xml添加:
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"><!-- useGeneratedKeys指定myBatis使用数据库自动生成的主键,并填充到keyProperty指定的属性上。如果未指定,返回对象拿不到生成的值 -->
insert into user(name,age,address) values(#{name},#{age},#{address})
</insert>
测试方法:
@Test
public void addUserTest() {
User user = new User("Lucy", 102, "Happy District");
SqlSession session = sqlSessionFactory.openSession();
try {
IUserMapper mapper = session.getMapper(IUserMapper.class);
int affectedCount = mapper.addUser(user);
session.commit(); // 默认为不自动提交。调用session.getConnection().getAutoCommit()查看
log.info("{} new record was inserted successfully whose id: {}", affectedCount, user.getId());
} finally {
session.close();
}
}
3. 更新
接口添加方法:
int updateUser(User user);
User.xml添加:
<update id="updateUser" parameterType="User">
update `user` set name=#{name}, age=#{age}, address=#{address}
where id=#{id}
</update>
测试方法:
@Test
public void updateUserTest() {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserMapper mapper = session.getMapper(IUserMapper.class);
User user = mapper.getUserById(8);
user.setAddress("Satisfied District");
int affectedCount = mapper.updateUser(user); // 除了要修改的属性外,user的其它属性也要赋值,否则这些属性会被数据库更新为初始值(null或0等),可以先查询一次,但这样会增加和数据库不必要的交互。后面的条件判断能避免此问题。
log.info("Affected count: {}", affectedCount);
session.commit();
} finally {
session.close();
}
}
4. 删除
接口添加方法:
int deleteUser(int id);
User.xml添加:
<delete id="deleteUser" parameterType="int">
delete from `user` where id=#{id}
</delete>
测试方法:
@Test
public void deleteUserTest() {
SqlSession session = sqlSessionFactory.openSession();
try {
IUserMapper mapper = session.getMapper(IUserMapper.class);
int affectedCount = mapper.deleteUser(8);
log.info("Affected count: {}", affectedCount);
session.commit();
} finally {
session.close();
}
}


猜你喜欢
- 说起 Python 强大的地方,你可能想到是它的优雅、简洁、开发速度快,社区活跃度高。但真正使得这门语言经久不衰的一个重要原因是它的无所不能
- 项目场景:最近在部署项目之后,运行出现报错:Expression #1 of SELECT list is not in GROUP BY
- -crop参数是从一个图片截取一个指定区域的子图片.格式如下:convert -crop widthxheight{+-
- 一.使用DOM生成和读取XML文件 实例一: <?php //Creates XML string and XML document
- 进一法取整、四舍五入取整、忽略小数等的取整数方法大全PHP取整数函数常用的四种方法,下面收集了四个函数;经常用到取整的函数,今天小小的总结一
- 安全等于运算符(<=>)这个操作符和=操作符执行相同的比较操作,不过<=>可以用来判断NULL值。在两个操作数均为N
- 一、前言对于一个桌面应用来说,有时候单独一个窗口用户使用起来会不太方便,比方说写日报或者查看文件等,若是在同一窗口内,我只能做一件事,不能边
- Git分支详解参考:分支管理组成1.1、master主干在版本管理中,代码库应该仅有一个主干。此主干是和当前生产保持一致的,是可用的、稳定的
- 前言针对一些特殊的需求,在项目里,需要将响应式数据变为普通原始类型数据,这种情况是有的在Vue里,能够将普通数据类型的数据变为响应式数据,同
- SQL Server 阻止了对组件 'Ad Hoc Distributed&nbs
- 本文为大家分享了Win中安装mysql的详细步骤,供大家参考,具体内容如下mysql下载目录选择免安装版“Windows (x86, 64-
- 很多人喜欢把一个网站中相同的部分象是统一的页面logo,版权声明等做成一个过程,然后放到一个include文件中,这样所有的页面就都可以使用
- MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库,但一般都是用PHP+MYSQL相结合来开发各种动态页面,其实A
- Python Assert 为何不尽如人意?Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛
- 前言关于python版本,我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,
- 经过dom层层注释缩小反馈终于找到问题所在。问题经过我在弹起弹窗的时候,设置了popupVisible为true然后触发了vue的updat
- 我就废话不多说了,直接上代码吧!'''python对象销毁(垃圾回收)'''class Po
- 1、主题毫无疑问Pycharm是一个具有强大快捷键系统的IDE,这就意味着你在Pycharm中的任何操作,例如打开一个文件、切换编辑区域等,
- 本文实例讲述了Python排序搜索基本算法之插入排序。分享给大家供大家参考,具体如下:插入排序生活中非常常见,打扑克的时候人的本能就在用插入
- 一、题目要求用原生Python实现knn分类算法。二、题目分析数据来源:鸢尾花数据集(见附录Iris.txt)数据集包含150个数据集,分为