Mybatis在Maven项目中使用
Mybatis概览
ORM是什么?
ORM是Object Realtion Mapping的缩写,顾名思义,即对象关系映射。
ORM是一种以面向对象的方式来进行数据库操作的技术。Web开发中常用的语言,都会有对应的ORM框架,而Mybatis就是Java开发中一种常用的ORM框架。
简单地理解,通过Java进行数据库访问的正常流程可以分为以下几步:
- 准备好SQL语句
- 调用JDBC的API传入SQL语句,设置参数
- 解析JDBC返回的结果
这个过程实际上非常麻烦,比如:
- 在Java代码中拼接SQL非常麻烦,而且易于出错
- JDBC的代码调用有很多重复性的代码
- 从JDBC返回的结果转换成领域模型的Java对象非常繁琐
而使用ORM框架,则可以让我们用面向对象的方式来操作数据库,比如通过一个简单的函数就完成上面的流程,直接返回映射为Java对象的结果。这个流程中很大一部分工作就交给ORM自动化帮我们执行了。
Mybatis是支持定制化SQL,存储过程以及高级映射的优秀持久层框架。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以对配置和原生Map使用简单的XML或标注,将接口和Java的POJOS(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
简单地理解,你可以认为Mybatis将SQL语句,以及SQL返回结果到Java对象的映射,都放到一个易于配置的XML文件里了,你的Java代码会变得异常简单。当然除了XML,Mybatis同时也支持基于标注的方式,但是功能上会有一些限制。总体来说,还是推荐使用XML方式,一些简单的SQL使用标注会更方便一些。
创建项目
新建一个Maven项目,接下来引入Mybatis和MySQL的依赖:
- <!-- mybatis依赖 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.4.0</version>
- </dependency>
- <!-- MySQL数据库依赖 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.6</version>
- </dependency>
既然是ORM的练习,先设计Object,再设计Relation,最后再看怎么做Mapping
实体类设计
分析我们的业务场景,可以设计三个类:
Question
表示问题Answer
表示回答Tag
表示问题标签
其中:
Question
可以有多个Answer
,一个Answer
对应唯一一个Question
,一对多的关系Question
可以有多个Tage
,一个Tag
可用于多个Question
,多对多的关系
暂时先不管Answer和Tag,只关注Question:
Question.java
- package com.fpc.Entity;
- import java.util.Date;
- import java.util.List;
- public class Question {
- private int id;
- private String title;
- private String description;
- private Date createdTime;
- private List<Tag> tags;
- private List<Answer> answers;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- public Date getCreatedTime() {
- return createdTime;
- }
- public void setCreatedTime(Date createdTime) {
- this.createdTime = createdTime;
- }
- public List<Tag> getTags() {
- return tags;
- }
- public void setTags(List<Tag> tags) {
- this.tags = tags;
- }
- public List<Answer> getAnswers() {
- return answers;
- }
- public void setAnswers(List<Answer> answers) {
- this.answers = answers;
- }
- }
这里的Question实现了Serializable接口,实现这个接口是为了后面缓存查询结果是需要的。
数据库设计
除了设计Question,Answer和Tag数据表,还需要定义一张维护Question和Tag之间多对多关系的表。最终数据库设计如下:
创建question表:
- CREATE TABLE question(
- id INT PRIMARY KEY AUTO_INCREMENT,
- createdTime DATETIME,
- description LONGTEXT,
- title VARCHAR(255)
- );
接下来添加MyBatis的配置,在resources目录下简历mybatis.xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <!-- 引用db.properties配置文件 -->
- <properties resource="db.properties"></properties>
- <!--
- development:开发模式
- work:工作模式
- -->
- <typeAliases>
- <!-- <typeAlias type="com.fpc.Entity.User" alias="_User"/> -->
- <package name="com.fpc.Entity"/>
- </typeAliases>
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC"/>
- <!-- 配置数据库连接信息 -->
- <dataSource type="POOLED">
- <!-- value属性值引用db.properties配置文件中配置的值 -->
- <property name="driver" value="${driver}"/>
- <property name="url" value="${url}"/>
- <property name="username" value="${name}"/>
- <property name="password" value="${password}"/>
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <!-- 注册userMapper.xml文件,
- userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
- <mapper resource="com/fpc/Mapping/questionMapper.xml"/>
- <!-- <mapper class="com.fpc.Mapping.questionMapperI"/> -->
- </mappers>
- </configuration>
这就是一个最简单的MyBatis配置文件,定义了数据源和mapper文件的位置。
关于MyBatis配置:
后面会发现有了Spring和SpringBoot支持,很多配置不需要手动设置了,比如映射文件的位置,数据源和事务管理器等,这个文件需要的内容非常少,甚至可以不需要这个文件了。
需要修改MyBatis配置文件的几种常用的情况包括:
- 要增加插件,比如后面需要用到的分页插件
- 修改MyBatis的运行时行为,参考settings选项
- 重写类型处理器或创建自定义的类型处理器来处理非标准类型。
定义Mapper接口
Mapper的Java接口,这是数据库访问的接口:
- package com.fpc.Mapping;
- import org.apache.ibatis.annotations.Param;
- import com.fpc.Entity.Question;
- public interface questionMapperI {
- Question findOne(@Param("id") int id);
- }
@Param是MyBatis提高的一个标注,表示id会解析成SQL语句的参数。
使用XML定义Mapper
对应于Mapper接口,还需要通过XML来给出Mapper的实现,将映射放在com/fpc/Mapping/下
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
- 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
- -->
- <mapper namespace="com.fpc.Mapping.questionMapperI">
- <select id="findOne" resultType="com.fpc.Entity.Question">
- select * from question where id = #{id}
- </select>
- </mapper>
Mapper的配置是MyBatis的精华,注意两点:
- 对应于每一个Mapper的Java接口方法,XML配置中有对应的一个元素来描述其SQL语句
- resultType元素定义了数据库返回(一行记录)如何映射到一个Java对象
使用Mapper
已经有一个可以根据id获取问题的接口方法了,编写测试类测试:
- package com.fpc.Test;
- import java.io.IOException;
- import java.io.Reader;
- 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 com.fpc.Entity.Question;
- import com.fpc.Mapping.questionMapperI;
- public class TestMybatis {
- public static void main(String[] args) {
- String resource = "mybatis.xml";
- Reader reader;
- try {
- reader = Resources.getResourceAsReader(resource);
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
- SqlSession sqlSession = sqlSessionFactory.openSession();
- questionMapperI questionMapper = sqlSession.getMapper(questionMapperI.class);
- Question question = questionMapper.findOne(1);
- System.out.println(question.getDescription());
- sqlSession.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
把这个main方法运行起来就能看到结果了,调用看起来有点复杂,这里涉及Mybatis的几个关键类:
- SqlSessionFactoryBuilder
- SqlSessionFactory
- SqlSession
其实引入Spring Boot之后,你会发现这几个类都被屏蔽掉了,你只需专注于写Mapper即可。不过了解一下这几个类,对于我们调试程序和理解MyBatis都是大有裨益的。
Mybatis在Maven项目中使用的更多相关文章
- Mybatis、maven项目中整合log4j (17)
Mybatis.maven项目总整合log4j java 中Mybatis.maven项目总整合log4j 1.pom增加log4j包引用 2.添加 log4j.properties文件 # java ...
- Maven项目中Spring整合Mybatis
Maven项目中Spring整合Mybatis 添加jar包依赖 spring需要的jar包依赖 <dependency> <groupId>org.springframewo ...
- 构建 shiro struts2 spring3 mybatis 的maven项目
书接上回 构建 struts2 spring3 mybatis 的maven项目 构建 pom.xml 继续在原有框架下 融合shiro ,具体shiro是啥 这里就不解释了,恩 反正功能挺强大的 本 ...
- 如何查看Maven项目中的jar包依赖树情况
对于开发人员,我想大家对于Maven应该不会陌生吧,如何在一个Maven项目中对这个项目中所引用的第三方jar包有个直观的了解呢? 其实实现很简单,只需要借助于Maven的一条命令,如下所示: mvn ...
- Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明
Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明 1.1. Mybatis invoke1 1.2. Spring的数据源配置2 1.3. Mybatis ...
- 在maven项目中解决第三方jar包依赖的问题
在maven项目中,对于那些在maven仓库中不存在的第三方jar,依赖解决通常有如下解决方法: 方法1:直接将jar包拷贝到项目指定目录下,然后在pom文件中指定依赖类型为system,如: < ...
- Java项目和maven项目中如何获取&设置配置文件中的属性
通常情况下,我们会在一些配置文件文件中配置一些属性.如: indexPath = E\:\\Tomcat_7.0\\webapps\\ipost_stage\\lucene\\index imgUpl ...
- Maven项目中,系统设置的CLASSPATH环境变量问题
在Maven项目中,系统的CLASSPATH环境变量失效了吗?在用Maven开发登录网站时,servlet-api出现错误,jdbc也出现错误,都是ClassNotFoundException,但这两 ...
- Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)
Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea ...
随机推荐
- Unix系统编程()brk,sbrk
在堆上分配内存 进程可以通过增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减.通常将堆的当前内存边界称为"program ...
- m4--宏处理器
m4 是 POSIX 标准中的一部分,所有版本的 UNIX 下都可用.虽然这种语言可以单独使用,但大多数人需要 m4 仅仅是因为 GNU autoconf 中的 “configure” 脚本依赖它.宏 ...
- RabbitMQ之发布订阅【译】
在上一节中我们创建了一个工作队列,最好的情况是工作队列能够把任务恰到好处的分配给每一个worker.这一节中我们将做一些完全不同的事情--将消息传递给每一个消费者,这种模式被称为发布/订阅. 为了说明 ...
- Memcached 1.4.20 发布,集中式缓存系统
内存缓存Memcached 1.4.20发布.2014-05-12 上一个版本是2014-05-01的1.4.19 此版本只修正了一个1.4.18和1.4.19中引入的Bug. 此版本只是修复了导致 ...
- NAT and Traversal NAT(TURN/STUN/ICE)
http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html -------------------------------- ...
- zend Studio10.6.2破解注册码
下载破解包:http://download.csdn.net/detail/gsls200808/7982115 安装方法:破解的jar文件com.zend.verifier_10.6.2.v2014 ...
- 断言(assert)和程序的安全保证
断言,用来DEBUG错误的,在DEBUG时发现然后跟踪错误! 通常 写一个程序给别人使用的,这个代码在安全性上的要求是什么呢?直觉上,我们都知道程序不应该崩.但是通常C/C++的程序如果把包含API的 ...
- 小结:线段树 & 主席树 & 树状数组
概要: 就是用来维护区间信息,然后各种秀智商游戏. 技巧及注意: 一定要注意标记的下放的顺序及影响!考虑是否有叠加或相互影响的可能! 和平衡树相同,在操作每一个节点时,必须保证祖先的tag已经完全下放 ...
- notepad++程序员开发插件
1. sftp 2. explore 3. XBrackets 括号自动补全(引号,方括号)
- 1808:公共子序列 即POJ 1458 Common Subsequence
1808:公共子序列 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 我们称序列Z = < z1, z2, ..., zk >是序列X = < ...