搭建一个简单的mybatis框架

一、Mybatis介绍

  

  MyBatis是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

1、Mybatis实现了接口绑定,使用更加方便。

      在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。

2、对象关系映射的改进,效率更高

3、MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。

       对于IBatis与MyBatis的区别就不再多说了,感兴趣的朋友可以研究一下

MyBatis的框架架构

 

           

        看到Mybatis的框架图,可以清晰的看到Mybatis的整体核心对象,我更喜欢用自己的图来表达Mybatis的整个的执行流程。如下图所示:

             

原理详解:

        MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。  

MyBatis的优缺点

优点:

1、简单易学

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

2、灵活

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

3、解除sql与程序代码的耦合

       通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

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

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

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

缺点:

1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。

2、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。

3、框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。  

4、二级缓存机制不佳 

总结

      mybatis的优点同样是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。

      mybatis没有hibernate那么强大,但是mybatis最大的优点就是简单小巧易于上手,方便浏览修改sql语句。

二、mybatis快速入门

2.1、准备开发环境

 1、创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示:

  

2、添加相应的jar包

  【mybatis

         mybatis-3.1.1.jar

  【MYSQL驱动包】
    mysql-connector-java-5.1.7-bin.jar

   

3、创建数据库和表,针对MySQL数据库

  SQL脚本如下:

1 create database mybatis;
2 use mybatis;
3 CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
4 INSERT INTO users(NAME, age) VALUES('孤傲苍狼', 27);
5 INSERT INTO users(NAME, age) VALUES('白虎神皇', 27);

  将SQL脚本在MySQL数据库中执行,完成创建数据库和表的操作,如下:

  

  到此,前期的开发环境准备工作全部完成。

2.2、使用MyBatis查询表中的数据

  1、添加Mybatis的配置文件conf.xml

  在src目录下创建一个conf.xml文件,如下图所示:

  

  conf.xml文件中的内容如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">3 <configuration>4     <environments default="development">5         <environment id="development">6             <transactionManager type="JDBC" />7             <!-- 配置数据库连接信息 -->8             <dataSource type="POOLED">9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11                 <property name="username" value="root" />
12                 <property name="password" value="XDP" />
13             </dataSource>
14         </environment>
15     </environments>
16     
17 </configuration>
复制代码

  2、定义表所对应的实体类,如下图所示:

  

  User类的代码如下:

复制代码
 1 package me.gacl.domain;2 3 /**4  * @author gacl5  * users表所对应的实体类6  */7 public class User {8 9     //实体类的属性和表的字段名称一一对应
10     private int id;
11     private String name;
12     private int age;
13 
14     public int getId() {
15         return id;
16     }
17 
18     public void setId(int id) {
19         this.id = id;
20     }
21 
22     public String getName() {
23         return name;
24     }
25 
26     public void setName(String name) {
27         this.name = name;
28     }
29 
30     public int getAge() {
31         return age;
32     }
33 
34     public void setAge(int age) {
35         this.age = age;
36     }
37 
38     @Override
39     public String toString() {
40         return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
41     }
42 }
复制代码

  3、定义操作users表的sql映射文件userMapper.xml

  创建一个me.gacl.mapping包,专门用于存放sql映射文件,在包中创建一个userMapper.xml文件,如下图所示:

  

  userMapper.xml文件的内容如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8" ?>2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">3 <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的4 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)5  -->6 <mapper namespace="me.gacl.mapping.userMapper">7     <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复8     使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型9     resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
10     User类就是users表所对应的实体类
11     -->
12     <!-- 
13         根据id查询得到一个user对象
14      -->
15     <select id="getUser" parameterType="int" 
16         resultType="me.gacl.domain.User">
17         select * from users where id=#{id}
18     </select>
19 </mapper>
复制代码

  4、在conf.xml文件中注册userMapper.xml文件

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">3 <configuration>4     <environments default="development">5         <environment id="development">6             <transactionManager type="JDBC" />7             <!-- 配置数据库连接信息 -->8             <dataSource type="POOLED">9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11                 <property name="username" value="root" />
12                 <property name="password" value="XDP" />
13             </dataSource>
14         </environment>
15     </environments>
16     
17     <mappers>
18         <!-- 注册userMapper.xml文件, 
19         userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
20         <mapper resource="me/gacl/mapping/userMapper.xml"/>
21     </mappers>
22     
23 </configuration>
复制代码

  5、编写测试代码:执行定义的select语句

  创建一个Test1类,编写如下的测试代码:

复制代码
package me.gacl.test;import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import me.gacl.domain.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;public class Test1 {public static void main(String[] args) throws IOException {//mybatis的配置文件String resource = "conf.xml";//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);//构建sqlSession的工厂SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)//Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession的工厂//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);//创建能执行映射文件中sql的sqlSessionSqlSession session = sessionFactory.openSession();/*** 映射sql的标识字符串,* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL*/

      //在命名空间“me.gacl.mapping.userMapper”中定义了一个名为“getUser”的映射语句,
      //这样它就允许你使用指定的完全限定名“me.gacl.mapping.userMapper.getUser”来调用映射语句,
      //格式:命名空间名(namespace)+映射语句名(id)

        String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串//执行查询返回一个唯一user对象的sqlUser user = session.selectOne(statement, 1);System.out.println(user);}
}
复制代码

  执行结果如下:

  

  可以看到,数据库中的记录已经成功查询出来了。

转载于:https://www.cnblogs.com/huangjinwen/p/6061697.html

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

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

相关文章

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a;都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格\t 跳格 \r 回车 \n 换行\\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。转义字符串(Escap…

在代理类中引用动态代理

在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff0c;此调用将完全…

android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

原标题&#xff1a;Android 仿高德地图可拉伸的BottomSheet2018安卓巴士开发者大会-上海站你一直期待的安卓技术盛宴即将登场&#xff01;前言最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控件。而我看到这个效果图&#xff0c;觉得这个就是一个slidingpanel&#…

[ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

作为入门者来说。了解JavaScript中timer的工作方式是非常重要的。通常它们的表现行为并非那么地直观&#xff0c;而这是由于它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。var id setTimeout(fn, delay); - 初始化一个单一的timer&#xff0c…

Android 软键盘自动弹出和关闭

在我们写修改信息或者搜索&#xff0c;修改密码等界面的时候&#xff0c;用户进入这个界面的主要目的就是输入修改/查找 某些信息&#xff0c;为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出。 1.软键盘的自动弹出 private void showKeyboard(){InputMethodM…

android adb杀死服务,Android app是如何杀掉的

1. adb shell kill -9 pid_of_appAMS定义了AppDeathRecipientAPP 在 attachApplication -> attachApplicationLockedAMS里会注册 App 进程的 BinderDeath通知AppDeathRecipient adr new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);当App进…

iOS学习笔记39-ReactiveCocoa入门

FRP&#xff0c;全称为Functional Reactive Programming&#xff0c;是一种响应变化的编程范式&#xff0c;最近几年比较火&#xff0c;大概的理解就像这样&#xff1a; 当a的值或者b的值发生变化时&#xff0c;c的值会自动响应a的值或b的值变化的信号&#xff0c;自动更正自己…

使用密码摘要生成器扩展JMeter

最近&#xff0c;我不得不处理一个带有50,000条用户记录的OpenLDAP实例&#xff0c;并进行一些压力测试。 JMeter是填充LDAP的最佳选择。 但是&#xff0c;在我的情况下&#xff0c;OpenLDAP配置为不接受任何明文密码。 因此&#xff0c;我无法使用通过JMeter LDAP Request采…

制造业数字化转型核心不止是技术

一、制造业的数字化转型意味着什么&#xff1f; 在当今的制造业领域&#xff0c;数字化转型意味着通过集成数字技术来增强传统的制造方法、产品和劳动力的过程。这些技术包括一系列创新&#xff0c;如自动化软件、电子商务系统、传感器、工业机器人等。 二、制造业数字化转型的…

5分钟内Google App Engine上的Vaadin App

在本教程中&#xff0c;您将学习如何创建第一个Vaadin Web应用程序&#xff0c;如何在本地AppEngine开发服务器上运行它以及如何将其部署到Google App Engine基础结构。 所有这些大约需要5到10分钟。 是的&#xff0c;如果您安装了必要的先决条件&#xff0c;则可以立即开始运行…

android8强制将app移到sd卡,小内存手机 APP强制转移至SD卡教程

虽然近两年手机的机身内存越做越大&#xff0c;但是身边总还是有些朋友在使用几年前的手机。而面对如今海量的丰富应用&#xff0c;早年的手机中内置的存储空间已经开始捉襟见肘。虽说对于这类机型系统通常都提供了将APP转移至外置内存卡的功能&#xff0c;可是依然有一些顽固的…

android 书架菜单,Android入门3--做一个书架

修改名称创建项目的时候&#xff0c;APP的名字取为英文或者拼音&#xff0c;是为了简便&#xff0c;但是显示在界面上&#xff0c;我们当然希望它是中文的。taoguanstring>我们要做的很简单&#xff0c;就是在string.xml中&#xff0c;将app_name的内容修改为我们希望的名字…

第一节:整体介绍

Python版本3.5.2&#xff0c;Django版本1.10 创建一个Django工程&#xff0c;并且生成一个名字为mainsite的app django-admin.py startproject myblog python3 manage.py startapp mainsite 文件结构如下&#xff1a; x-powerxpower-CW65S:~/chen/myblog$ tree ./ ./ ├── ma…

REST + Spring Security会话问题

REST &#xff0c; 会话 ..等待。 REST应用程序中没有会话&#xff0c;对吗&#xff1f; 好吧&#xff0c;那是真的。 如果我们可以避免会议&#xff0c;我们应该这样做。 REST是无状态的 。 有关无状态性的主要问题是身份验证。 在通常的Web应用程序中&#xff0c;我们习惯于在…

HarmonyOS硬件创新合作伙伴,【HarmonyOS】HarmonyOS智能硬件开发学习指南 - HDC2020

2020年9月10日&#xff0c;华为HarmonyOS 2.0版本正式官宣&#xff01;这一次&#xff0c;借助 HarmonyOS 全场景分布式系统和设备生态&#xff0c;将定义全新的硬件、交互和服务体验&#xff0c;打开焕然一新的全场景世界&#xff0c;不愧是HarmonyOS&#xff01; 那HarmonyOS…

Android 颜色大全color.xml

使用方法&#xff1a; 将color.xml文件拷到res/values目录下后我们只需要R.xml文件名称.name名称就可以调用了(例如:R.color.red) <?xml version"1.0" encoding"utf-8"?><resources> <color name"white">#FFFFFF</color&…

鸿蒙系统华为论坛,2020中国汽车论坛上 华为三大鸿蒙车载OS系统

在今天的2020中国汽车论坛上&#xff0c;华为公布了三大鸿蒙车载OS系统&#xff0c;同时还宣布已经有大量合作伙伴基于鸿蒙OS进行开发。根据智能汽车解决方案BU总裁王军所说&#xff0c;这三大鸿蒙OS分别是——鸿蒙座舱操作系统HOS、智能驾驶操作系统AOS和智能车控操作系统VOS&…

只读ViewObject和声明性SQL模式

介绍 声明式SQL模式被认为是基于实体的视图对象的最有价值的优点之一。 在此模式下&#xff0c;根据UI中显示的属性在运行时生成VO的SQL。 例如&#xff0c;如果某个页面包含一个只有两列EmployeeId和FirstName的表&#xff0c;则查询将生成为“从Employees中选择Employee_ID&a…

android 360加固 例子,[原创]利用VirtualApp实现360加固的soHook简单例子

简单demo&#xff0c;为抛砖引玉吧&#xff01;360的加固我们先写一个最简单的so&#xff0c;带导出函数。这已经足够简单了&#xff0c;界面上打印这个值。运行起来就这样。简单的简直过分。好了&#xff0c;现在我们让360加固一下。拿下来自己签名下&#xff0c;安装好&#…

scrapy架构解析

转载于:https://www.cnblogs.com/tianboblog/p/6986695.html