Java通过MyBatis框架对MySQL数据进行增删查改的基本方法

 更新时间:2016年06月01日 14:53:12   作者:czj4451  
MyBatis框架由Java的JDBC API进一步封装而来,在操作数据库方面效果拔群,接下来我们就一起来看看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(); 
  } 
} 

相关文章

  • Java线程协作的两种方式小结

    Java线程协作的两种方式小结

    Java中线程协作的最常见的两种方式是利用Object.wait()、Object.notify()和使用Condition,本文主要介绍了Java线程协作的两种方式小结,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 微服务eureka和nacos案例详解

    微服务eureka和nacos案例详解

    这篇文章主要介绍了微服务eureka和nacos,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java StampedLock实现原理与最佳实践记录

    Java StampedLock实现原理与最佳实践记录

    本文介绍了Java 8引入的StampedLock,这是一种多模式同步控制组件,通过“戳”(stamp)标识锁的状态,支持写锁、悲观读锁和乐观读三种模式,StampedLock在特定场景下能够大幅提升系统性能,特别是在读多写少的场景中,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • SpringCloud负载均衡实现定向路由详情

    SpringCloud负载均衡实现定向路由详情

    这篇文章主要介绍了SpringCloud负载均衡实现定向路由详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java工程中可执行JAR两种打包方式详解

    Java工程中可执行JAR两种打包方式详解

    这篇文章主要为大家详细介绍了Java工程中可执行JAR两种打包方式,一体化可执行包和带外部依赖lib的可执行包,有需要的小伙伴可以学习一下
    2024-04-04
  • JavaCV与FFmpeg音视频流处理技巧总结大全

    JavaCV与FFmpeg音视频流处理技巧总结大全

    JavaCV是一个开源的Java接口,它为几个著名的计算机视觉库(如OpenCV、FFmpeg)提供了Java封装,这篇文章主要给大家介绍了关于JavaCV与FFmpeg音视频流处理技巧总结的相关资料,需要的朋友可以参考下
    2024-05-05
  • java中对象和JSON格式的转换方法代码

    java中对象和JSON格式的转换方法代码

    JSON格式可以轻松地以面向对象的方式转换为Java对象,下面这篇文章主要给大家介绍了关于java中对象和JSON格式的转换方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • java制作仿微信录制小视频控件

    java制作仿微信录制小视频控件

    这篇文章主要介绍了java制作仿微信录制小视频控件的代码,录制小视频非常方便,有需要的小伙伴可以参考下。
    2015-04-04
  • Spring Boot超大文件上传实现秒传功能

    Spring Boot超大文件上传实现秒传功能

    这篇文章主要介绍了Spring Boot超大文件上传实现秒传功能,在实现分片上传的过程,需要前端和后端配合,比如前后端的上传块号的文件大小,前后端必须得要一致,否则上传就会有问题,需要的朋友可以参考下
    2022-12-12
  • Java中的封装性(包含this关键字,构造器等)

    Java中的封装性(包含this关键字,构造器等)

    这篇文章主要介绍了Java中的封装性(包含this关键字,构造器等)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论