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. 访问控制列表-细说ACL那些事儿(ACL应用篇)

    1.ACL应用范围 通过前两期的ACL理论学习,大家知道ACL并不能单独完成控制网络访问行为或者限制网络流量的效果,而是需要应用到具体的业务模块才能实现上述功能. 那么ACL到底可以应用在哪些业务中呢 ...

  2. 洛谷P2125图书馆书架上的书 题解报告

    题目描述 图书馆有n个书架,第1个书架后面是第2个书架,第2个书架后面是第3个书架……第n-1个书架后面是第n个书架,第n个书架后面是第1个书架,第i个书架上有b[i]本书.现在,为了让图书馆更美观, ...

  3. NYOJ--7

    原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=7 分析:x与y分开考虑,分别排序,邮局定在最中间的两个数之间就可以了. 街区最短路径问题 ...

  4. 树莓派更改vnc分辨率

    参考链接:https://raspberrypi.stackexchange.com/questions/56421/how-to-increase-resolution-on-latest-rasp ...

  5. HDU 6038

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  6. 线程函数对比 win/linux

    原文

  7. Mac(Linux)上安装memcached步骤

    Mac上安装memcached类似于在Linux平台上安装memcached. 主要需要做两块: 一.安装libevent库: 二.安装memcached; 一.安装libevent库 libeven ...

  8. MingW和MSVC默认的编码方式不一样

    同一份源代码,源文件编码格式为UTF-8: string tmp = "我"; ;i<tmp.size();++i) { printf("%0x ",tm ...

  9. ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(通过接口登录,无UI版本)

    官网接口详解文档地址:文档地址 (PS:可通过接口名称搜索相应接口信息.) 源码地址:https://github.com/YANGKANG01/IdentityServer4-IdentityAut ...

  10. node.js的安装配置——前端的配置

    最近琢磨了以下node.js的安装,npm的配置,使用gulp watch监听index.html文件的修改,利用服务器打开网页. 打开自己写的网页不要本地双击打开,这样打开的网址是file:///E ...