Mybatis基础知识

目录

一、mybatis综述

1、mybatis介绍

2、mybatis架构

3、mybatis入门程序

(1)引入相关依赖

(2)加入maven插件

(3)编写实体类

(4)编写dao接口mapper映射文件User.xml

(5)创建mybatis主配置文件mybatis.xml

(6)创建测试类

(7)如需配置日志

4、插入时主键问题

(1)自增主键返回

(2)非自增主键返回

5、#{}和${}

二·、mybatis主配置文件SqlMapConfig.xml

1、properties属性

2、settings全局参数配置

3、typeAliases别名

4、mappers映射配置

三、mybatis开发dao方法

1、原始dao开发方法

(1)dao接口

(2)实现类

(3)测试代码

(4)存在的问题

2、mapper代理方法

(1)dao接口UserMapper.java

(2)mapper文件UserMapper.xml

(4)测试

四、输入映射

1、简单类型

2、pojo对象

3、包装类pojo

4、hashmap

五、输出映射

1、resultType

(1)输出简单类型

(2)输出pojo对象和pojo列表

2、resultMap

六、动态sql

1、if

2、where

3、foreach

(1)list

(2)array

4、sql片段


一、mybatis综述

1、mybatis介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码

Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

2、mybatis架构

3、mybatis入门程序

(1)引入相关依赖

(2)加入maven插件

(3)编写实体类

(4)编写dao接口mapper映射文件User.xml

映射文件命名:

User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

在映射文件中配置sql语句。

(5)创建mybatis主配置文件mybatis.xml

配置mybatis的运行环境,数据源、事务等。

在sqlMapConfig.xml中加载User.xml:【写在</environments>后面】

(6)创建测试类

(7)如需配置日志

在主配置文件中配置

4、插入时主键问题

(1)自增主键返回

        通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID()。是insert之后调用此函数。

(2)非自增主键返回

使用mysql的uuid()函数生成主键,执行uuid()语句顺序相对于insert语句之前执行

5、#{}和${}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,#{}中可以写成value或其它名称。

#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入所以不建议使用${}

${}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,${}中只能写成value。

${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

二·、mybatis主配置文件SqlMapConfig.xml

1、properties属性

将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。

将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。

在sqlMapConfig.xml加载属性文件:

2、settings全局参数配置

mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。。

3、typeAliases别名

在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。

如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

方式一:单个定义别名

方式二:批量定义别名

4、mappers映射配置

方式一:通过resource加载单个映射文件

方式二:通过mapper接口加载单个mapper

方式三:批量加载mapper

三、mybatis开发dao方法

1、原始dao开发方法

程序员需要写dao接口和dao实现类

(1)dao接口

(2)实现类

public class UserDaoImpl implements UserDao {

	// 需要向dao实现类中注入SqlSessionFactory
	// 这里通过构造方法注入
	private SqlSessionFactory sqlSessionFactory;

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}

    	@Override
	public User findUserById(int id) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();

		User user = sqlSession.selectOne("test.findUserById", id);
        
        // 提交事务
		//sqlSession.commit();

		// 释放资源
		sqlSession.close();
		return user;
	}

}
//其他方法省略

(3)测试代码

(4)存在的问题

a、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

b、调用sqlsession方法时将statement的id硬编码了

c、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

2、mapper代理方法

程序员只需要mapper接口(相当 于dao接口)

(1)dao接口UserMapper.java

(2)mapper文件UserMapper.xml

开发规范:

a、在mapper.xml中namespace等于mapper接口地址

b、mapper.java接口中的方法名和mapper.xml中statement的id一致

c、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

d、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

(3)在SqlMapConfig.xml中加载mapper.xml

(4)测试

四、输入映射

1、简单类型

2、pojo对象

3、包装类pojo

完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)

4、hashmap

五、输出映射

1、resultType

(1)输出简单类型

(2)输出pojo对象和pojo列表

输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。

返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。

返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List<pojo>对象作为方法返回值。

2、resultMap

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

<id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />。

Property:表示USer类的属性。

Column:表示sql查询出来的字段名。

Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。

<result />:普通结果,即pojo的属性。

六、动态sql

1、if

注意要做不等于空字符串校验。

2、where

<where />可以自动处理第一个and。

3、foreach

(1)list

参数是List<Integer> ids

 

传递ListList中是pojo 

(2)array

数组中是字符串类型

数组中是pojo

4、sql片段

注意:如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:

<include refid="namespace.sql片段”/>

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值