MyBatis 是当下最流行的持久层框架,也是ORM框架,本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。

  其中,ORM是指对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL 的关系模型数据库结构中去。这样,我们在具体操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单地操作实体对象的属性和方法 。ORM 技术是在对象和关系之间提供了一座桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

  mybatis的特点是:

  (1)简单易学:本身就很小且简单。没有任何第三方依赖,安装简单,只要两个jar文件(如:mybatis-3.2.8.jar,mysql-connector-java-5.1.7-bin.jar)+配置几个sql映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全地掌握它的设计思路和实现。

  (2)灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,甚至更多。

  (3)解除sql与程序代码的耦合:通过提供DAL层(Data Access Layer,数据访问层),将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,也提高了可维护性。

  (4)提供映射标签,支持对象与数据库的orm字段关系映射。

  (5)提供对象关系映射标签,支持对象关系组建维护。

  (6)提供xml标签,支持编写动态sql。

  在使用mybatis时,添加mybatis所依赖的jar包。然后配置两个xml文件:

  mybatis-config.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>
<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/XXX?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="2018"/>
</dataSource>
</environment>
</environments>
<!--这个地方也需要配一下。。
引入其他单个实体的ORM映射文件
-->
<mappers>
<mapper resource="config/User.xml"/>
</mappers>
</configuration>

  User.xml文件:

  

<?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="User">
保证命名空间,和接口的全类名一致,还可以下面这样写,指定一个包可以映射
-->
<mapper namespace="com.itszt.dao.UserDao">
<!-- 映射表和类 -->
<resultMap id="user2Map" type="user2">
<id property="uid" column="uid"></id>
<result property="username1" column="username"></result>
<result property="userage1" column="userage"></result>
<result property="usersalary1" column="usersalary"></result>
<result property="regTime1" column="regTime"></result>
</resultMap>
<!--
id:将来调用该功能的唯一标识,要和方法名保持一致
parameterType:传给通配的参数类型
resultType:最后返回的实体类型
#{uid}:等价于原来的问号通配 uid不是必须写的名称,我们出于见名知意 的原则这样去取名
-->
<select id="findUserByUid" parameterType="int" resultType="com.itszt.User">
SELECT * FROM user WHERE uid=#{uid}
</select>
<!-- resultMap为映射后的类的对象 -->
<select id="findUserByID" parameterType="int" resultMap="user2Map">
SELECT * FROM user WHERE uid=#{uid}
</select> <!--
传入一个实体,插入到数据库,实体的ID由java程序赋值
-->
<insert id="insertTest1" parameterType="itszt.User">
INSERT INTO user VALUES (#{uid},#{username},#{userage},#{usersalary},#{regTime});
</insert>
<!--
传入一个实体,插入到数据库,实体的ID由数据库自动增加
-->
<insert id="insertTest2" parameterType="itszt.User">
INSERT INTO user(username,userage,usersalary,regTime) VALUES (#{username},#{userage},#{usersalary},#{regTime});
</insert> <!--
传入一个实体,插入到数据库,实体的ID由数据库自动增加,并且返回新插入的数据的ID
-->
<insert id="insertTest3" parameterType="itszt.User">
INSERT INTO user(username,userage,usersalary,regTime) VALUES (#{username},#{userage},#{usersalary},#{regTime});
<selectKey keyProperty="uid" keyColumn="uid" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
</insert> <!--
传入一个实体,插入到数据库,实体的ID由数据库自动增加,并且返回新插入的数据的ID,使用order="BEFORE"
-->
<insert id="insertTest4" parameterType="itszt.User2">
INSERT INTO user2 VALUES (#{uid},#{username},#{userage},#{usersalary},#{regTime});
<selectKey keyProperty="uid" keyColumn="uid" resultType="String" order="BEFORE">
select uuid()
</selectKey>
</insert> <!--
查询1:传入一个匹配参数,查询返回单个实体对象
-->
<select id="findUserByUid" parameterType="int" resultType="itszt.User">
SELECT * FROM user WHERE uid=#{uid}
</select>
<!--
1.传入一个实体对象,删除
2.传入一个ID,根据ID进行删除
-->
<delete id="deleteTest1" parameterType="itszt.User">
DELETE FROM user WHERE uid=#{uid}
</delete>
<!--
更新
-->
<update id="updateTest1" parameterType="itszt.User">
UPDATE user set username=#{username} ,userage=#{userage} WHERE uid=#{uid}
</update>
<!--
查询1:传入一个匹配参数,查询返回单个实体对象
-->
<select id="findUserByUid" parameterType="int" resultType="itszt.User">
SELECT * FROM user WHERE uid=#{uid}
</select> <!--
查询2:查询多个实体对象,排序 limit
resultType:依然填写单个实体类型即可
-->
<select id="findUser2" parameterType="double" resultType="itszt.User">
SELECT * FROM user WHERE usersalary>#{value} ORDER BY usersalary DESC limit 0,3
</select> <select id="findUser3" parameterType="String" resultType="itszt.User">
SELECT * FROM user WHERE username LIKE #{value};
</select> <select id="findUser4" parameterType="String" resultType="itszt.User">
SELECT * FROM user WHERE username LIKE '%${value}%';
</select> <select id="findUsersByIDArrays" parameterType="Integer[]" resultType="user">
SELECT * FROM user WHERE uid IN
<foreach collection="array" open="(" close=")" separator="," item="uid">
#{uid}
</foreach>
</select> <!--进行抽取-->
<sql id="sqlUsernamePart">
<if test="username!=null">
AND username=#{username}
</if>
</sql>
<sql id="sqlUseragePart">
<if test="userage!=null">
AND userage=#{userage}
</if>
</sql> <!--演示Sql片段1-->
<select id="testSqlPart1" parameterType="hashMap" resultType="user">
SELECT * FROM user WHERE 1=1
<if test="username!=null">
AND username=#{username}
</if>
<if test="userage!=null">
AND userage=#{userage}
</if>
</select> <!--演示Sql片段2-->
<select id="testSqlPart2" parameterType="hashMap" resultType="user">
SELECT * FROM user
<where>
<if test="username!=null">
AND username=#{username}
</if> <if test="userage!=null">
AND userage=#{userage}
</if>
</where>
</select> <!--演示Sql片段3-->
<select id="testSqlPart3" parameterType="hashMap" resultType="user">
SELECT * FROM user
<where>
<include refid="sqlUsernamePart"></include>
<include refid="sqlUseragePart"></include>
</where>
</select>
</mapper>  

  下面是User实体类:

package com.itszt;
/**
* 实体类
*/
public class User {
private int uid;
private String username,
userpwd; public int getUid() {
return uid;
} public void setUid(int uid) {
this.uid = uid;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getUserpwd() {
return userpwd;
} public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
} @Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", userpwd='" + userpwd + '\'' +
'}';
}
}

  测试类:

import com.itszt.User;
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 java.io.IOException;
import java.io.InputStream; /**
* 测试类
*/
public class Test {
public static void main(String[] args) throws IOException {
//1.基于全局配置文件,加载出一个SqlSessionFactory对象
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.通过SqlSessionFactory,来获取一个SqlSession,将来我们对于数据库的操作,都是通过SqlSession完成的
SqlSession sqlSession = sqlSessionFactory.openSession(); //3.基于sqlsession调用我们之前在xml中配置好的功能
User user=sqlSession.selectOne("User.findUserByUid",4);
System.out.println("user = " + user); //4.释放资源
sqlSession.close();
}
} 

MyBatis 是当下最流行的持久层框架,也是ORM框架,本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

Mybatis的初步使用的更多相关文章

  1. java 持久框架mybatis的初步学习

    什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...

  2. 对Mybatis的初步认识

    1.认识Mybatis MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索. MyBat ...

  3. Mybatis学习-初步认知与使用

    Mybatis是一款优秀的持久层框架.且支持定制化SQL,存储过程以及高级映射 Mybatis几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,它使用简单的XML或注解来配置原始类型.接口和 ...

  4. (一)Mybatis之初步接触

    Maven的安装及环境配置 安装及配置只需按照以下三个链接的步骤走 撸帝的博客https://www.funtl.com/zh/maven/Maven-%E5%AE%89%E8%A3%85%E9%85 ...

  5. 初识 tk.mybatis.mapper

    在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...

  6. 初识 tk.mybatis.mapper 通用mapper

    在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...

  7. mybatis源码-解析配置文件(二)之解析的流程

    目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...

  8. mybatis源码-解析配置文件(一)之XML的DOM解析方式

    目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...

  9. SSM初步整合一

    SSM(spring+springmvc+mybatis)初步整合一配置步骤: 步骤一.导入所需jar包 步骤二 .配置web.xml文件 <?xml version="1.0&quo ...

随机推荐

  1. Redis的Set无序集合命令

    Set是集合,它是string类型的无序集合.set是通过hash table实现的,添加.删除和查找的复杂度都是0(1).对集合我们可以取并集.交集.差集.通过这些操作我们可以实现sns中的好友推荐 ...

  2. 【bzoj1029】【JSOI2007】建筑抢修

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 6417  Solved: 2883[Submit][Statu ...

  3. 复习JavaScript随手记

    数据类型 基本类型 string number boolean undefined number类型,包含整数浮点数 NaN和自己都不相等,涉及NaN的计算结果都是NaN isNaN()函数用于判断一 ...

  4. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

  5. elasticsearch配合mysql实现全文搜索

    之前用了sphinx,发现很多东西很久都没更新过了,之前只是知道有elasticsearch这个东西,还以为是java才能用,所以一直没有去了解过,也许sphinx慢慢会被淘汰了吧. 前置条件:需要安 ...

  6. 对于redis底层框架的理解(五)

    之前总结了redis的通讯流程,基本框架,epoll的封装等等,这次介绍下 redis对于select模型的封装 //select 模型 typedef struct aeApiState { //读 ...

  7. socket编程 ------ sockaddr_in 和 sockaddr 的区别

    struct sockaddr 和 struct sockaddr_in 这两个结构体用来处理网络通信的地址. // 以下是 IPv4 的定义 struct sockaddr { unsigned s ...

  8. Qt ------ QString 操作

    QStringList QString::arg     ------- 字符串的格式化处理,类始于sprintf 比如:QString("%1").arg(10,2,16,QLa ...

  9. 深度学习voc数据集图片resize

    本人新写的3个pyhton脚本. (1)单张图片的resize: # coding = utf-8 import Image def convert(width,height): im = Image ...

  10. java io-1基本概念

    java io-1基本概念 2015-07-03 15:17 648人阅读 评论(0) 收藏 举报  分类: [JavaSE](37)    目录(?)[+]   ------------------ ...