mybatis的工作原理mybatis基本工作原理
封装sql ->调用JDBC操作数据库 -> 返回数据封装
JDBC
Q: JDBC是什么?
Java中规范客户端程序如何访问数据库的应用程序接口J。驱动是接口的实现,驱动由数据库提供,通过驱动链接数据库
Q: 如何使用JDBC开发
1. 注册加载驱动Class.forName(String driverManager);加载成功后驱动会被注册给DriverManager,失败抛出ClassNotFoundException2. 建立链接String url = "jdbc:mysql://localhost:3306/database_name";Connection conn = DriverManager(url,username,password);url : 数据库的url mysql指定数据库,localhost指定IP,3306指定端口号,database_name指定要连接的数据库名3. 获取语句执行对象,执行SQL,获取执行结果,释放资源3.1 使用statement(存在sql注入风险,语句使用字符串拼接)String sql = "insert into user(username,password) values('张三','123')";Satement stmt = conn.createStatement();stmt.executeUpdate(sql);conn.close(); 3.2 使用PreparedStatement(使用占位符)String sql = "insert into user(username, password) values(?,?)";PreparedStatement ps = conn.preparedStatement(sql);ps.setString(1, "张三"); //为第一个问号赋值ps.setString(2, "123"); //为第二个问号赋值ps.executeUpdate();conn.close();
Q: JDBC核心对象
1. DriverManager 注册数据库链接2. Connection 数据库连接对象3. Staement/PrepareStatement 操作数据库SQL语句对象3. ResultSet 结果集或虚拟表
Q: MyBatis核心对象
1. SqlSession对象 包含执行SQL语句的所有方法,类似Connection2. Executor接口 根据SqlSession传递的参数动态生成SQL语句,同时负责查询缓存的维护,类似于Statement/PrepareStatement3. MapperdStatement对象 对映射SQL的封装,储存要映射的SQL语句的id、参数等信息4. ResultHandler 对于返回结果的处理,得到对应的数据格式或类型,可以自定义返回类型为什么sqlSession类似Connection?jdbc中connection不直接执行SQL,是利用Statement/PrepareStatement执行,即在JDBC建立连接后使用这两个对象之一通过executeXXX方法执行SQL语句Mybatis中SqlSession包含执行SQL语句的所有方法,通过委托Executor执行,这两个都是委托执行,某种意义上是类似的SqlSession除了包含执行SQL语句的所有方法,还包括获取Mapper的代理对象,所以也可以委托给映射器执行数据的CRUD T getMapper(Class type);可以通过代理对象,直接调用接口的方法。
Q: MyBatis工作原理图
1. 加载mybatis-config.xml 配置文件,读取数据库链接等信息2. 加载mapper映射文件,文件配置了SQL语句,需要在config文件中配置,mybatis-config.xml可以加载多个映射文件,每个映射文件对应一张表,映射文件通过namespace区分。3. 构建会话工厂,通过Mybatis的环境信息配置工厂4. 通过会话工厂构建会话对象(SqlSession),包含执行SQL的所有方法5. Executor执行器,Mybatis维护一个Executor接口,根据SqlSession传递的参数动态生成SQL语句,同时负责查询缓存的维护6. MapeprStatement对象,是对映射信息的封装,存储要映射的SQL语句的id、参数7. 输入参数映射 可以是map、list、pojo、基本类型、封装类型,类似JDBC对PrepareStatement对象设置参数8. 输出结果映射。可以是map、list、pojo、基本类型、封装类型,类似JDBC对结果集的解析过程
Q: Executor执行器
- SimpleExecutor 默认
当执行两次查询的时候,每次执行都会进行一次预编译(创建一个PrepareStatement),这样效率相对比较低。
- ReuseExecutor 可重用执行器
使用ReuseExecutor的时候,执行2次查询,但是只执行了一次预编译。相对简单执行,可重用执行器的效率会高一些。
- BatchExecutor 批量执行器
当查询的时候,跟SimpleExecutor一样,也会执行多次的预编译。而更新或插入操作的时候,会批量进行,但是要注意需要手动进行提交: