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解析;
数据库元数据;
元数据的反射。
未完待续…