Mapped Statements collection already contains value for。。。错误提示方法ID重复,
可能是同时使用了xml和注解方法占用了同一个ID
想要链接获取方法在查询等之前执行,需要加@Before注解
断开连接等需要在最后执行的方法需要加@Arter注解
添加数据时需要提交事务才能将数据放入数据库,否则会回滚导致添加失败,
所以需要在destory方法中先提交事务 sqlSession.commit();
xml文件中语句id必须要和dao接口中方法名称相同,不然会报错
xml文件中只支持<!-- -->这种注释,其他的方式注释并不会被采用,其它方式注释后仍会影响程序运行
在数据库主配置文件中,如果mapper 使用注解配置
<mapper class="com.zhonghuan.dao.UserDao"></mapper>,
格式为class=“ 中间用.隔开”
<mapper resource="com/zhonghuan/dao/UserDao.xml"></mapper>
格式为resource=“中间用/隔开”
MySQL数据库在Windows中不区分大小写,
查询时数据库中的列名和结果的对象某个属性大小写不同时,可以查询并返回成功
数据库中的username列,查询时返回的User对象中的userName属性,可以查询并返回成功
linux系统中严格区分大小写
当数据库列名和Javabean对象属性名相同时,可以直接查询,
mybatis会直接将数据库中查询到的内容封装到相同名称的Javabean对象的属性中,
当数据库列名和javabean对象属性名不同时,要通过dao.的xml文件mapper标签中进行配置,使列名和对象属性一一对应,执行语句时不用对象的全限定类名而用resulmap标签的Id进行配置
<resultMap id="Usermap" type="com.zhonghuan.domain.User">
<!--配置主键-->
<id property="userId" column="id"></id>
<!--配置User中其他属性-->
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
typeAliases标签:用于取别名,取别名后别名不分大小写
<typeAliases>
指定后为包中的实体类注册别名,类名就是别名。
引用的时候不再区分大小写
<package name="com.zhonghuan.domain"></package>
</typeAliases>
使用单独的properties文件配置jdbc
在environments标签外通过properties标签获得配置文件路径
<properties resource="jdbcConfig.properties"></properties>
在property标签中通过${}获取值
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
主配置文件中的Mappers标签 ,用于指定dao接口所在的包,使用package标签指到dao接口所在包后不再需要写Mapper标签指定具体路径,
<mappers>
<!--<mapper class="com.zhonghuan.dao.UserDao"></mapper>-->
<!--<mapper resource="com/zhonghuan/dao/UserDao.xml"></mapper>-->
<package name="com.zhonghuan.dao"></package>
</mappers>
在xml文件中写的SQL语句换行的时候一定要加个空格,
或在上一行末尾或在第二行开头,
否则执行语句进行拼接的时候可能会忽略换行符导致SQL错误
一级缓存
一级缓存是 SqlSession 级别的缓存,一级缓存与SQLsession共存亡,只要 SqlSession 没有 flush 或 close,它就存在。
关闭sqlsession或者调用sqlSession.clearCache();方法就会清空一级缓存
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
二级缓存
开启步骤
1.在主配置文件中配置
2.在类的配置文件中配置
3.在语句中配置
将 UserDao.xml 映射文件中的标签中设置useCache=”true”
代表当前这个 statement 要使用二级缓存,如果不使用二级缓存可以设置为 false。
二级缓存存储的数据,再次查询时再将数据封装为对象,所以使用二级缓存虽然只执行一次语句但是创建了两个对象