Mybatis学习总结,本次为框架的一些基本概念与入门的案例编写。
框架的基本概念学习 
一、框架的基本概念 1、什么是框架 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构建实例之间交互的方法;另一种定义认为,框架是可被应用开发者定制的骨架。前者是从应用方面后者是从目的方面给出的定义。
简而言之,框架其实就是某种应用的半成品,选择一组组组件来完成自己的项目。
2、框架要解决的问题 框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
框架一般处在低层应用平台(如  J2EE)和高层业务逻辑之间的中间层。 
3、软件开发分层的重要性 框架的重要性在于它实现了部分功能,并且能很好的将底层应用平台和高层业务逻辑进行了缓和。为了实现软件工程中的“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的MVC软件设计思想就是很好的分层思想。
4、分层开发下的常见框架 (1)MyBatis MyBatis 本是apache 的一个开源项目iBatis , 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层 框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
(2)String MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web  应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。
(3)String框架 Spring框架是一个开放源代码的J2EE 应用程序框架,由[Rod Johnson](https://baike.baidu.com/item/Rod  Johnson/1423612)发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP 及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。
二、MyBatis框架快速入门 1、搭建MyBatis框架的开发环境 (1)创建Maven工程 添加数据库数据
1 2 3 4 5 6 7 8 9 10 11 CREATE  TABLE  `user ` (  `id` int (11 ) NOT  NULL  auto_increment,   `username` varchar (32 ) NOT  NULL  COMMENT '用户名称' ,   `birthday` datetime default  NULL  COMMENT '生日' ,   `sex` char (1 ) default  NULL  COMMENT '性别' ,   `address` varchar (256 ) default  NULL  COMMENT '地址' ,   PRIMARY  KEY  (`id`) ) ENGINE= InnoDB DEFAULT  CHARSET= utf8; insert   into  `user `(`id`,`username`,`birthday`,`sex`,`address`) values  (41 ,'老王' ,'2018-02-27 17:47:08' ,'男' ,'北京' ),(42 ,'小二王' ,'2018-03-02 15:09:37' ,'女' ,'北京金燕龙' ),(43 ,'小二王' ,'2018-03-04 11:34:34' ,'女' ,'北京金燕龙' ),(45 ,'传智播客' ,'2018-03-04 12:04:06' ,'男' ,'北京金燕龙' ),(46 ,'老王' ,'2018-03-07 17:37:26' ,'男' ,'北京' ),(48 ,'小马宝莉' ,'2018-03-08 11:44:00' ,'女' ,'北京修正' );
(2)添加MyBatis3.4.5的坐标 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <dependencies > 		<dependency >  			 <groupId > org.mybatis</groupId >  			 <artifactId > mybatis</artifactId >  			 <version > 3.4.5</version >  		</dependency >  		<dependency >          	 <groupId > junit</groupId >              <artifactId > junit</artifactId >              <version > 4.10</version >              <scope > test</scope >          </dependency >          <dependency >           <groupId > mysql</groupId >     	     <artifactId > mysql-connector-java</artifactId >         	 <version > 5.1.6</version >          	 <scope > runtime</scope >          </dependency >          <dependency >           <groupId > log4j</groupId >     	     <artifactId > log4j</artifactId >         	 <version > 1.2.12</version >           </dependency >      </dependencies >  
(3)编写User实体类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 import  java.util.Date;public  class  User  {    private  Integer id;     private  String username;     private  Date birthday;     private  String sex;     private  String address;     public  User ()  {     }     public  User (Integer id, String username, Date birthday, String sex, String address)  {         this .id = id;         this .username = username;         this .birthday = birthday;         this .sex = sex;         this .address = address;     }     public  Integer getId ()  {         return  id;     }     public  void  setId (Integer id)  {         this .id = id;     }     public  String getUsername ()  {         return  username;     }     public  void  setUsername (String username)  {         this .username = username;     }     public  Date getBirthday ()  {         return  birthday;     }     public  void  setBirthday (Date birthday)  {         this .birthday = birthday;     }     public  String getSex ()  {         return  sex;     }     public  void  setSex (String sex)  {         this .sex = sex;     }     public  String getAddress ()  {         return  address;     }     public  void  setAddress (String address)  {         this .address = address;     }     @Override      public  String toString ()  {         return  "User{"  +                 "id="  + id +                 ", username='"  + username + '\''  +                 ", birthday="  + birthday +                 ", sex='"  + sex + '\''  +                 ", address='"  + address + '\''  +                 '}' ;     } } 
(4)编写持久层接口IUserDao 1 2 3 4 5 6 7 8 9 10 11 import  com.itheima.domain.User;import  java.util.List;public  interface  IUserDao  {         List<User> findByAll () ; } 
(5)编写持久层接口的映射文件IUserDao.xml 注意事项: 
创建位置: 必须和持久层接口在相同的包;名称: 必须以持久层接口名称命名文件,扩展名是.xml。 
1 2 3 4 5 6 7 8 9 10 <?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 ="com.itheima.dao.IUserDao" >          <select  id ="findByAll"  resultType ="com.itheima.domain.User" >          select * from user     </select >  </mapper > 
(6)编写SqlMapConfig.xml配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?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" > </transactionManager >                           <dataSource  type ="POOLED" >                                   <property  name ="driver"  value ="com.mysql.jdbc.Driver" />                  <property  name ="url"  value ="jdbc:mysql://localhost:3306/eesy_mybatis" />                  <property  name ="username"  value ="root" />                  <property  name ="password"  value ="root" />              </dataSource >          </environment >      </environments >           <mappers >          <mapper  resource ="com/itheima/dao/IUserDao.xml" />               </mappers >  </configuration > 
(7)编写测试类 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 package  com.itheima.test;import  com.itheima.dao.IUserDao;import  com.itheima.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;import  org.junit.After;import  org.junit.Before;import  org.junit.Test;import  java.io.IOException;import  java.io.InputStream;import  java.util.Date;import  java.util.List;public  class  IUserDaoTest  {    private  InputStream  in  =  null ;     private  SqlSession  session  =  null ;     private  IUserDao userDao;     @Before      public  void  init ()  throws  Exception {                  in = Resources.getResourceAsStream("SqlMapConfig.xml" );                  SqlSessionFactory  factory  =  new  SqlSessionFactoryBuilder ().build(in);                  session = factory.openSession();                  userDao = session.getMapper(IUserDao.class);     }     @After      public  void  destroy ()  throws  Exception {                  session.commit();                  session.close();         in.close();     }          @Test      public  void  findByUserTest () {         List<User> users = userDao.findByAll();         for  (User user : users) {             System.out.println(user);         }     } } 
2、MyBatis框架入门总结 通过以上的案例,发现MyBatis框架想要和数据库进行交互只需要编写Dao接口和两个配置文件就可以实现功能。
3、MyBatis框架基于注解的开发 (1)在持久层接口中添加注解开发 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import  com.itheima.domain.User;import  org.apache.ibatis.annotations.Select;import  java.util.List;public  interface  IUserDao  {         @Select("select * from user")      public  List<User> findAll () ; } 
(2)修改SqlMapConfig.xml 1 2 3 4 5 6 7     <!--           用注解来配置,此处应该使用class属性指定被注解的dao全限定类名      -->     <mappers>         <mapper class="com.itheima.dao.IUserDao" />     </mappers> </configuration> 
(3)注意事项 在基于注解开发的时候需要移除xml的配置文件(IUserDao.xml)
三、自定义MyBatis框架 1、涉及知识点 
工厂模式(Factory工厂模式); 
构造者模式(Builder模式); 
代理模式; 
反射; 
自定义注解; 
注解反射; 
xml解析; 
数据库元数据; 
元数据的反射。 
 
未完待续…