报错:org.apache.ibatis.binding.BindingException: Type interface com.lyg.dao.UserDao is not known to the MapperRegistry.
at org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47)
at org.apache.ibatis.session.Configuration.getMapper(Configuration.java:779)
at org.apache.ibatis.session.defaults.DefaultSqlSession.getMapper(DefaultSqlSession.java:291)
at com.lyg.dao.UserDaoTest.test(UserDaoTest.java:17)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
需要在pom文件中添加过滤器****或者 mapper映射文件的namespace和接口类名不一致
mybatis常遇问题:
1、配置文件没有注册
2、绑定接口错误
3、方法名不对
4、返回类型不对
5、maven导出资源问题
namespace的包名要和接口中的包名要一致
注意:增删改需要注意事务
sqlsession.commit();
resouse绑定mapper需要时路径用 \ 不是.****
sqlsessionFactory错误:
java.lang.NullPointerException
at com.lyg.utils.MybatisUtils.getSqlSession(MybatisUtils.java:27)
at com.lyg.dao.UserDaoTest.test(UserDaoTest.java:14)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
正确:
配置文件会优先使用外部文件
类型别名(typeAliases)
1、
<typeAliases>
<typeAlias alias=“Author” type=“domain.blog.Author”/>
<typeAlias alias=“Blog” type=“domain.blog.Blog”/>
</typeAliases>
2、
<typeAliases>
<package name=“domain.blog”/>
</typeAliases>
属性名和字段名不一致问题
1、起别名
2、结果集映射
log4j配置文件
mybatis执行流程
1、resourse加载获取全局配置文件
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
2、实例化sqlsessionfactorybuild构造器
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
3、解析配置文件流xmlconfigbuilder
4、configuration所有的配置信息
5、sqlsessionfactory实例化
SqlSession sqlSession = sqlSessionFactory.openSession();
6、transactional事务管理器
7、创建executor执行器
8、创建sqlsession
9、实现CRUD,失败会回滚到事务管理器
10、查看是否会执行成功,若失败会回滚到事务
11、提交
多对一处理:
子查询:
<?xml version="1.0" encoding="UTF-8" ?><mapper namespace=“com.lyg.dao.StudentDao”>
<select id="getStudent" resultMap="studentteacher">
select * from user.student </select>
<resultMap id="studentteacher" type="student">
<result property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="teacher">
select * from user.teacher where tid = #{tid} </select>
</mapper>
**javatype:**把sql语句查询出的结果集封装给某个类的对象
**select:**下条要执行的语句
**property:**注入给实体类的某个属性
**column:**在上次查的结果集中,用哪些列值作为条件去执行下一条sql语句
按照结果嵌套处理:
mybatis缓存:
可用的清除策略有:
LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
一级缓存:sqlsession
缓存失效:
1、sqlsession变了 缓存失效
2、sqlsession不变,查询条件不同,一级缓存失效
3、sqlsession不变,中间发生了增删改操作,一级缓存失败
4、sqlsession不变,手动清除缓存,一级缓存失败
二级缓存:
1、只要开启二级缓存,只在同一个namespace(mapper)有效
2、所有数据都会先放在一级缓存中
3、只有当会话(sqlsession)提交或者关闭,才会提交到二级缓存中
缓存原理: