版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

ORM模型

简单地说,ORM模型就是数据库的表与简单Java对象(Plain Ordinary Java Object,简称 POJO)的对象关系映射模型(Object Relational Mapping 简称ORM)。它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中,其工作原理如下图所示:

从上图,我们可以看出使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(Persisent Object 简称PO)。ORM框架通过映射关系将这些面向对象的操作转换成底层的SQL操作。类似地,当数据库查询完毕后将结果返回至ORM,由ORM将其封装为Java对象。

在本系列教程中,我们将详细介绍轻量级的ORM框架MyBatis。

MyBatis概述

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis原本是apache的一个开源项目iBatis, 2010年该项目由apache software foundation 迁移到了google code并改名为MyBatis 。2013年11月MyBatis又迁移到Github。

The MyBatis SQL mapper framework makes it easier to use a relational database with object-oriented applications. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. Simplicity is the biggest advantage of the MyBatis data mapper over object relational mapping tools.

MyBatis对JDBC操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要开发人员花费大量的精力去处理例如注册驱动、创建connection、创建statement、手动设置参数等JDBC操作。之前,当我们使用JDBC持久化的时候,sql语句被硬编码到java代码中,耦合度太高代码不易于维护;一旦我们修改了Java代码就需要对项目进行重新的编译、打包、发布。MyBatis将sql语句和java代码分开,功能边界清晰;前者专注于数据,后者侧重于业务。

官方文档

https://mybatis.org/mybatis-3/zh/index.html

MyBatis入门示例

在此,我们以示例的形式介绍MyBatis的入门案例,项目结构如下:

该示例采用Maven对项目进行管理;对于Maven不熟悉的小伙伴请移步《图文详解J2EE开发环境搭建全过程》。

详细步骤如下:

第一步:数据准备

创建数据库mybatisDatabase和表user

DROP DATABASE IF EXISTS mybatisDatabase;
CREATE DATABASE mybatisDatabase;
use mybatisDatabase;
CREATE TABLE user(id INT primary key auto_increment,username VARCHAR(50),password VARCHAR(50),gender VARCHAR(10)
);INSERT INTO user(username,password,gender) VALUES("lucy","123456","female");
INSERT INTO user(username,password,gender) VALUES("momo","234567","female");
INSERT INTO user(username,password,gender) VALUES("xixi","345678","female");
INSERT INTO user(username,password,gender) VALUES("pepe","456123","female");SELECT * FROM user;

第二步:创建Maven项目

创建Maven项目的过程及其详细步骤请参见《图文详解J2EE开发环境搭建全过程》

第三步:添加依赖

在pom.xml中添加以下依赖

  • log4j-1.2.17.jar
  • mybatis-3.4.1.jar
  • mysql-connector-java-5.1.7-bin.jar
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cn</groupId><artifactId>MyBatisMaven01</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>MyBatisMaven01 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency></dependencies><build><finalName>MyBatisMaven01</finalName></build>
</project>

第四步:编写日志配置文件log4j.properties

请在src/main/resource中创建log4j.properties并编写其配置,内容如下:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

第五步:编写User

请在src/main/java中创建包 cn.com.pojo 并在该包中创建User类,该User类中各属性值与user表尽量保持一致。

package cn.com.pojo;public class User {private int id;private String username;private String password;private String gender;public User() {}public User(int id, String username, String password, String gender) {this.id = id;this.username = username;this.password = password;this.gender = gender;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", password=" + password + ", gender=" + gender + "]";}}

第六步:编写UserMapper.java接口

请在src/main/java中创建包 cn.com.mapper 并在该包中创建接口UserMapper.java。

在该接口中定义一个方法:依据用户id查询用户信息。

package cn.com.mapper;import cn.com.pojo.User;
/*** 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl*/
public interface UserMapper {User selectUserById(String id);
}

第七步:编写UserMapper.xml映射文件

请在src/main/resource中创建创建 cn.com.mapper 包并在该包中创建映射文件UserMapper.xml,其内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.com.mapper.UserMapper">   <select id="selectUserById" parameterType="String" resultType="cn.com.pojo.User">select * from user where id = #{id}</select>
</mapper>

xxxMapper.xml文件的核心功能为:从数据库中查询数据并将查询结果封装成POJO。

一般情况下:xxxMapper.xml文件与xxxMapper.java文件相对应,即文件名相同后缀名不同。

在该配置文件中:

  • namespace表示该mapper的命名空间,其取值为xxxMapper.java接口的全类名。通过此配置,把xxxMapper.xml文件与xxxMapper.java文件进行了绑定。

  • select标签表示select语句。其中,id属性用于为sql语句配置唯一标识,其值为xxxMapper.java文件中的方法名。通过此配置,把xxxMapper.java文件中的方法与xxxMapper.xml中的SQL语句进行了绑定

  • parameterType属性用于表示输入参数的类型,因为MyBatis自身具备类型推断能力;所以,一般来说可以省略该属性。

  • resultType属性用于指定执行select查询语句之后每行记录对应的JavaBean对象的全类名。

  • 在mapper.xml中使用#{ }表示占位符,类似于JDBC中的占位符?

第八步:编写mybatis-config.xml全局配置文件

请在src/main/resource目录下创建mybatis的核心配置文件mybatis-config.xml并完成以下操作:

  • 1、利用environments标签配置数据库相关信息
  • 2、利用mappers标签配置xxxMapper.xml映射文件。

至于mybatis-config.xml文件中的其它常用配置,我们在后续的教程中会提到。

代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置数据源 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatisDatabase"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 配置mapper --><mappers><mapper resource="cn/com/mapper/UserMapper.xml"/></mappers></configuration>

请注意:在每个mapper标签中使用resource属性指定xxxMapper.xml的路径。

第九步:测试

请在src/test/java目录下创建 cn.com.test 包并在该包中创建测试类MybatisTest并借助于junit进行测试。

代码如下:

package cn.com.test;import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import cn.com.mapper.UserMapper;
import cn.com.pojo.User;
/*** 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl*/
public class MybatisTest {@Testpublic void testMybatis() {SqlSession sqlSession = null;try {// 读取mybatis的核心配置文件mybatis-config.xmlInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 通过SqlSessionFactoryBuilder解析配置文件获取sqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);// 通过SqlSessionFactory对象创建SqlSession对象sqlSession = sqlSessionFactory.openSession();// 通过sqlSession获取MapperUserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 通过Mapper执行查询User user = userMapper.selectUserById("1");System.out.println(user);} catch (Exception e) {System.out.println(e.toString());} finally {// 关闭SqlSessionif (sqlSession != null) {sqlSession.close();}}}}

要点概述:

  • 1、通过org.apache.ibatis.io.Resources读取mybatis的配置文件mybatis-config.xml。
  • 2、通过SqlSessionFactoryBuilder对象生成sqlSessionFactory对象。
  • 3、通过SqlSessionFactory对象创建SqlSession对象,该对象用于操作数据库或者获取Mapper
  • 4、通过SqlSession的getMapper( )方法获取Mapper。在此过程中,getMapper( )会通过动态代理动态生成UserMapper.java接口的代理实现类。
  • 5、利用Mapper进行查询操作。
  • 6、执行完查询操作后关闭SqlSession。

结果如下:

MyBatis入门示例总结

  • 1、mybatis-config.xml是mybatis的全局配置文件,亦称为核心配置文件
  • 2、mapper.xml用于定义与数据库相关的sql语句
  • 3、SqlSession用于获取映射器示例和管理事务
  • 4、在MyBatis中不再使用JDBC直接操作数据库,而是通过映射文件UserMapper.xml操作数据库。而且,该映射文件可将查询结果自动封装(映射)成POJO
  • 5、使用MyBatis可将Java代码与SQL语句相分离

思考题

在cn.com.pojo创建User类时,我们说:该User类中各属性值与user表尽量保持一致从实现自动映射。那么,假若Javabean中的属性与数据库表中的字段不一致时该怎么解决呢?其实,也不难;在SQL查询时使用别名就可以解决这个问题。

例如:

select user_Name as userName from user;

Eclipse中关联MyBatis源码

为在开发过程中便捷查看MyBatis源码,我们需要在Eclipse对其进行关联。

第一步

下载源码并存放至本地,图示如下:

第二步

在Eclipse的项目中找到mybatis-3.4.1.jar,图示如下:

第三步

选中mybatis-3.4.1.jar右键选择Properties后再添加刚才下载好的源码文件mybatis-3.4.1-src.zip,图示如下:

最后,单击 Apply and Close即可。

Eclipse基于Maven的MyBatis开发教程详解相关推荐

  1. 史上最全的maven pom.xml文件教程详解

    <project xmlns=http://maven.apache.org/POM/4.0.0 xmlns:xsi=http://www.w3.org/2001/XMLSchema-insta ...

  2. 基于SOA架构的开发策略详解

    面向服务的开发模式已经是为大家熟知的下一代智能汽车开发模式了,由于SOA(Service Oriented Architecture)架构的灵活性和可扩展性,而这个恰恰与「软件定义汽车」的思路不谋而合 ...

  3. 传智播客ADO.Net项目开发教程详解

    内容简介: 本教程为传智播客.Net培训课堂的现场录像,请到传智播客.Net学院下载更多免费.Net视频教程或者参加讲师现场授课的.Net实地培训班. 视频目录: (一)操作员管理.部门管理.基础数据 ...

  4. Maven下载及安装教程详解

    进入Maven官网的下载页面:http://maven.apache.org/download.cgi#,如下图所示: 选择当前最新版本:"apache-maven-3.3.9-bin.zi ...

  5. 基于Anaconda配置Python开发环境详解(1)安装Anaconda并做基本配置

    本系列帖子将从纯小白的视角讲解新手使用Anaconda配置Python开发环境全流程,使用Pycharm编辑器.conda包管理器. 第一节是关于Anaconda安装的 什么是conda conda是 ...

  6. Pom.xml文件教程详解

    原创整理不易,转载请注明出处:史上最全的maven pom.xml文件教程详解 代码下载地址:http://www.zuidaima.com/share/1781583829978112.htm   ...

  7. vscode配置基于maven的Javaweb开发

    vscode配置基于maven的Javaweb开发 得益于vscode的便捷性,并且不是很吃电脑性能,所以得到越来越多的青睐,vscode在编写脚本语言比如python上非常好用,但是如果开发大型项目 ...

  8. 基于Spring+SpringMvc+Mybatis开发javaWeb汽车维修管理系统

    你知道的越多,你不知道的越多 点赞再看,养成习惯 源码分享在文末,点赞关注,解锁更多毕业设计项目 企鹅:869192208 如果您有疑问或者见解,欢迎指教: 文章目录 一.开发背景 二. 需求分析 三 ...

  9. 基于Spring+SpringMVC+Mybatis开发电影院订票系统前后台

    你知道的越多,你不知道的越多 点赞再看,养成习惯 源码分享在文末,点赞关注,解锁更多毕业设计项目 企鹅:869192208 如果您有疑问或者见解,欢迎指教: 文章目录 一.开发背景 二. 需求分析 三 ...

最新文章

  1. 你走对Linux学习之路了吗?
  2. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...
  3. 区块链公司发现BCH团队比BTC团队更容易接近
  4. centos 7.6安装java_Docker安装zabbix5.0LTS教程和优化
  5. C++ 指向指针的指针(多级间接寻址)
  6. makefile之伪目标(6)
  7. 《自己动手做交互系统》——第2章 音乐蛋糕盘
  8. 按图索骥:SQL中数据倾斜问题的处理思路与方法
  9. C语言 pthread_exit
  10. 【VB】StrConv函数.
  11. 上课解除教师机控制(红蜘蛛)超详细
  12. 腾讯电脑管家具有计算机病毒查杀功能,腾讯电脑管家算杀毒软件吗_腾讯电脑管家不仅仅是杀毒软件-高达阁杀毒软件站...
  13. java接口压力测试
  14. 有什么软件测试固态硬盘,SSD差距有多大?两款主流NVMe固态硬盘测试,一看就包懂...
  15. 中国沛县高层次人才创新创业大赛(深圳赛区)报名启动
  16. 微信小程序时间选择器
  17. php计算机毕业设计 基于微信小程序的房屋出租租赁 小程序 uniapp
  18. 【07】函数调用:为什么会发生stack overflow?
  19. 计算机键盘上的基准键是哪两个键,键盘上的基准键分别是什么?
  20. htons() ntohl() ntohs() htons()的区别及详解

热门文章

  1. conda创建环境后一个库都没有解决办法
  2. Unity中的SendMessage方法
  3. Java实现导出excel对重复数据进行单元格合并
  4. 酒店管理系统的部分功能实现代码(预订,退订,查看所有房间状态)
  5. TAB补全时出现Warning: error while crawling /home/xiang: boost::filesystem::status: Permission denied
  6. 有哪些好用的互联网数据抓取,数据采集,页面解析工具?
  7. 《安卓最佳免费应用》
  8. PHP 屏幕亮度,win7亮度调节在哪里
  9. 计算机任务驱动法教学课题,任务驱动教学法与计算机教学
  10. 财务机器人实现高效赋能财务精细化运营