栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Review-MyBatis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Review-MyBatis

MyBatis 1 学习方法
MyBatis框架功能与Hibernate一样。
都是持久化框架。都是操作JDBC。做ORM框架。
1 MyBatis框架比Hibernate小。
2 做的是针对SQL语句查询结果进行封装。
2 MyBatis框架是什么?
MyBatis是一个针对SQL语句的ORM持久化框架。
1 针对SQL语句
	在MyBatis框架中,我们要写SQL语句,针对SQL查询的结果进行封装。
2 ORM
	将查询结果可以封装成一个实体对象。
3 持久化
	使用JDBC进行数据库操作。
3 编写第一个MyBatis框架的工程 3.1 创建工程并导入MyBatis的jar 3.2 配置MyBatis框架

在src目录下创建mybatis.xml文件。




	
		
			
			
				
				
				
				
			
		
	

3.3 ORM映射

1 数据库表:goods_type

2 编写实体类:GoodsType
public class GoodsType {
private int typeId;
private String typeName;

3.4 编写SQL语句(写在XML文件)

在MyBatis框架中SQL语句是程序员自己编写。
在MyBatis框架时,编写的SQL语句是独立于java源文件之外。
1 编写在xml配置文件(推荐)
2 编写在方法的注解

注意:编写一个与类名同名的xml文件。
在这个xml中编写对应的CURD的SQL语句。




	
		select * from goods_type
	

resultType="com.no1.domain.GoodsType" 表示查询结果的每一条记录封装成指定的类型。
(只有在字段名称与属性名称一致时可用)

3.5 在MyBatis配置文件中注册SQL的XML文件



	……
	
		
	

3.6 获得一个SqlSession的实例
在MyBatis中使用核心组件SqlSession进行CRUD操作。
	@Before
	public void before() {
		try {
			String resource = "mybatis.xml";
			Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
			this.sqlSession = ssf.openSession();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
3.7 通过SqlSession组件的方法调用CRUD

查询所有

	public void test01() {
		try {
List goodsTypeList = this.sqlSession.selectList("com.zpark.tea_mgr.domain.GoodsType.findAll");
			for (GoodsType goodsType : goodsTypeList) {
				System.out.println(goodsType);
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			this.sqlSession.close();
		}
	}
4 配置本地DTD文件

Q:为什么要配置DTD文件?

DTD相当于是编写XML文件的代码提示蓝本,在XML文件中声明DTD的ID或者URL,再在MyEclipse或者Eclipse中配置一下,重新打开这个XML文件,就可以用alt+/获得像编写JAVA代码一样的提示功能。具体的配置方法可以百度一下~
当然,这个文件主要的功能是验证XML文件编写的合法性,也就是一个约束,要求你只能按DTD定义的格式写。
建议去看一下XML相关知识。

4.1 找到本地dtd文件

4.2 在工具中绑定

5 当表中字段名称与实体类中属性名称不一致 5.1 创建数据库表 goods

5.2 创建实体类

5.3 编写Goods.xml文件

5.4 在mybatis.xml文件中注册Goods.xml文件

5.5 完成CRUD并测试 6 使用Mapper接口开发MyBatis项目

在实际开发中,不直接使用SqlSession的实例,而是使用Mapper接口,构建dao层。

6.1 Mapper接口是什么
映射器是你创建的绑定映射语句的接口(interface)
映射器接口的实例可以从SqlSession中获得
6.2 创建工程并导入jar 6.3 编写实体类
public class Goods {
//	goods_id	int
	private int goodsId;
//	goods_name	varchar
	private String goodsName;
//	goods_price	double
	private double goodsPrice;
//	goods_num	int
	private int goodsNum;
//	goods_type	int
	private int goodsType;
	}
6.4 编写Mapper接口

Mapper接口相当于Hebernate中的DAO
在这个接口中声明针对Goods这个实体类进行哪些CRUD操作

public interface GoodsMapper {
	public List findAll();
}
6.5 编写GoodsMapper接口的实现类

在MyBatis框架中,接口的实现类是一个XML文件
在GoodsMapper接口的同目录创建一个叫GoodsMapper.xml文件


	
	select * from goods 
	where goods_id = #{id}

7.2 多个参数时

按价格区间查询的方法

public List findByPrice(
@Param("minPrice") double minPrice, @Param("maxPrice") double maxPrice);

	select * from goods
	where goods_name like concat('%', concat(#{goodsName}, '%'))
	and goods_price between #{minPrice} and #{maxPrice}

try {
		GoodsMapper goodsMapper 
= this.sqlSession.getMapper(GoodsMapper.class);
		GoodsSearchVO goodsSearchVO = new GoodsSearchVO("球", 100, 300);
		List goodsList 
= goodsMapper.findBySearchVO(goodsSearchVO);
		for (Goods goods : goodsList) {
			System.out.println(goods);
		}
	} finally{
		this.sqlSession.close();
	}
8.3 使用对象封装聚合查询的结果 GoodsGroupVO
查询所有的商品的最大价格和最小价格
public class GoodsGroupVO {
	private double minPrice;
	private double maxPrice;
public GoodsGroupVO findByGroup();

		select * from goods
		left join goods_type
		on goods_type.typeId = goods.goods_type
	
	
		
		
		
		
		
		
		
	
11.4.2 第二种

引用关联关系对象的Mapper映射
GoodsTypeMapper.xml文件


	
	

GoodsMapper.xml文件


11.4.3 第三种

调用关联关系对象的Mapper的查询方法

public interface GoodsTypeMapper {
	public GoodsType findById(int typeId);

	select * from goods



12 对多的关联映射

一个类型有多个商品
设计为: 在类型类中有一个商品的集合

12.1 编写实体类
public class GoodsType {
	private int typeId;
	private String typeName;
	private List goodsList;
12.2 编写GoodsTypeMapper接口
public interface GoodsTypeMapper {
	public List findAll();
12.3 编写XML文件

映射从一个类型到多个商品

12.3.1 第一种,连接查询所有商品信息

	select * from goods where goods_type = #{id}

 

13 开发环境应用方案 13.1 不要使用双向映射 13.2 针对一个对象的映射,使用连接查询 13.3 针对一个集合的映射,不要再MyBatis的Mapper文件中映射

** 但要提供查询的方法,在业务层完成组装**

14 映射案例 ---- 最佳解决方案 14.1 编写实体类
public class Goods implements Serializable{
	private static final long serialVersionUID = 8874153057031505335L;
	private Integer goodsId;
	private String goodsName;
	private Double goodsPrice;
	private Integer goodsNum;
	private GoodsType goodsType;
public class GoodsType {
	private Integer typeId;
	private String typeName;
	private List goodsList;
14.2 编写Mapper接口
public interface GoodsMapper {
	public List findAll();
	
	public List findByType(int typeId);
public interface GoodsTypeMapper {
	public List findAll(); 
	public GoodsType findById(int typeId);
14.3 编写XML文件 14.3.1 编写GoodsMapper.xml文件

针对对象在编写查询语句时,直接使用连接查询


		select * from goods
		left join goods_type
		on goods_type.typeId = goods.goods_type
		where goods_type = #{id}

编写映射时直接关联关系对象的resultMap映射


	
	
	
	
	

14.3.2 编写GoodsTypeMapper.xml文件

针对集合,不用连接查询集合的数据


	select * from goods_type
	where typeId = #{id}

针对集合映射时,不要映射集合


	
	

14.4 编写service层
public class GoodsTypeService {
	public GoodsType findById(int typeId){
		SqlSession sqlSession = null;
		try{
			String resource = "mybatis.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
			sqlSession = ssf.openSession();
			GoodsTypeMapper goodsTypeMapper =
 sqlSession.getMapper(GoodsTypeMapper.class);
			GoodsType goodsType = goodsTypeMapper.findById(typeId);
			GoodsMapper goodsMapper =
 sqlSession.getMapper(GoodsMapper.class);
			List goodsList = goodsMapper.findByType(typeId);
			// 组装
			goodsType.setGoodsList(goodsList);
			return goodsType;
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			sqlSession.close();
		}
	}
}
14.5 测试 15 动态SQL 15.1 set标签在update语句中的使用
public interface GoodsMapper {
	public void update(Goods goods);
	public Goods findById(int goodsId);
	public void updateByDynamicSQL(Goods goods);

		update goods
		
			
				goods_name = #{goodsName},
			
			
				goods_price = #{goodsPrice},
			
			
				goods_num = #{goodsNum},
			
			
				goods_type = #{goodsType.typeId},
			
		
		where goods_id = #{goodsId}
	

使用动态SQL,我们要修改商品,可以不必先从数据库中查询出来

15.2 where标签在查询语句中的使用
public class GoodsSearchVO {
	private String goodsName;
	private Double minPrice;
	private Double maxPrice;
public List> findBySearchVO(GoodsSearchVO goodsSearchVO);