<dependencies> <!--mybatis坐标--> <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis</artifactid> <version>3.4.5</version> </dependency> <!--mysql驱动坐标--> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java&世界史专业lt;/artifactid> <version>5.1.6</version> <scope>runtime</scope> </dependency> <!--单元测试坐标--> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency> <!--日志坐标--> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version>1.2.12</version> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.2</version> <scope>provided</scope> </dependency> </dependencies>
@getter@tter@tostring@noargsconstructorpublic class ur { private int id; private string urname; private string password;}
public interface urdao { list<ur> findall();}
<?xml version="1.0" encoding="utf-8" ?><!doctype mapper public "-//my三年级上册数学期末测试卷人教版batis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="dao.urdao"> <lect id="findall" resulttype="mode.ur"> lect * from ur </lect></mapper>
核心配置文件
<?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> <!--通过properties标签加载外部properties文件--> <properties resource="jdbc.properties"></properties> <!--自定义别名--> <typealias> <typealias type="mode.ur" alias="ur"></typealias> </typealias> <!--数据源环境--> <environments default="developement"> <environment id="developement"> <transactionmanager type="jdbc"></transactionmanager> <datasource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="urname" value="${jdbc.urname}"/> <property name="password" value="${jdbc.password}"/> </datasource> </environment> </environments> <!--加载映射文件--> <mappers> <mapper resource="urmapper.xml"></mapper> </mappers></configuration>
核心代码
import dao.urdao;import mode.ur;import org.apache.ibatis.io.resources;import org.apache.ibatis.ssion.sql小学德育总结ssion;import org.apache.ibatis.ssion.sqlssionfactory;import org.apache.ibatis.ssion.sqlssionfactorybuilder;import java.io.ioexception;import java.io.inputstream;import java.util.list;public class testmapper { public static void main(string[] args) throws ioexception { //加载核心配置文件 inputstream resourceasstream = resources.getresourceasstream("sqlmapconfig.xml"); //获得sqlssion工厂对象 sqlssionfactory sqlssionfactory = new sqlssionfactorybuilder().build(resourceasstream); //获得sqlssion对象 sqlssion sqlssion = sqlssionfactory.openssion(); //执行sql语句 urdao mapper = sqlssion.getmapper(urdao.class); list<ur> urlist = mapper.findall(); //打印结果 system.out.println(urlist); //释放资源 sqlssion.clo(); }}
defaultsqlssion:
configuration:
这是configuration 类。我们主要看getmapper()方法
mapperregistry:
关键代码:mapperproxyfactory.newinstance(sqlssion);
mapperproxyfactory:
返回的是mapperproxy 对象
mapperproxy:
源码:
// source code recreated from a .class file by intellij idea// (powered by fernflower decompiler)//package org.apache.ibatis.binding;import java.io.rializable;import java.lang.invoke.methodhandles.lookup;import java.lang.reflect.constructor;import java.lang.reflect.invocationhandler;import java.lang.reflect.method;import java.util.map;import org.apache.ibatis.lang.usjava7;import org.apache.ibatis.reflection.exceptionutil;import org.apache.ibatis.ssion.sqlssion;public class mapperproxy<t> implements invocationhandler, rializable { private static final long rialversionuid = -6424540398559729838l; private final sqlssion sqlssion; private final class<t> mapperinterface; private final map<method, mappermethod> methodcache; public mapperproxy(sqlssion sqlssion, class<t> mapperinterface, map<method, mappermethod> methodcache) { this.sqlssion = sqlssion; this.mapperinterface = mapperinterface; this.methodcache = methodcache; } public object invoke(object proxy, method method, object[] args) throws throwable { try { if (object.class.equals(method.getdeclaringclass())) { return method.invoke(this, args); } if (this.isdefaultmethod(method)) { return this.invokedefaultmethod(proxy, method, args); } } catch (throwable var5) { throw exceptionutil.unwrapthrowable(var5); } mappermethod mappermethod = this.cachedmappermethod(method); return mappermethod.execute(this.sqlssion, args); } private mappermethod cachedmappermethod(method method) { mappermethod mappermethod = (mappermethod)this.methodcache.get(method); if (mappermethod == null) { mappermethod = new mappermethod(this.mapperinterface, method, this.sqlssion.getconfiguration()); this.methodcache.put(method, mappermethod); } return mappermethod; } @usjava7 private object invokedefaultmethod(object proxy, method method, object[] args) throws throwable { constructor<lookup> constructor = lookup.class.getdeclaredconstructor(class.class, integer.type); if (!constructor.isaccessible()) { constructor.taccessible(true); } class<?> declaringclass = method.getdeclaringclass(); return ((lookup)constructor.newinstance(declaringclass, 15)).unreflectspecial(method, declaringclass).bindto(proxy).invokewitharguments(args); } private boolean isdefaultmethod(method method) { return (method.getmodifiers() & 1033) == 1 && method.getdeclaringclass().isinterface(); }}
在invoke方法中可以看到,如果我们调用的是object中的方法,不做任何处理,直接调用,否则员工转正自我鉴定执行:
mappermethod.execute(this.sqlssion, args);
mappermethod:
在mappermethod 中清朝有多少位皇帝对sql语句进行分类反射
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!
本文发布于:2023-04-04 10:34:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/63e187c574f41c7c1711a7ed7208c95b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:原理分析Java Mybatis中的Mapper.doc
本文 PDF 下载地址:原理分析Java Mybatis中的Mapper.pdf
留言与评论(共有 0 条评论) |