抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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 {
/**
* 查询所有
* @return
*/
List<User> findByAll();
}

(5)编写持久层接口的映射文件IUserDao.xml

注意事项:

  • 创建位置:必须和持久层接口在相同的包;
  • 名称:必须以持久层接口名称命名文件,扩展名是.xml。

image-20200731162609417

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">
<!-- 查询所有并封装到一个List集合 -->
<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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="development">
<!-- 配置mysql环境 -->
<environment id="development">
<!-- 配置事务类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(也叫连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<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>

<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名
-->
<mappers>
<mapper resource="com/itheima/dao/IUserDao.xml"/>
<!--<mapper class="com.itheima.dao.IUserDao"/>-->
</mappers>
</configuration>

(7)编写测试类

Test测试类

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工厂(用于创建数据库连接对象)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//使用工厂生产SqlSession对象
session = factory.openSession();
//使用SqlSession创建Dao接口的代理对象(增强其中的方法)
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 {

/**
* 查询所有
* @return
*/
@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解析;
  • 数据库元数据;
  • 元数据的反射。






未完待续…

评论