Java EE数据持久化框架 • 【第1章 MyBatis入门】

全部章节   >>>>


本章目录

1.1 初识MyBatis

1.1.1 持久化技术介绍

1.1.2 MyBatis简介

1.1.2 Mybatis优点

1.1.3 利用Maven添加MyBatis依赖包

1.1.4 实践练习

1.2 开发一个简单的MyBatis应用

1.2.1 mybatis核心配置文件

1.2.2 定义实体类

1.2.2 定义接口映射

1.2.3 配置Log4j日志

1.2.4 测试MyBatis

1.2.5 实践练习

1.3 MyBatis单表查询

1.3.1 分析权限控制需求

1.3.2 MyBatis单表查询实现方法

1.3.3 实践练习

1.4 无嵌套的MyBatis多表查询

1.4.1 resultMap和resultType

1.4.2 mapUnderscoreToCamelCase属性

1.4.3 MyBatis多表查询实现方法

1.4.4 实践练习

总结


1.1 初识MyBatis

1.1.1 持久化技术介绍

 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

 狭义的讲就是将内存中的数据存储到数据库或其他介质的过程。

Java EE数据持久化框架 • 【第1章 MyBatis入门】_第1张图片

Dao层将数据存储到数据库中

 Java如何实现数据持久化?

JDBC编程操作:

  • 代码重复繁琐、开发效率低

Mybatis、Hibernate等框架技术

  • 企业级应用开发
  • 支持多种数据库切换
  • 封装了传统JDBC提高开发效率
  • 插件丰富、安全性高、支持缓存等

Java EE数据持久化框架 • 【第1章 MyBatis入门】_第2张图片Java EE数据持久化框架 • 【第1章 MyBatis入门】_第3张图片

1.1.2 MyBatis简介

MyBatis的前身是iBatis,是在2001年发起的一个开源项目,2010年更名为MyBatis,是目前企业级数据库操作使用最多的框架之一。

MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,几乎封装所有的JDBC代码和参数的手动设置以及结果集的检索,通过XML或注解的方式进行配置映射实现数据库操作,大大提高了开发效率。

1.1.2 Mybatis优点

 MyBatis优势:

  • 易于学习,易于使用,丰富的文档和源代码
  • 提供了数据映射功能(ORM),消除了繁琐的JDBC代码
  • 降低了程序和SQL语句的耦合
  • 提供了连接管理,缓存支持,线程支持,(分布式)事务管理等

1.1.3 利用Maven添加MyBatis依赖包

在Eclipse中创建一个基本的Maven项目,操作步骤如下:

  • 新建Maven项目,点击Next
  • 选择 Create a simple project
  • 输入项目包名、工程名、版本信息
  • 点击Finish完成构建Maven项目
  • 修改项目下maven配置文件pom.xml

Java EE数据持久化框架 • 【第1章 MyBatis入门】_第4张图片

  • 在pom.xml中添加mybatis依赖支持
  • 继续在pom.xml中添加JUnit、log4j、slf4j和MySQL驱动的依赖
  • 右键项目在【Maven】中选择【Update Project...】来更新外部依赖的jar包(此时会先从本地maven配置的仓库去寻找jar,如果没有则会上网下载)

Java EE数据持久化框架 • 【第1章 MyBatis入门】_第5张图片

查找地址:https://mvnrepository.com/

1.1.4 实践练习

 

1.2 开发一个简单的MyBatis应用

1.2.1 mybatis核心配置文件

 要使用Mybatis实现数据库操作,首先需要在 src/main/resources 目录下创建mybatis核心配置文件mybatis-config.xml。

Java EE数据持久化框架 • 【第1章 MyBatis入门】_第6张图片

 别名配置:  


       

项目中实体类包名,配置后mybatis才识别实体类名称

操作具体表的SQL语句映射文件:


         

映射文件完整路径

 具体数据源配置(可以配置多个,选择其中一个使用):

  

 
	 
						
        			                    
        
    	
	


1.2.2 定义实体类

 MyBatis是一个结果映射框架,创建一个和数据库表对应的实体类。

在实体类包(jack.mybatis.simple.model)下新建实体类 Country

public class Country {
	private String countrycode;
	private String countryname;
	private Long id;
	// 属性getter()方法和setter()方法
}

Java EE数据持久化框架 • 【第1章 MyBatis入门】_第7张图片

1.2.2 定义接口映射

 在src/main/resources下面创建 jack/mybatis/simple/mapper 目录,该目录下面创建与实体类Country对应的映射文件CountryMapper.xml文件



	

id="selectAll"          id和接口方法名对应

resultType="Country"       resultType代表返回的结果类型,和实体类对应

namespace="jack.mybatis.simple.mapper.CountryMapper"          mybatis会自动产生该接口

CountryMapper名称必须是实体类+Mapper组合 select * from sys_user where id = #{id}

如果实体类中属性名和表列名一致,resultMap="userMap">可以直接写resultType

id为接口定义传入的参数名


	
	
	
	
	
	
	

实体类中的属性名和数据表的列名不对应,运行会直接报错,需要添加映射说明

 配置mybatis-config.xml核心配置文件

 
	 
		
        			
        
		
	



		

一定要将接口映射xml文件注册到mybatis核心配置中

 测试实现,关键代码如下:

//加载mybatis配置文件代码略
//获取SqlSessionFactory对象
//获取接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用selectByid方法,查询id=1的用户
SysUser user = userMapper.selectById(1L);
printUser(user);

自己定义接口的方式需要获取接口代理对象

1.3.3 实践练习

 

1.4 无嵌套的MyBatis多表查询

1.4.1 resultMap和resultType

resultType用于定义返回或者参数的类型,如果返回的是集合则只需要定义集合中的实体类型即可,如果未在核心配置中指明typeAliases,则需要写全路径名。

public List selectUsers();   

resultMap用于定义当查询的结果字段和接收的实体类字段不一致时,进行映射说明,如下:


	
	
	
	

property="userName" 对应实体中属性名

column="user_name" 对应表中的列名

1.4.2 mapUnderscoreToCamelCase属性

数据库中下划线方式的命名很常见,但是Java中而是使用驼峰式命名,如userName、userEmail等,这样mybatis在结果返回和实体类对应时无法直接关联,需要定义resultMap增加了复杂度。

MyBatis提供了一个全局属性mapUnderscoreToCamelCase,通过配置该属性为true可以自动将以下划线方式命名的数据库列映射到Java对象的驼峰式命名属性中。




	   

1.4.3 MyBatis多表查询实现方法

实际业务中还需要多表关联查询。关联查询结果的类型也会有多种情况:

情况1:多表查询结果只包含一个表的信息 根据用户id获取用户拥有的所有角色,虽然查询时关联三个表,但是返回的结果为角色集合,查询结果只有角色的信息。

// 根据用户id获取角色信息
List selectRolesByUserid(Long id);


情况2:多表查询结果包含多个表的信息

根据用户id获取用户拥有的所有角色,假设查询的结果不仅要包含角色信息,还要包含当前用户的部分信息(不考虑嵌套的情况)

  • 解决1:在SysRole对象中直接添加userName属性,这样仍然使用SysRole作为返回值

  • 解决2:创建一个新类SysRoleExtend继承SysRole,如下:

public class SysRoleExtend extends SysRole{
             	private String userName;   //添加SysRole中没有的属性,而查询结果中需要包含的
                  …. 其他需要包含的
                  //产生get和set方法
}

 将resultType设置为扩展属性后的SysRoleExtend对象,通过这种方式来接收多余的值,如果需要其他表中大量列的值时,这种方式就不适用了,因为我们不能将一个类的属性都照搬到另一个类中。

 情况3: 使用对象作为成员属性的方式接收多表数据,需要角色SysRole的数据,还需要SysUser的数据,而SysRole中无法存储SysUser的数据,所以直接将一个SysUser对象放入SysRole中作为成员属性。

public class SysRole {
	// 其他原有属性
	private SysUser user; // 用户信息
	...
}

该属性是一个用户对象, 可以将查询的用户信息封装进去

 修改UserMapper.xml中selectRolesByUserid的SQL,达到能够将用户的数据放入SysUser成员属性对象中,代码如下:


红色的为列的别名,user则对应SysRole实体中的user实体对象名

1.4.4 实践练习

 

总结

  • MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架技术,能够根据配置自动产生操作数据库的JDBC代码,从而大大提高了Java数据库操作的开发效率。
  • 使用Mybatis需要添加相关依赖,创建mybatis-config.xml核心配置文件,配置全局属性、数据源和实体包的别名,并导入定义SQL语句的Mapper.xml。
  • 具体操作时需要加载MyBatis相关配置文件,创建SqlSessionFactory,然后获取SqlSession对象,拿到相关Mapper接口,从而实现调用。

 

你可能感兴趣的:(Java,EE数据持久化框架笔记,数据库,mybatis,mysql,java,spring)