mybatis crud_MyBatis教程– CRUD操作和映射关系–第2部分

mybatis crud

为了说明这一点,我们正在考虑以下示例域模型:

会有用户,每个用户可能都有一个博客,每个博客可以包含零个或多个帖子。

这三个表的数据库结构如下:

CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_increment,email_id varchar(45) NOT NULL,password varchar(45) NOT NULL,first_name varchar(45) NOT NULL,last_name varchar(45) default NULL,blog_id int(10) unsigned default NULL,PRIMARY KEY  (user_id),UNIQUE KEY Index_2_email_uniq (email_id),KEY FK_user_blog (blog_id),CONSTRAINT FK_user_blog FOREIGN KEY (blog_id) REFERENCES blog (blog_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE blog (blog_id int(10) unsigned NOT NULL auto_increment,blog_name varchar(45) NOT NULL,created_on datetime NOT NULL,PRIMARY KEY  (blog_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE post (post_id int(10) unsigned NOT NULL auto_increment,title varchar(45) NOT NULL,content varchar(1024) NOT NULL,created_on varchar(45) NOT NULL,blog_id int(10) unsigned NOT NULL,PRIMARY KEY  (post_id),KEY FK_post_blog (blog_id),CONSTRAINT FK_post_blog FOREIGN KEY (blog_id) REFERENCES blog (blog_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

在这里,我将解释如何获取和映射*-一对一和一对多结果映射。

package com.sivalabs.mybatisdemo.domain;public class User 
{private Integer userId;private String emailId;private String password;private String firstName;private String lastName;private Blog blog;//setters and getters
}

package com.sivalabs.mybatisdemo.domain;import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class Blog {private Integer blogId;private String blogName;private Date createdOn;private List<Post> posts = new ArrayList<Post>();//setters and getters
}

package com.sivalabs.mybatisdemo.domain;import java.util.Date;public class Post 
{private Integer postId;private String title;private String content;private Date createdOn;//setters and getters
}

在mybatis-config.xml中,为bean配置类型别名。

<typeAliases><typeAlias type='com.sivalabs.mybatisdemo.domain.User' alias='User'/><typeAlias type='com.sivalabs.mybatisdemo.domain.Blog' alias='Blog'/><typeAlias type='com.sivalabs.mybatisdemo.domain.Post' alias='Post'/>  
</typeAliases>


*-具有一个结果映射:

在UserMapper.xml中,如下配置sql查询和结果映射:

<mapper namespace='com.sivalabs.mybatisdemo.mappers.UserMapper'><resultMap type='User' id='UserResult'><id property='userId' column='user_id'/><result property='emailId' column='email_id'/><result property='password' column='password'/><result property='firstName' column='first_name'/><result property='lastName' column='last_name'/><association property='blog' resultMap='BlogResult'/></resultMap><resultMap type='Blog' id='BlogResult'><id property='blogId' column='blog_id'/><result property='blogName' column='BLOG_NAME'/><result property='createdOn' column='CREATED_ON'/>    </resultMap><select id='getUserById' parameterType='int' resultMap='UserResult'>SELECT U.USER_ID, U.EMAIL_ID, U.PASSWORD, U.FIRST_NAME, U.LAST_NAME, B.BLOG_ID, B.BLOG_NAME, B.CREATED_ONFROM USER U LEFT OUTER JOIN BLOG B ON U.BLOG_ID=B.BLOG_IDWHERE U.USER_ID = #{userId}</select><select id='getAllUsers' resultMap='UserResult'>SELECT U.USER_ID, U.EMAIL_ID, U.PASSWORD, U.FIRST_NAME, U.LAST_NAME, B.BLOG_ID, B.BLOG_NAME, B.CREATED_ONFROM USER U LEFT OUTER JOIN BLOG B ON U.BLOG_ID=B.BLOG_ID</select></mapper>

在JUnit Test中,编写一种方法来测试关联加载。

public void getUserById() 
{SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();try{UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.getUserById(1);System.out.println(user.getBlog());}finally{sqlSession.close();}
}


一对多结果映射:

在BlogMapper.xml中,如下配置Blog to Posts关系:

<mapper namespace='com.sivalabs.mybatisdemo.mappers.BlogMapper'><resultMap type='Blog' id='BlogResult'><id property='blogId' column='blog_id'/><result property='blogName' column='BLOG_NAME'/><result property='createdOn' column='CREATED_ON'/><collection property='posts' ofType='Post' resultMap='PostResult' columnPrefix='post_'></collection></resultMap><resultMap type='Post' id='PostResult'><id property='postId' column='post_id'/><result property='title' column='title'/><result property='content' column='content'/><result property='createdOn' column='created_on'/></resultMap><select id='getBlogById' parameterType='int' resultMap='BlogResult'>SELECT b.blog_id, b.blog_name, b.created_on, p.post_id as post_post_id, p.title as post_title, p.content as post_content, p.created_on as post_created_onFROM blog b left outer join post p on b.blog_id=p.blog_idWHERE b.BLOG_ID=#{blogId}</select><select id='getAllBlogs' resultMap='BlogResult'>SELECT b.blog_id, b.blog_name, b.created_on as blog_created_on, p.post_id as post_post_id, p.title as post_title, p.content as post_content, p.created_on as post_created_onFROM blog b left outer join post p on b.blog_id=p.blog_id</select></mapper>

在JUnit Test中,编写一种测试方法来测试博客到帖子的关系映射。

public void getBlogById() 
{SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();try{BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);Blog blog = blogMapper.getBlogById(1);System.out.println(blog);List<Post> posts = blog.getPosts();for (Post post : posts) {System.out.println(post);}}finally{sqlSession.close();}
}


支持 整合

MyBatis-Spring是MyBatis的子项目,并提供Spring集成支持,从而大大简化了MyBatis的用法。 对于那些熟悉Spring的依赖注入方法的人来说,使用MyBatis-Spring非常简单。

首先让我们看看不使用Spring的MyBatis的使用过程。

1.通过传递包含数据源属性,映射器XML列表和TypeAliases等的mybatis-config.xml,使用SqlSessionFactoryBuilder创建SqlSessionFactory。

2.从SqlSessionFactory创建SqlSession对象

3.从SqlSession中获取Mapper实例并执行查询。

4.使用SqlSession对象提交或回滚事务。

使用MyBatis-Spring,可以在Spring ApplicationContext中配置上述大多数步骤,并且可以将SqlSession或Mapper实例注入到Spring Beans中。 然后,我们可以使用Spring的TransactionManagement功能,而无需在整个代码中编写事务提交/回滚代码。

现在让我们看看如何配置MyBatis + Spring集成的东西。

步骤#1:在pom.xml中配置MyBatis-Spring依赖项

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>3.1.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>3.1.1.RELEASE</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.21</version><scope>runtime</scope></dependency><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>2.2.2</version></dependency>


步骤#2:您不需要在mybatis-config.xml中配置数据库属性。

我们可以在Spring Container中配置DataSource并使用它来构建MyBatis SqlSessionFactory。

MyBatis-Spring使用org.mybatis.spring.SqlSessionFactoryBean代替SqlSessionFactoryBuilder来构建SqlSessionFactory。

我们可以将dataSource,Mapper XML文件位置,typeAliases等传递给SqlSessionFactoryBean。

<bean id='dataSource' class='org.apache.commons.dbcp.BasicDataSource'><property name='driverClassName' value='${jdbc.driverClassName}'/><property name='url' value='${jdbc.url}'/><property name='username' value='${jdbc.username}'/><property name='password' value='${jdbc.password}'/></bean><bean id='sqlSessionFactory' class='org.mybatis.spring.SqlSessionFactoryBean'><property name='dataSource' ref='dataSource' /><property name='typeAliasesPackage' value='com.sivalabs.mybatisdemo.domain'/><property name='mapperLocations' value='classpath*:com/sivalabs/mybatisdemo/mappers/**/*.xml' /></bean>

步骤#3:配置提供ThreadSafe SqlSession对象的SqlSessionTemplate。

<bean id='sqlSession' class='org.mybatis.spring.SqlSessionTemplate'><constructor-arg index='0' ref='sqlSessionFactory' /></bean>


步骤#4:为了能够直接注入Mapper,我们应该注册org.mybatis.spring.mapper.MapperScannerConfigurer并配置要在其中找到Mapper接口的包名称。

<bean class='org.mybatis.spring.mapper.MapperScannerConfigurer'><property name='basePackage' value='com.sivalabs.mybatisdemo.mappers' /></bean>


步骤5:将 TransactionManager配置为支持基于注释的事务支持。

<tx:annotation-driven transaction-manager='transactionManager'/><bean id='transactionManager' class='org.springframework.jdbc.datasource.DataSourceTransactionManager'><property name='dataSource' ref='dataSource' /></bean>


步骤#6:更新Service类并在Spring容器中注册它们。

package com.sivalabs.mybatisdemo.service;import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.sivalabs.mybatisdemo.domain.User;
import com.sivalabs.mybatisdemo.mappers.UserMapper;@Service
@Transactional
public class UserService
{@Autowiredprivate SqlSession sqlSession; //This is to demonstrate injecting SqlSession objectpublic void insertUser(User user) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.insertUser(user);}public User getUserById(Integer userId) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);return userMapper.getUserById(userId);}}

package com.sivalabs.mybatisdemo.service;import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sivalabs.mybatisdemo.domain.Blog;
import com.sivalabs.mybatisdemo.mappers.BlogMapper;@Service
@Transactional
public class BlogService
{@Autowiredprivate BlogMapper blogMapper; // This is to demonstratee how to inject Mappers directlypublic void insertBlog(Blog blog) {blogMapper.insertBlog(blog);}public Blog getBlogById(Integer blogId) {return blogMapper.getBlogById(blogId);}public List<Blog> getAllBlogs() {return blogMapper.getAllBlogs();}
}


注意:当我们可以直接注入Mappers时,为什么还要注入SqlSession对象? 因为SqlSession对象包含更细粒度的方法,所以有时会派上用场。

例如:如果我们想获取更新查询更新了多少条记录,可以使用SqlSession,如下所示:

int updatedRowCount = sqlSession.update('com.sivalabs.mybatisdemo.mappers.UserMapper.updateUser', user);

到目前为止,我还没有找到一种无需使用SqlSession对象就可以获取行更新计数的方法。

步骤#7编写JUnit测试以测试UserService和BlogService。

package com.sivalabs.mybatisdemo;import java.util.List;import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.sivalabs.mybatisdemo.domain.User;
import com.sivalabs.mybatisdemo.service.UserService;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations='classpath:applicationContext.xml')
public class SpringUserServiceTest 
{@Autowiredprivate UserService userService;@Testpublic void testGetUserById() {User user = userService.getUserById(1);Assert.assertNotNull(user);System.out.println(user);System.out.println(user.getBlog());}@Testpublic void testUpdateUser() {long timestamp = System.currentTimeMillis();User user = userService.getUserById(2);user.setFirstName('TestFirstName'+timestamp);user.setLastName('TestLastName'+timestamp);userService.updateUser(user);User updatedUser = userService.getUserById(2);Assert.assertEquals(user.getFirstName(), updatedUser.getFirstName());Assert.assertEquals(user.getLastName(), updatedUser.getLastName());}}

package com.sivalabs.mybatisdemo;import java.util.Date;
import java.util.List;import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.sivalabs.mybatisdemo.domain.Blog;
import com.sivalabs.mybatisdemo.domain.Post;
import com.sivalabs.mybatisdemo.service.BlogService;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations='classpath:applicationContext.xml')
public class SpringBlogServiceTest 
{@Autowiredprivate BlogService blogService;@Testpublic void testGetBlogById() {Blog blog = blogService.getBlogById(1);Assert.assertNotNull(blog);System.out.println(blog);List<Post> posts = blog.getPosts();for (Post post : posts) {System.out.println(post);}}@Testpublic void testInsertBlog() {Blog blog = new Blog();blog.setBlogName('test_blog_'+System.currentTimeMillis());blog.setCreatedOn(new Date());blogService.insertBlog(blog);Assert.assertTrue(blog.getBlogId() != 0);Blog createdBlog = blogService.getBlogById(blog.getBlogId());Assert.assertNotNull(createdBlog);Assert.assertEquals(blog.getBlogName(), createdBlog.getBlogName());}}

参考: MyBatis教程:第3部分-映射关系 ,   MyBatis教程:第4部分– JCG合作伙伴 Siva Reddy的My Integrations on Technology上的Spring Integration 。

翻译自: https://www.javacodegeeks.com/2012/11/mybatis-tutorial-crud-operations-and-mapping-relationships-part-2.html

mybatis crud

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB 排序函数(先按第一列排序(主排序)然后再按第二列排序(次排序))

利用 sortrows 函数实现MATLAB 先按第一列排序&#xff08;主排序&#xff09;然后再按第二列排序&#xff08;次排序&#xff09; A [8,9,6;5,5,2;2,5,8] sortrows(A)A 8 9 65 5 22 5 8ans 2 5 85 5 28 9 6

用PDB库调试Python程序

Python自带的pdb库&#xff0c;发现用pdb来调试程序还是很方便的&#xff0c;当然了&#xff0c;什么远程调试&#xff0c;多线程之类&#xff0c;pdb是搞不定的。用pdb调试有多种方式可选&#xff1a;1. 命令行启动目标程序&#xff0c;加上-m参数&#xff0c;这样调用myscrip…

数据操作

mysql> create table employee(-> id int primary key auto_increment,-> emp_name char(12) not null,-> sex enum(male,female) not null default male, #大部分是男的-> age int(3) unsigned not null default 28,-> hire_date date not null,-> post …

/usr/bin/ld: cannot find -l*** 这里***可以指lapack等

在Linux安装编译过程中有时会出现在如下形式的错误&#xff1a; /usr/bin/ld: cannot find -l***这里表示编译过程中找不到以下库名&#xff1a; lib库名(即***).so会发生这样的原因有以下三种情形&#xff1a; 系统没有安装相对应的lib 相对应的lib版本不对 lib&#xff0…

通过分区在Kafka中实现订单保证人

Kafka最重要的功能之一是实现消息的负载平衡&#xff0c;并保证分布式集群中的排序&#xff0c;否则传统队列中将无法实现。 首先让我们尝试了解问题陈述 让我们假设我们有一个主题&#xff0c;其中发送消息&#xff0c;并且有一个消费者正在使用这些消息。 如果只有一个使用…

破解栅栏密码python脚本

今天遇到一个要破解的栅栏密码&#xff0c;写了个通用的脚本 1 #!/usr/bin/env python2 # -*- coding: gbk -*-3 # -*- coding: utf_8 -*-4 # Author: 蔚蓝行5 # http://www.cnblogs.com/duanv6 e raw_input(请输入要解密的字符串\n)7 elen len(e)8 field[]9 for i in range(…

水稻已知os基因号,利用DAVIA进行GO功能富集分析

第1-5步&#xff1a; 已知水稻的基因&#xff08;os&#xff09;&#xff0c;进行功能注释 第6步 第七步&#xff1a; 第八步&#xff1a; 第九步&#xff1a; 第十步&#xff1a; 第十一步&#xff1a;

二,八,十,十六进制之间转换的相应方法

int num1 Integer.valueOf(n,16); //16进制转换成10进制 Integer.toHexString(Integer i); //10进制转换成16进制 补充&#xff1a;Integer.toHexString(Integer i);该方法得出的字符默认为小写&#xff0c;如果想得到大写结果&#xff0c;则变为Integer.toHexString(Integer i…

IDF实验室-图片里的英语

原题&#xff1a; 一恒河沙中有三千世界&#xff0c;一张图里也可以有很多东西。 不多说了&#xff0c;答案是这个图片包含的那句英文的所有单词的首字母。 首字母中的首字母要大写&#xff0c;答案格式是wctf{一坨首字母} 加油吧少年&#xff01;看好你哦~ writeup&#xff…

linux 终端调用MATLAB程序

linux 终端调用MATLAB程序 路径&#xff1a;/A/B/C/ 程序名称&#xff1a;xxx.m linux 终端调用MATLAB函数方法 cd /A/B/C/ matlab -nodisplay -nosplash -nodesktop -r "xxx;exit;"

2018-11-02 在代码中进行中文命名实践的短期目标

对中文命名的意义不再赘述, 请参看之前的对在代码中使用中文命名的质疑与回应. 去年中文命名实践的阻力和应对之后, 在一些小项目中继续实践了中文命名(Java/JS/Python等, 详见之前的专栏文章), 涉及领域不少但尚未形成明确的重点项目. 发现了一些在业务相关代码使用中文命名的…

Wireshark 命令行捕获数据

在 Wireshark 程序目录中&#xff0c;包含两个命令行捕获工具。这两个工具分别是 Dumpcap 和 Tshark。当不能以图形界面方式捕获数据时&#xff0c;可以在命令行使用 dumpcap 或 tshark 程序实施捕获。 一、使用 Dumpcap 捕获数据 执行 dumpcap -h 可以查看参数详情。 1、执行 …

zk ui_高级ZK:异步UI更新和后台处理–第2部分

zk ui介绍 在第1部分中&#xff0c;我展示了如何在ZK应用程序中使用服务器推送和线程来执行后台任务。 但是&#xff0c;这个简单的示例具有一个重大缺陷&#xff0c;这使其对于实际应用程序而言是一种不好的方法&#xff1a;它为每个后台任务启动了一个新线程。 JDK5引入了E…

学生管理系统 数据库版结果 查询student表中所有学生信息

1.创建school_java数据库 CREATE DATABASE schooljava; USE schooljava; CREATE TABLE student ( id INT(11), name VARCHAR(25), tel INT(11), sex VARCHAR(6) ); DESC student; java代码 package Mysql; import java.sql.Connection; import java.sql.DriverManager; imp…

如何查看思科交换机的出厂时间?

1.在交换机命令行运行show version 查看交换机的sn码 System serial number : FOC1723W0VP 2.SN码取出第四位至七位 以 FOC1723W0VP 为例 第四和第五位代表年份&#xff0c;第六和第七位代表当年的第XX周 &#xff08;范围是01至52周&#xff09; 1719962013 ; 23周 (注&…

Linux系统电脑非正常关机之后可能出现在登录界面循环的情况

Linux系统电脑非正常关机之后可能出现在登录界面循环的情况 例如&#xff1a; Ubuntu 18.04 有时会出现在登录界面循环&#xff0c;你输入密码&#xff0c;回车后又回到输入密码界面 &#xff0c;遇到这样的解决办法是直接进入命令行模式&#xff0c;然后看一下home文件夹&…

使用Spring Cloud Stream与RabbitMQ集成

在我以前的文章中&#xff0c;我写了两个系统之间非常简单的集成场景-一个生成一个工作单元&#xff0c;另一个处理该工作单元&#xff0c;以及Spring Integration如何使这种集成非常容易。 在这里&#xff0c;我将演示如何使用Spring Cloud Stream进一步简化此集成方案 我在…

ubuntu18.0.4 不能下载 libgd2-dev(ubuntu 20.04 安装perl 中GD 模块失败的解决办法)

ubuntu18.0.4 不能下载 libgd2-dev 一、错误信息&#xff1a; Unable to locate package libgd2-dev二、原因 没有对应源 到 https://packages.ubuntu.com/找对应名称 三、解决 18.04之后没有libgd2-dev sudo apt-get install libgd-dev参考&#xff1a;https://www.cnblo…

开课博客

自我介绍 对于自我介绍这篇我还是很意外的&#xff0c;个人信息不说了&#xff0c;说说自己的情况吧&#xff0c;当时大一的时候&#xff0c;感觉还是很喜欢编程的&#xff0c;个人感觉老师也挺喜欢我&#xff0c;可能大一下的时候心思多了点&#xff0c;慢慢的就没放多少心思在…

抓到一只苍蝇 writeup

题目在 http://ctf.idf.cn/index.php?ggame&marticle&aindex&id57 下载到的文件是misc_fly.pcapng&#xff0c;使用wireshark打开&#xff0c;能看到一堆tcp、http和dns协议混合的数据包&#xff0c;在上面的框里面输入http&#xff0c;让它只显示http协议的数据包…