Mybatis框架总结(一)

第一章 框架概述

1.1 什么是框架

  • 框架就是某个应用的半成品,是一组组件,供你选择完成自己的系统。(简单理解就是使用别人搭好的舞台做自己的表演),框架一般是成熟的,不断升级的软件。

1.1.2 框架要解决的问题

框架要解决的问题就是技术整合的问题。

1.1.3 分层开发下常见的框架

  1. 解决数据的持久化问题框架(Mybatis)
  2. 解决WEB层问题的MVC框架(Spring MVC)
  3. 解决技术整个问题的框架(Spring)

1.1.4 Mybatis框架概述

mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

mybatis 通过 xml注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

采用 ORM (对象关系映射)思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作

1.2 JDBC编程的分析

1.2.1 jdbc程序回顾

public static void main(String[] args) {
	Connection connection = null;
	PreparedStatement preparedStatement = null;
	ResultSet resultSet = null;
	try {
	//加载数据库驱动
	Class.forName("com.mysql.jdbc.Driver");
	//通过驱动管理类获取数据库链接
	connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
	//定义 sql 语句 ?表示占位符
	String sql = "select * from user where username = ?";
	//获取预处理 statement
	preparedStatement = connection.prepareStatement(sql);
	//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值
	preparedStatement.setString(1, "王五");
	//向数据库发出 sql 执行查询,查询出结果集
	resultSet = preparedStatement.executeQuery();
	//遍历查询结果集
	while(resultSet.next()){
 	System.out.println(resultSet.getString("id")+""+resultSet.getString("username"));
			}
		} catch (Exception e) {
		e.printStackTrace();
	}finally{
	//释放资源
	if(resultSet!=null){
	try {
		resultSet.close();
	} catch (SQLException e) {
		e.printStackTrace();
	} }
	if(preparedStatement!=null){
	try {
	preparedStatement.close();
	} catch (SQLException e) {
		e.printStackTrace();
	} }
	if(connection!=null){
	try {
		connection.close();
	} catch (SQLException e) {
	// TODO Auto-generated catch block
		e.printStackTrace();
	} } } }

1.2.2 jdbc问题分析:

  • 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  • Sql语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码
  • 使用preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改sql 还要修改代码,系统不易维护。
  • 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便

第2章 Mybatis框架入门

2.2 搭建Mybatis开发环境

2.2.1 创建maven工程

使用步骤:

1. 添加Mybatis的坐标
	在 pom.xml 文件中添加 Mybatis3.4.5 的坐标
<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>
2. 编写User实体类
public class User implements Serializable {
	private Integer id;
	private String username;
	private Date birthday;
	private String sex;
	private String 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 + "]"; 
		} 
	}
3.编写持久层接口IUserDao
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
//使用注解方式,不需要IUserDao.xml文件。
//@Select("select * from user")
List<User> findAll();
}
4. 编写持久层接口的映射文件IUserDao.xml(使用注解方式则该XML客不写)
<?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="findAll" resultType="com.itheima.domain.User">
		select * from user
	</select>
5. 编写SqlMapConfig.xml

创建位置:必须和持久层接口在相同的包中==。

<?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>
<!-- 配置 mybatis 的环境 --> 
<environments default="mysql">
	<!-- 配置 mysql 的环境 --> 
	<environment id="mysql">
		<!-- 配置事务的类型 --> 
		<transactionManager type="JDBC"></transactionManager>
		<!-- 配置连接数据库的信息:用的是数据源(连接池) --> 
		<dataSource type="POOLED"> 
			<property name="driver" value="com.mysql.jdbc.Driver"/>
			<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
			<property name="username" value="root"/>
			<property name="password" value="1234"/>
		</dataSource>
	</environment>
</environments>
	<!-- 告知 mybatis 映射配置的位置 --> 
	<mappers> 
		<mapper resource="com/itheima/dao/IUserDao.xml"/>
		//当使用注解配置时直接指定Dao位置即可,因为sql语句写在dao方法的注解上了。
		//<mapper class="com.itheima.dao.IUserDao"/>
	</mappers>
</configuration>
6. 编写测试类
/**
* 
* <p>Title: MybatisTest</p>
* <p>Description: 测试 mybatis 的环境</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class MybatisTest {
	public static void main(String[] args)throws Exception {
	//1.读取配置文件
	InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2.创建 SqlSessionFactory 的构建者对象
	SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
	//3.使用构建者创建工厂对象 SqlSessionFactory
	SqlSessionFactory factory = builder.build(in);
	//4.使用 SqlSessionFactory 生产 SqlSession 对象
	SqlSession session = factory.openSession();
	//5.使用 SqlSession 创建 dao 接口的代理对象
	IUserDao userDao = session.getMapper(IUserDao.class);
	//6.使用代理对象执行查询所有方法
	List<User> users = userDao.findAll();
	for(User user : users) {
		System.out.println(user);
	}
	//7.释放资源
	session.close();
	in.close();
		} 
	}

第3章 自定义Mybatis框架(理解)

3.1 自定义Mybatis的设计模式说明

3.1.1 工厂模式(SqlSessionFactory)

  • 工厂模式时用工厂方法代替new 操作的一种模式。工厂模式就相当于创建实例对象的new。

3.1.2 代理模式(MapperProxyFactory)

  • 代理模式分为静态和动态代理

3.1.3 构建者模式(SqlSessionFactoryBuilder)

3.2 前期准备

3.2.1 创建Maven工程

3.2.2 引入相关坐标

<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 引入工具类到项目中

1.解析主配置文件,把里面内容填充到DefacultSqlSession所需要的地方,使用技术:dom4j+xpath
2. 根据传入参数,解析XML,并封装到Map中。
3. 根据传入参数,得到dao中所有被select注解的方法。根据方法名和类名,以及方法上的注解value属性值,组成Mapper的必要信息。
4. 写个Exexuter类,用于执行SQL语句,并封装结果集。

3.2.4 编写SqlMapConfig.xml

3.2.5 编写读取配置文件类

1.使用类加载器(要求文件不能过大,文件必须在类路径下)
2.使用ServletContext的getRealPath()

3.2.6 编写Mapper类

  • (用于封装查询时必要信息,要执行的sql和实体类全限定类名)

3.2.7 编写Configuration配置类

  • 数据库信息
  • sql的map集合

3.2.8 编写User实体类

3.3 基于XML的自定义Mybatis框架

3.3.1 编写持久层接口和IUserDao.xml

3.3.2 编写构建者类

  • 根据传入的流,构建SqlSessionFactory工厂

3.3.3 编写SqlSessionFactor接口和实现类

3.3.4 编写SqlSession接口和实现类

  • SqlSession:操作数据库的核心对象

3.3.5 编写用于创建Dao接口代理对象的类

  • MapperProxyFactory:用于创建代理对象的增强

3.3.6 运行测试类

/**
* 
* <p>Title: MybatisTest</p>
* <p>Description: 测试 mybatis 的环境</p>
* <p>Company: http://www.itheima.com/ </p>
*/
	public class MybatisTest {
	public static void main(String[] args)throws Exception {
	//1.读取配置文件
	InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2.创建 SqlSessionFactory 的构建者对象
	SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
	//3.使用构建者创建工厂对象 SqlSessionFactory
	SqlSessionFactory factory = builder.build(in);
	//4.使用 SqlSessionFactory 生产 SqlSession 对象
	SqlSession session = factory.openSession();
	//5.使用 SqlSession 创建 dao 接口的代理对象
	IUserDao userDao = session.getMapper(IUserDao.class);
	//6.使用代理对象执行查询所有方法
	List<User> users = userDao.findAll();
	for(User user : users) {
		System.out.println(user);
	}
	//7.释放资源
	session.close();
	in.close();
		} 
	}

3.4 基于注解方式定义Mybatis框架

3.4.1 自定义@Select注解

* <p>Title: Select</p>
* <p>Description: 自定义查询注解</p>
* <p>Company: http://www.itheima.com/ </p>
*/
	@Retention(RetentionPolicy.RUNTIME)
	@Target(ElementType.METHOD)
	public @interface Select {
		String value();
	}

3.4.2 修改持久层接口

/**
* 
* <p>Title: IUserDao</p>
* <p>Description: 用户的持久层操作</p>
* <p>Company: http://www.itheima.com/ </p>
*/
	public interface IUserDao {
/**
* 查询所有用户
* @return
*/
	@Select("select * from user")
	List<User> findAll();
	}

3.4.3 修改SqlMapConfig.xml

	<?xml version="1.0" encoding="UTF-8"?>
	<configuration>
		<!-- 配置 mybatis 的环境 --> 
		<environments default="mysql">
			<!-- 配置 mysql 的环境 --> 
			<environment id="mysql">
				<!-- 配置事务的类型 --> 
				<transactionManager type="JDBC"></transactionManager>
				<!-- 配置连接数据库的信息:用的是数据源(连接池) --> 
				<dataSource type="POOLED">
					<property name="driver" value="com.mysql.jdbc.Driver"/>
					<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
					<property name="username" value="root"/>
					<property name="password" value="1234"/>
			</dataSource>
	</environment>
</environments>
	<!-- 告知 mybatis 映射配置的位置 (使用注解方式)--> <mappers>
		<mapper class="com.itheima.dao.IUserDao"/>
		</mappers>
</configuration>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值