Mybatis入门

本文详细介绍了MyBatis的基本使用,包括引入jar包、创建实体类、定义映射接口和XML映射文件,以及核心配置文件的编写。此外,还阐述了MyBatis的参数处理原理和测试方法。文章最后总结了MyBatis的执行过程,并对比了#和$的区别,以及四大对象的角色。通过对MyBatis的学习,可以更好地理解和操作数据库。

1. 导入jar包

  1. mysql-connector-java-5.1.7-bin.jar: mysql驱动包
  2. mybatis-3.2.7.jar: mybatis基本jar包

2. 创建实体类

package com.daben.entity;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
}

3. 创建映射接口

package com.daben.mapper;
import com.daben.entity.User;
public interface UserMapper {
	public User selectUserById(Integer id);
}

4. 编写sql映射文件

与映射接口同级创建xml文件夹,在该xml下创建一个名为UserMapper.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.daben.mapper.UserMapper">
  <select id="selectUserById" resultType="com.daben.entity.User">
    select * from user where id = #{id}
  </select>
</mapper>

5. 编写核心配置文件

<?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>
    
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="366464" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/daben/mapper/xml/UserMapper.xml" />
	</mappers>
</configuration>

6. 测试

@Test
public void test01() throws IOException {
    String resource = "config/MybatisConfig.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    // 通过指定sql的id来执行sql
    User user = session.selectOne("selectUserById", 1);
    System.out.println(user);
    // 通过接口来执行sql;生成接口的代理实现类
    UserMapper userMapper = session.getMapper(UserMapper.class);
    User user2 = userMapper.selectUserById(1);
    System.out.println(user2);
    session.close();
}

7. mybatis获取参数原理

比如传入三个参数(@Param(“id”) String id, String name, @Param(“age”) String age)

底层实现:有两个map,假设叫map1和map2,传入的多个参数组成一个args数组

循环args;然后给map1赋值:key和value默认是当前循环的下标,如果当前循环的参数有@Param注解,就将注解的值赋给当前下标对应的value;

for(int i = 0; i < args.length; i++) {
    Integer key = i;
    String value = String.valueOf(i);
    if(当前参数有@Param注解) {
        value = 注解对应的value值
    }
    map1.put(key, value);
}

如果只有一个参数,直接把传过来的参数值给返回,所以传进来的任意值都能拿到参数值

如果是多个参数,就会把传进来的多个参数根据map1赋值给map2(map2的key是map1的value,map2的value是把map1的key当下标从参数组成的数组中拿,还会生成一个key为paramN的键值对)

int i = 0;
for (Map.Entry<Integer, String> entry : map1.entrySet()) {
    map2.put(entry.getValue(), args[entry.getKey()]);
    final String genericParamName = "param" + String.valueOf(++i);
    if (!map2.containsKey(genericParamName)) {
        map2.put(genericParamName, args[entry.getKey()]);
    }
}

8. mybatis开发过程总结

  1. 编写mapper映射文件
  2. 编写xml全局配置文件,指定数据库连接池,指定事务绑定mapper
  3. 定义变量,记录全局配置文件的名称
  4. 将全局配置文件读成流:InputStream;通过Resources.getResourceAsstream(配置文件变量名称);
  5. 通过new SqlSessionFactoryBuild().build(InputStream);得到SqlSessionFactory对象
  6. 通过SqlSessionFactory对象的openSession()方法获取SqlSession对象
  7. 得到SqlSession对象之后,通过getMapper(接口.class)动态获取接口的实现类;

9. #和$的区别

# 会使用?来占位;能够预防sql注入,会用单引号把字符串括起来,还能指定jdbcType值,比如#{id,jdbcType=NULL},应用场景Oracle下不支持设置null,需要指定jdbcType

$直接将参数显示的赋到sql文中,应用场景动态的设置查询的表名或者order by后面的字段用${}来取值

10. Mybatis执行过程

  1. 读取配置文件
  2. 创建建造者SqlSessionFactoryBuilde
  3. 通过建造者模式创建SqlSessionFactory
    该过程会解析MyBatis的XML文件,并将XML中的信息封装到Configuration对象中(包含执行器的类型,二级缓存开启等信息),
    然后会解析Mapper.xml文件,将每一个sql标签解析成MappedStatement对象(该对象中的sqlSource属性存储的是预编译后的sql语句,带?的),
    并将MappedStatement对象封装到Configuration对象的mappedStatements属性中,该属性是一个map;
    最终将这个Configuration对象作为参数来new一个DefaultSqlSessionFactory对象,并将其返回
    总结: 该过程就是将所有XML信息封装到Configuration对象中,然后以该对象为参数创建DefaultSqlSessionFactory对象并返回;
  4. 通过SqlSessionFactory创建SqlSession对象
    该过程会根据SqlSessionFactory中的Configuration中的执行器类型创建执行器(Executor),
    再根据Configuration中的二级缓存是否开启包装执行器,
    再根据是否有拦截器来包装执行器,
    最后将Configuration对象,执行器作为参数创建DefualtSqlSession对象并返回
    总结: 该过程就是根据Configuration中的信息创建执行器,然后返回包含Configuration对象和执行器对象信息的DefualtSqlSession对象
  5. 通过SqlSession对象获取接口的代理实现对象
    该过程通过jdk动态代理生成一个MapperProxy代理对象;
    注意: MapperProxy:这个类包含了SqlSession对象,Mapper接口,Mapper接口中的所有方法;MapperProxy是一个InvocationHandler
  6. 通过代理对象调用方法实现查询
    该过程中会创建StatementHandler对象,创建StatementHandler对象时,其构造器中会创建ParameterHandler对象,再创建ResultSetHandler对象

MyBatis的四大对象

  1. Executor: 执行器,有BaseExecutor(基础执行器),SimpleExecutor(简单执行器),ReuseExecutor(复用执行器),BatchExecutor(批量执行器)
  2. StatementHandler:
  3. ParameterHandler: 参数处理器
  4. ResultSetHandler: 结果集处理器
    总结: 这四个对象在创建的时候都会调用拦截器链,如果有拦截器,在创建完对象后会调用拦截器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值