Mybatis简介
UML时序图
实现过程
- 需求模块:设计User实体类, UserMapper接口, UserMapper.xml映射文件,mybtis-config.xml配置文件
- 配置模块:XmlConfigParser, SqlMapper类,Configuration类。XmlConfigParser类用于解析mapper接口和xml映射文件,并将解析内容存放于SqlMapper和Configuration类。后两个类用于运行模块MapperProxy类重写invoke()方法
- 运行模块:MapperProxy类,SqlSession类。sqlSession使用动态代理自动生成相应接口的对象,调用invoke()
测试结果:
public static void main(String[] args) throws Throwable{
ClassLoader classLoader = MybatisTests.class.getClassLoader();
InputStream inputStream =
classLoader.getResourceAsStream("htproject/mybatis/mybatis-config.xml");
XmlConfigParser.parse(inputStream);
SqlSession sqlSession = new SqlSession();
Object proxyObject = sqlSession.getMapper(UserMapper.class);
UserMapper userMapper= (UserMapper) proxyObject;
List<User> list = userMapper.selectAll();
System.out.println(list);
}
Configuration{driver=com.mysql.jdbc.Driver, url=jdbc:mysql://localhost:3306/day01db, username=root, password=root, map=null}
Configuration{driver=com.mysql.jdbc.Driver, url=jdbc:mysql://localhost:3306/day01db, username=root, password=root, map={htproject.mybatis.entity.UserMapper.selectAll=SqlMapper{id=htproject.mybatis.entity.UserMapper.selectAll, resultType=htproject.mybatis.entity.User, sql=
select * from user order by id
}}}
invoke method=selectAll
id|username|
id|username|
[User{id=1, username=张三}, User{id=2, username=李四}]
设计总结:
确定需求 (需要补充哪些基础知识, 学习后先用小Demo测试再下一步) 分析设计(由那些模块,类组成,类之间调用的关系,代码结构) 编码
FAQ:
- Java动态代理是什么? 代理类在程序运行时创建代理的方式叫动态代理,也就是说代理类并不是在java代码中定义的,而是在运行的时候动态生成的, 更加灵活,实现代码复用
- JDK代理与CGLIB代理的区别? jdk动态代理的前提是所有的目标类都必须要基于一个统一的接口创建的类得需要实现InvocationHandler,并重写invoke()方法 CGlib动态代理不需要创建统一接口 有无接口都可以实现代理 基于类创建代理对象,生成的代理对象是目标类的子类对象 如果对象有接口实现,选择JDK代理,如果没有接口实现选择CGILB代理
- Mybatis框架的执行流程?| 通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory: 在 SqlSessionFactoryBuilder 的 build()方法中使用 XMLConfigBuilder 用来解析配置文件 mybatis-config.xml, 并将数据存放到 Configuration 对象中,然后创建并返回一个 DefautSqlSessionFactory。 通过 SqlSessionFactory 创建 SqlSession,用于执行 sql 语句; 通过 SqlSession 拿到 Mapper 对象的代理; 通过 MapperProxy 调用 Maper 中相应的方法; 提交或者回滚 关闭 Session