1. 导入jar包
- mysql-connector-java-5.1.7-bin.jar: mysql驱动包
- 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开发过程总结
- 编写mapper映射文件
- 编写xml全局配置文件,指定数据库连接池,指定事务绑定mapper
- 定义变量,记录全局配置文件的名称
- 将全局配置文件读成流:InputStream;通过Resources.getResourceAsstream(配置文件变量名称);
- 通过new SqlSessionFactoryBuild().build(InputStream);得到SqlSessionFactory对象
- 通过SqlSessionFactory对象的openSession()方法获取SqlSession对象
- 得到SqlSession对象之后,通过getMapper(接口.class)动态获取接口的实现类;
9. #和$的区别
# 会使用?来占位;能够预防sql注入,会用单引号把字符串括起来,还能指定jdbcType值,比如#{id,jdbcType=NULL},应用场景Oracle下不支持设置null,需要指定jdbcType
$直接将参数显示的赋到sql文中,应用场景动态的设置查询的表名或者order by后面的字段用${}来取值
10. Mybatis执行过程
- 读取配置文件
- 创建建造者SqlSessionFactoryBuilde
- 通过建造者模式创建SqlSessionFactory
该过程会解析MyBatis的XML文件,并将XML中的信息封装到Configuration对象中(包含执行器的类型,二级缓存开启等信息),
然后会解析Mapper.xml文件,将每一个sql标签解析成MappedStatement对象(该对象中的sqlSource属性存储的是预编译后的sql语句,带?的),
并将MappedStatement对象封装到Configuration对象的mappedStatements属性中,该属性是一个map;
最终将这个Configuration对象作为参数来new一个DefaultSqlSessionFactory对象,并将其返回
总结: 该过程就是将所有XML信息封装到Configuration对象中,然后以该对象为参数创建DefaultSqlSessionFactory对象并返回;- 通过SqlSessionFactory创建SqlSession对象
该过程会根据SqlSessionFactory中的Configuration中的执行器类型创建执行器(Executor),
再根据Configuration中的二级缓存是否开启包装执行器,
再根据是否有拦截器来包装执行器,
最后将Configuration对象,执行器作为参数创建DefualtSqlSession对象并返回
总结: 该过程就是根据Configuration中的信息创建执行器,然后返回包含Configuration对象和执行器对象信息的DefualtSqlSession对象- 通过SqlSession对象获取接口的代理实现对象
该过程通过jdk动态代理生成一个MapperProxy代理对象;
注意: MapperProxy:这个类包含了SqlSession对象,Mapper接口,Mapper接口中的所有方法;MapperProxy是一个InvocationHandler- 通过代理对象调用方法实现查询
该过程中会创建StatementHandler对象,创建StatementHandler对象时,其构造器中会创建ParameterHandler对象,再创建ResultSetHandler对象
MyBatis的四大对象
- Executor: 执行器,有BaseExecutor(基础执行器),SimpleExecutor(简单执行器),ReuseExecutor(复用执行器),BatchExecutor(批量执行器)
- StatementHandler:
- ParameterHandler: 参数处理器
- ResultSetHandler: 结果集处理器
总结: 这四个对象在创建的时候都会调用拦截器链,如果有拦截器,在创建完对象后会调用拦截器
本文详细介绍了MyBatis的基本使用,包括引入jar包、创建实体类、定义映射接口和XML映射文件,以及核心配置文件的编写。此外,还阐述了MyBatis的参数处理原理和测试方法。文章最后总结了MyBatis的执行过程,并对比了#和$的区别,以及四大对象的角色。通过对MyBatis的学习,可以更好地理解和操作数据库。

1261

被折叠的 条评论
为什么被折叠?



