3.1 自定义Mybatis框架的分析

3.1.1 涉及知识点介绍

本章我们将使用前面所学的基础知识来构建一个属于自己的持久层框架,将会涉及到的一些知识点:工厂模式(Factory工厂模式)、构造者模式(Builder模式)、代理模式,反射,自定义注解,注解的反射,xml解析,数据库元数据,元数据的反射等。

3.1.2 分析流程

3.2 前期准备

3.2.1 创建Maven工程

创建mybatis02的工程,工程信息如下:

1
2
3
Groupid:com.itheima
ArtifactId:mybatis02
Packing:jar

3.2.2 引入相关坐标

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
<dependencies>
<!-- 日志坐标 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!-- 解析xml的dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- dom4j的依赖包jaxen -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>

3.2.3 引入工具类到项目中

由于该部分代码过长,请转见,使用UTF-8编码浏览

3.2.4 编写SqlMapConfig.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8" ?> 
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" ></property>
<property name="url" value="jdbc:mysql:///eesy" ></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</dataSource>
</environment>
</environments>
</configuration>

注意: 此处我们直接使用的是mybatis的配置文件,但是由于我们没有使用mybatis的jar包,所以要把配置文件的约束删掉否则会报错(如果电脑能接入互联网,不删也行)

3.2.5 编写读取配置文件类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/** 
* <p>Title: Resources</p>
* <p>Description: 用于读取配置文件的类</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class Resources {
/**
* 用于加载xml文件,并且得到一个流对象
* @param xmlPath
* @return
* 在实际开发中读取配置文件:
* 第一:使用类加载器。但是有要求:a文件不能过大。 b文件必须在类路径下(classpath)
* 第二:使用ServletContext的getRealPath()
*/
public static InputStream getResourceAsStream(String xmlPath) {
return Resources.class.getClassLoader().getResourceAsStream(xmlPath);
}
}

3.2.6 编写Mapper类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** 
* <p>Title: Mapper</p>
* <p>Description: 用于封装查询时的必要信息:要执行的SQL语句和实体类的全限定类名</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class Mapper {
private String queryString;//sql
private String resultType;//结果类型的全限定类名

public String getQueryString() { return queryString; }
public void setQueryString(String queryString) { this.queryString = queryString; }
public String getResultType() { return resultType; }
public void setResultType(String resultType) { this.resultType = resultType; }
}

3.2.7 编写Configuration配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** 
* 核心配置类
* 1.数据库信息
* 2.sql的map集合
*/
public class Configuration {
private String username; //用户名
private String password;//密码
private String url;//地址
private String driver;//驱动
//map集合 Map<唯一标识,Mapper> 用于保存映射文件中的sql标识及sql语句
private Map<String,Mapper> mappers;
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getDriver() { return driver; }
public void setDriver(String driver) { this.driver = driver; }
public Map<String, Mapper> getMappers() { return mappers; }
public void setMappers(Map<String, Mapper> mappers) { this.mappers = mappers; }
}

3.2.8 编写User实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class User implements Serializable { 
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//省略getter与setter
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}