大神帮帮看看哪里错了,mybatis不用xml的Mapper.xml里面的语句,bean里的属性都能取到值,就是执行错误

一、使用场景
不同的数据库的Sql语法有所不同,为了保证在不同的数据库中都能执行,我们需要在MyBatis的Mapper.xml文件中编写sql语句时对当前连接的数据库的类型进行判断,然后编写适应不同数据库的sql语句。现在我们就是要解决如何在Mapper.xml中区分连接的数据库的类型。
二、解决方法
mybatis提供了databaseIdProvider实现了对数据库类型的获取,从而实现了在Mapper.xml文件中对数据库类型的判断。废话不多说,直接上配置。
spring配置文件如下:
&?xml version="1.0" encoding="UTF-8" ?&
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
classpath:/org/springframework/aop/config/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
classpath:/org/springframework/context/config/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
classpath:/org/springframework/transaction/config/spring-tx-3.0.xsd"&
&!-- IoC配置 --&
&!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 --&
&context:component-scan base-package="com.shr.dao" /&
&context:component-scan base-package="com.shr.service" /&
&!-- DAO配置 --&
&context:property-placeholder location="classpath:config.properties"/&
&bean id="mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&
&property name="driverClassName"
value="${mysql_driver}"/&
&property name="url"
value="${mysql_url}"/&
&property name="username"
value="${mysql_username}"/&
&property name="password"
value="${mysql_password}"/&
&bean id="oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&
&property name="driverClassName"
value="${ora_driver}"/&
&property name="url"
value="${ora_url}"/&
&property name="username"
value="${ora_username}"/&
&property name="password"
value="${ora_password}"/&
&!-- 添加对数据库类型的判断 --&
&bean id="vendorProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean"&
&property name="properties"&
&prop key="Oracle"&oracle&/prop& &!-- 取别名,名称可任意,并不是上面配置的oralce数据源bean的id --&
&prop key="MySQL"&mysql&/prop&
&!-- 取别名,名称可任意,并不是上面配置的mysql数据源的bean的id--&
&/property&
&bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider"&
&property name="properties" ref="vendorProperties" /&
&!-- //添加对数据库类型的判断 --&
&bean name="myBatisSQLInterceptor" class="com.shr.dao.MyBatisSQLInterceptor"&&/bean& &bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"& &property name="dataSource" ref="${dataSource}" /& &property name="typeAliasesPackage" value="com.shr.dao.pojo,com.shr.dao.model"
/& &!-- 给MyBatis框架提供查询数据库类型的功能,这个千万不能少 --&
&property name="databaseIdProvider" ref="databaseIdProvider" /&
&property name="mapperLocations"& &list& &value&classpath:com/shr/dao/resources/mappers/*_mapper.xml&/value& &/list& &/property& &!-- &property name="configLocation" value="/WEB-INF/mybatis-config.xml"/& --& &property name="typeHandlersPackage"
value="com.shr.dao" /& &property name="plugins"& &list& &ref bean="myBatisSQLInterceptor"/& &/list& &/property& &/bean& &!-- 配置事务管理器 --& &tx:annotation-driven/& &bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&property name="dataSource" ref="${dataSource}"/& &/bean& &bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"& &property name="basePackage" value="com.shr.dao.mapper"/& &property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/& &!--
&property name="markerInterface" value="com.shr.dao.mapper.ITemplateMapper"/& --& &/bean& /beans&
说明:重点看用加粗标记的配置,其他的配置不用管,因为跟此次要在Mapper.mxl文件中获取数据库类型的目的没有直接关系。
Mapper.xml配置如下:
&resultMap id="userResultMap" type="com.shr.dao.model.userManage.UserInfo"&
&result property="user_id" column="user_id"/&
&result property="user_name" column="user_name"/&
&result property="user_password" column="user_password"/&
&result property="user_privilege" column="user_privilege"/&
&result property="user_alias" column="user_alias"/&
&result property="create_date" column="create_date" javaType="java.util.Date" jdbcType="TIMESTAMP"/&
&result property="invalid_date" column="invalid_date" javaType="java.util.Date" jdbcType="TIMESTAMP"/&
&/resultMap&
&select id="selectUserInfo" resultMap="userResultMap" databaseId="mysql"&
&!--对应在spring配置文件中的别名 &prop key="Oracle"&oracle&/prop& &!-- 取别名,名称可任意,并不是上面配置的mysql数据源bean的id --& --& select user_id, user_name, user_password, user_privilege, user_alias, create_date, invalid_date from user_define order by user_id asc &/select& &select id="selectUserInfo" resultMap="userResultMap"databaseId="oracle"&
&!--对应在spring配置文件中的别名 &prop key="Oracle"&oracle&/prop& &!-- 取别名,名称可任意,并不是上面配置的oracle数据源bean的id --& --&
select user_id, user_name, user_password, user_privilege, user_alias, create_date, invalid_date from user_define order by user_id desc &/select&
说明:重点关注Mapper.xml文件用加粗标识的配置,主要是通过databaseId="xxx" 实现对数据库类型的判断,然后针对不同的数据库类型编写不同的sql即可。上面在spring配置文件中做的那些配置就是为了在Mapper.xml中使用databaseId="xxx",如果没有在spring配置文件中做上面的配置的话,就会报错,报错信息如下:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.shr.dao.mapper.IuserManageMapper.selectUserInfo
at org.apache.ibatis.binding.MapperMethod$SqlCommand.&init&(MapperMethod.java:189)
at org.apache.ibatis.binding.MapperMethod.&init&(MapperMethod.java:43)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51)
at com.sun.proxy.$Proxy29.selectUserInfo(Unknown Source)
at com.shr.service.userManage.UserManageService.getUserListInfo(UserManageService.java:98)
mybatis的xml中判断不同数据库,获得数据
Excel批量导入数据,支持不同的数据库
Mybatis与数据库的类型对应
Mybatis与数据库的类型对应
由于业务的改变,在首次存入数据库时某些int属性并没有赋值,于是默认值就开始污染数据库了。
下面详细说明下,当基本数据类型定义的变量作为类...
MyBatis操作数据库步骤
MyBatis框架的核心是SqlSessionFactory对象,从SqlSessionFactory类的名称来看,它是用来创建SqlSession对象的工厂。但SqlSessionFactory对象...
mybatis mysql获取当前数据库所有表与表字段信息
最近在做一个代码生成器,所以就需要获取到当前表结构信息,于是搜索了些相关资料并结合mybatis整理了这篇文章,代码相对简单。1、编写一个Mapper接口
代码如下:import org.apach...
关于Mybatis中mapper.xml的传入参数简单技巧
由于在做项目的时候,我看见同事使用的传入参数类型各式各样,感觉没规律可言,闲暇的时候我就自己搭建了项目做了一些传入参数的测试(当然其实更好的方式是看源码,但是博主能力有限,毕竟入行没多久,看起来很吃力...
一、MyBatis:
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以...
mybatis介绍:
每一个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象实例可以通过SqlSessionFact...
1.Blob介绍
2.自定义Blob类型处理器
3.编写查询语句
1.Blob介绍
首先,先简单介绍下数据库Blob字段,Blob(Binary Large Object...
如果数据库中的字段为text或者blob这种大文本类型,在使用MybatisGenerator工具自动生成代码的时候会将其进行特殊处理(一个新的sql片段),结果会导致无法对该字段的值进行操作。
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 d...
没有更多推荐了,mybatis热部署加载*Mapper.xml文件
我的图书馆
mybatis热部署加载*Mapper.xml文件
需求:mybatis的sql文件暴露在外面,但是当我们修改了对应的mapper.xml文件后,怎样才能避免重启项目实现热加载这类配置文件呢?
环境:springMVC(其中spring3.1.1、mybatis3.2.1)
1.首先看一下mybatis映射层目录结构图如下(Users.java是实体类、SqlMapConfig.xml是管理加载所有的mapper.xml文件、Users.xml是mapper.xml文件):
Users.java内容如下:
[java] package&com.pingpeng.misp.&&&&public&class&Users&implements&java.io.Serializable&{&&&&&&&&private&static&final&long&serialVersionUID&=&-2820411L;&&&&&&private&Integer&&&&&&&private&Integer&&&&&&&private&String&&&&&&&private&String&&&&&&&&&&&&&//&四个属性的get、set方法请自行添加,此处不写了&&&&&&&&}&&
SqlMapConfig.xml内容如下:
[html] &?xml&version="1.0"&encoding="UTF-8"?&&&&&!DOCTYPE&configuration&&&PUBLIC&"-//ibatis.apache.org//DTD&Config&3.0//EN"&&&"http://ibatis.apache.org/dtd/ibatis-3-config.dtd"&&&&configuration&&&&&&&&typeAliases&&&&&&&&&&&&!--&Entities&参数实体&--&&&&&&&&&&&&!--&com.pingpeng.misp.models&包中的&所有Bean,&取个别名&--&&&&&&&&&&&&!--&比如Resources类就用resource来表示&--&&&&&&&&&&&&typeAlias&type="com.pingpeng.misp.models.Users"&alias="users"&/&&&&&&&&/typeAliases&&&&&&&&mappers&&&&&&&&&&&&!--&对应Bean类的xml配置文件的路径信息&--&&&&&&&&&&&&mapper&resource="com/pingpeng/misp/models/mybatis/mapper/Users.xml"&/&&&&&&&&/mappers&&&&/configuration&&&
Users.xml内容如下:
[html] &?xml&version="1.0"&encoding="UTF-8"?&&&&&!DOCTYPE&mapper&&&PUBLIC&"-//ibatis.apache.org//DTD&Mapper&3.0//EN"&&&"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"&&&&mapper&namespace="com.pingpeng.misp.models.mybatis.mapper.Users"&&&&&&&&!--&定义一条查询语句,在bean的implementation中会引用此语句的id&--&&&&&&&&select&id="findByName"&parameterType="String"&resultType="users"&&&&&&&&&&&select&*&from&users&where&account&=&#{account}&&&&&&&/select&&&&&&&&select&id="findAll"&resultType="com.pingpeng.misp.models.Users"&&&&&&&&&&&select&*&from&users&&&&&&&&/select&&&&/mapper&&&
2.再看看application.xml中关于mabatis的配置(什么数据源之类的就不贴出来了):
[html] &!--&MyBatis&sqlSessionFactory&配置&mybatis--&&&&&bean&id="sqlSessionFactory"&class="org.mybatis.spring.SqlSessionFactoryBean"&&&&&&&&&&&property&name="configLocation"&value="classpath:/com/pingpeng/misp/models/mybatis/SqlMapConfig.xml"&/&&&&&&&&&&&property&name="dataSource"&ref="dataSource"&/&&&&&/bean&&&&&bean&id="sqlSession"&class="org.mybatis.spring.SqlSessionTemplate"&&&&&&&&&&&constructor-arg&index="0"&ref="sqlSessionFactory"&/&&&&&/bean&&&&bean&id="sqlSessionCache"&class="com.pingpeng.misp.common.SqlSessionCache"&init-method="refreshMapper"&&&&&&&&&&!--&扫描的映射mapper.xml的文件路径--&&&&&&&&&&&&&&&&&&property&name="packageSearchPath"&value="classpath*:com/pingpeng/misp/models/mybatis/mapper/**/*.xml"&&/property&&&&&&&&&&property&name="sqlSessionFactory"&ref="sqlSessionFactory"&&/property&&&&/bean&&&
3.最后看看com.pingpeng.misp.common.SqlSessionCache这个缓存类refreshMapper方法是如何实现刷新的:
[java] package&com.pingpeng.misp.&&&&import&java.io.IOE&&import&java.lang.reflect.F&&import&java.util.HashM&&import&java.util.M&&import&java.util.S&&&&import&org.apache.commons.logging.L&&import&org.apache.commons.logging.LogF&&import&org.apache.ibatis.builder.xml.XMLMapperB&&import&org.apache.ibatis.session.C&&import&org.apache.ibatis.session.SqlSessionF&&import&org.springframework.core.io.R&&import&org.springframework.core.io.support.PathMatchingResourcePatternR&&&&public&class&SqlSessionCache&{&&&&&&private&Log&log&&=&LogFactory.getLog(SqlSessionCache.class);&&&&&&&&&&&&private&SqlSessionFactory&sqlSessionF&&&&&&private&Resource[]&mapperL&&&&&&private&String&packageSearchP&&&&&&private&HashMap&String,&Long&&fileMapping&=&new&HashMap&String,&Long&();//&记录文件是否变化&&&&&&&&&&&&public&void&refreshMapper()&{&&&&&&&&&&try&{&&&&&&&&&&&&&&Configuration&configuration&=&this.sqlSessionFactory.getConfiguration();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&step.1&扫描文件&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&this.scanMapperXml();&&&&&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&&&&&log.error("packageSearchPath扫描包路径配置错误");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("==============刷新前mapper中的内容===============");&&&&&&&&&&&&&&for&(String&name&:&configuration.getMappedStatementNames())&{&&&&&&&&&&&&&&&&&&System.out.println(name);&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&step.2&判断是否有文件发生了变化&&&&&&&&&&&&&&if&(this.isChanged())&{&&&&&&&&&&&&&&&&&&//&step.2.1&清理&&&&&&&&&&&&&&&&&&this.removeConfig(configuration);&&&&&&&&&&&&&&&&&&&&//&step.2.2&重新加载&&&&&&&&&&&&&&&&&&for&(Resource&configLocation&:&mapperLocations)&{&&&&&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&&&XMLMapperBuilder&xmlMapperBuilder&=&new&XMLMapperBuilder(configLocation.getInputStream(),&configuration,&configLocation.toString(),&configuration.getSqlFragments());&&&&&&&&&&&&&&&&&&&&&&&&&&xmlMapperBuilder.parse();&&&&&&&&&&&&&&&&&&&&&&&&&&log.info("mapper文件["&+&configLocation.getFilename()&+&"]缓存加载成功");&&&&&&&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&log.error("mapper文件["&+&configLocation.getFilename()&+&"]不存在或内容格式不对");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("==============刷新后mapper中的内容===============");&&&&&&&&&&&&&&for&(String&name&:&configuration.getMappedStatementNames())&{&&&&&&&&&&&&&&&&&&System.out.println(name);&&&&&&&&&&&&&&}&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&}&&&&&&}&&&&&&&&&&&&public&void&setPackageSearchPath(String&packageSearchPath)&{&&&&&&&&&&this.packageSearchPath&=&packageSearchP&&&&&&}&&&&&&&&&&&&public&void&setSqlSessionFactory(SqlSessionFactory&sqlSessionFactory)&{&&&&&&&&&&this.sqlSessionFactory&=&sqlSessionF&&&&&&}&&&&&&&&/**&&&&&&*&扫描xml文件所在的路径&&&&&&*&@throws&IOException&&&&&&&*/&&&&&&private&void&scanMapperXml()&throws&IOException&{&&&&&&&&&&this.mapperLocations&=&new&PathMatchingResourcePatternResolver().getResources(packageSearchPath);&&&&&&}&&&&&&&&/**&&&&&&*&清空Configuration中几个重要的缓存&&&&&&*&@param&configuration&&&&&&*&@throws&Exception&&&&&&*/&&&&&&private&void&removeConfig(Configuration&configuration)&throws&Exception&{&&&&&&&&&&Class&?&&classConfig&=&configuration.getClass();&&&&&&&&&&clearMap(classConfig,&configuration,&"mappedStatements");&&&&&&&&&&clearMap(classConfig,&configuration,&"caches");&&&&&&&&&&clearMap(classConfig,&configuration,&"resultMaps");&&&&&&&&&&clearMap(classConfig,&configuration,&"parameterMaps");&&&&&&&&&&clearMap(classConfig,&configuration,&"keyGenerators");&&&&&&&&&&clearMap(classConfig,&configuration,&"sqlFragments");&&&&&&&&&&&&clearSet(classConfig,&configuration,&"loadedResources");&&&&&&&&}&&&&&&&&@SuppressWarnings("rawtypes")&&&&&&private&void&clearMap(Class&?&&classConfig,&Configuration&configuration,&String&fieldName)&throws&Exception&{&&&&&&&&&&Field&field&=&classConfig.getDeclaredField(fieldName);&&&&&&&&&&field.setAccessible(true);&&&&&&&&&&Map&mapConfig&=&(Map)&field.get(configuration);&&&&&&&&&&mapConfig.clear();&&&&&&}&&&&&&&&@SuppressWarnings("rawtypes")&&&&&&private&void&clearSet(Class&?&&classConfig,&Configuration&configuration,&String&fieldName)&throws&Exception&{&&&&&&&&&&Field&field&=&classConfig.getDeclaredField(fieldName);&&&&&&&&&&field.setAccessible(true);&&&&&&&&&&Set&setConfig&=&(Set)&field.get(configuration);&&&&&&&&&&setConfig.clear();&&&&&&}&&&&&&&&&&&&/**&&&&&&*&判断文件是否发生了变化&&&&&&*&@param&resource&&&&&&*&@return&&&&&&*&@throws&IOException&&&&&&*/&&&&&&private&boolean&isChanged()&throws&IOException&{&&&&&&&&&&boolean&flag&=&&&&&&&&&&&for&(Resource&resource&:&mapperLocations)&{&&&&&&&&&&&&&&String&resourceName&=&resource.getFilename();&&&&&&&&&&&&&&&&&&&&&&&&&&&&boolean&addFlag&=&!fileMapping.containsKey(resourceName);//&此为新增标识&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&修改文件:判断文件内容是否有变化&&&&&&&&&&&&&&Long&compareFrame&=&fileMapping.get(resourceName);&&&&&&&&&&&&&&long&lastFrame&=&resource.contentLength()&+&resource.lastModified();&&&&&&&&&&&&&&boolean&modifyFlag&=&null&!=&compareFrame&&&&compareFrame.longValue()&!=&lastF//&此为修改标识&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&新增或是修改时,存储文件&&&&&&&&&&&&&&if(addFlag&||&modifyFlag)&{&&&&&&&&&&&&&&&&&&fileMapping.put(resourceName,&Long.valueOf(lastFrame));//&文件内容帧值&&&&&&&&&&&&&&&&&&flag&=&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&&&return&&&&&&&}&&}&&
1.可以写个定时器每隔一段时间执行SqlSessionCache中refreshMapper()方法,这样就实现热部署功能
2.注意&property name="packageSearchPath" value="classpath*:com/pingpeng/misp/models/mybatis/mapper/**/*.xml"&&/property&配置的路径一定要是所有的mapper映射文件,而不是总管理文件
3.当前实现如果只改动了一个文件,那么也只重新加载所有文件,如何实现只加载更新的文件呢,这个有点复杂,请自行研究
喜欢该文的人也喜欢博客分类:
项目中用的是spring3.0.5,MyBatis3.0.5,整合mybatis,spring用的是mybatis-spring-.1.0.1。在这个过程中,遇到了一个配置上的问题,就是配置Mapper时的错误,在运行时抛出如下异常:
Exception in thread "main"
java.lang.IllegalArgumentException
: Mapped Statements collection does not contain value for cn.xxxx.mail.webmail.dao.UserMapper.getUserById
一看就知是Mapper配置出错了。仔细检查过了,
1、我是用:&bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&
&property name="basePackage" value="cn.xxxx.mail.webmail.dao.mapper"/&
&/bean&让spring自动加载mapper配置的,这个没错。
2、UserMapper.java接口和UserMapper.xml同名,且在同一路径下,这个没错。
我的UserMapper.java有个方法是:public User getUserById(String id);
问题就出在这里了,我在UserMapper.xml中配成了这样:
&select id="getUser" resultType="cn.xxxx.mail.webmail.model.User" parameterType="java.lang.String"&
select * from users where id=#{value}
在配置文件中的select 的id写错了,写成getUser,没和UserMapper.java的方法同名
经过这次,得出如下结论:
1、mapper的java文件和mapper的xml配置文件要同名,同路径
2、mapper的java文件的方法名称和mapper的xml配置文件的id要同名称
3、mapper配置文件的namespace要全名,不能只写包名
如:cn.xxxx.mail.webmail.dao.mapper.UserMapper,这时,namespace不能写 成:cn.xxxx.mail.webmail.dao.mapper
浏览 13930
你好能不能说下spring+mybatis的事物是怎么弄的?我的事务处理是交由spring aop处理的。
浏览: 167732 次
来自: 深圳
你真是帮了大忙了,头疼了好几天了,给你鞠个躬
我加了还是不行啊
也没人回答呢~ 我也出现了类似的问题 怎么解决的哇~
怎么调用呢,写个例子撒
在哪里删除模拟器中的程序呢?也就是说模拟器的程序在哪里呢?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'本篇文章将简单介绍 insert, update, delete 的配置及使用 ,以后会对mybatis的源码进行深入讲解。
相信,看到insert, update, delete, 我们就知道其作用了,顾名思义嘛,myabtis 作为持久层框架,必须要对CRUD啊。
好啦,咱们就先来看看 insert, update, delete 怎么配置, 能配置哪些元素吧:
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"&
&mapper namespace&
1. id (必须配置)
id是命名空间中的唯一标识符,可被用来代表这条语句。
一个命名空间(namespace) 对应一个dao接口,
这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致 --&
id="insertUser"
parameterType="com.demo.User"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys="false"
timeout="20"&
以上就是一个模板配置, 哪些是必要配置,哪些是根据自己实际需求,看一眼就知道了。
下面, 还是用第一篇文章《
》里面的demo来示例吧:
数据库 (user表):
我项目结构:
User.java:
package com.dy.
public class User {
private int
private int
private int deleteF
public int getId() {
public void setId(int id) {
public String getName() {
public void setName(String name) {
this.name =
public String getPassword() {
public void setPassword(String password) {
this.password =
public int getAge() {
public void setAge(int age) {
this.age =
public int getDeleteFlag() {
return deleteF
public void setDeleteFlag(int deleteFlag) {
this.deleteFlag = deleteF
UserDao.java:
package com.dy.
import com.dy.entity.U
public interface UserDao {
public void insertUser (User user);
public void updateUser (User user);
public void deleteUser (User user);
userDao.xml:
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"&
&mapper namespace&
&insert id&
insert into user(id, name, password, age, deleteFlag)
values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
&update id&
update user set name = #{name}, password = #{password}, age = #{age}, deleteFlag = #{deleteFlag}
where id = #{id};
&delete id&
delete from user where id = #{id};
这样,一个简单的映射关系就建立了。 仔细观察上面parameterType,
"com.dy.entity.User",包名要是再长点呢,每次都这样写,写得蛋疼了。别忘了之前讲的 typeAliases(别名), 那么这个地方,用上别名,岂不是技能跟蛋疼的长长的包名说拜拜了。好啦,咱们配上别名,在哪儿配? 当然是在mybatis 的全局配置文件(我这儿名字是mybatis-conf.xml), 不要认为是在mapper的配置文件里面配置哈。
mybatis-conf.xml:
&typeAlias alias/&
这样,一个别名就取好了,咱们可以把上面的 com.dy.entity.User 都直接改为user 了。 这多方便呀!
我这儿数据库用的是mysql, 我把user表的主键id 设置了自动增长, 以上代码运行正常, 那么问题来了(当然,我不是要问学挖掘机哪家强),我要是换成oracle数据库怎么办? oracle 可是不支持id自增长啊? 怎么办? 请看下面:
&insert id&
insert into user(id, name, password, age, deleteFlag)
values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
同理, 如果我们在使用mysql的时候,想在数据插入后返回插入的id, 我们也可以使用 selectKey 这个元素 :
&insert id&
&selectKey keyProperty &
SELECT LAST_INSERT_ID() as id
insert into user(id, name, password, age, deleteFlag)
values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
这儿,我们就简单提一下 &selectKey& 这个元素节点吧:
&selectKey
selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 --&
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED"&
Mapper中insert方法与insertSelective的区别
insert方法是使用所有的属性作为字段使用
insertSelective插入数据,使用不为null的属性作为字段使用...
Mapper 中的几种update的区别
这两个update都是使用generator生成的mapper.xml文件中,对dao层的更新操作update更新传回数据的所有字段,没有传回的字段保持原样。updateByPrimaryKey对实体...
Mybatis中Mapper.xml文件中的update语句写法
update CT_SYS_DUTYREAL
DUTYREAL_UID = #{dutyrealUid,jdbcType=DECIMAL},
Mybatis中mapper.xml文件update、delete以及insert返回值问题
最近写了几个非常简单的接口(CRUD),在单元测试的时候却出了问题,报错如下:Caused by: org.springframework.beans.factory.UnsatisfiedDepen...
MyBatis——XML映射文件—更新(Mapper XML文件——Insert ,Update,delete)
数据变更语句 insert,update 和 delete 的实现非常接近:
collection mybatis 一对多 mapper
&sqlMap namespace=&****&&
在使用MyBatis编写sql文件时,必须用到上面的标签,namespace指“命名空间”,举例...
MyBatis插入数据返回插入对象的主键
方法:在mapper中指定keyProperty属性,示例如下:
主要: useGeneratedKeys=&true& keyProperty=&userId&
Mybatis 的常见面试题
1、#{}和${}的区别是什么?#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
4、SpringBoot+Mybatis多表操作以及增删改查
Mybatis整合成功之后,接下来了解一下增删改查的配置以及多表操作,先从增删改查开始为了方便后面的多表操作,现在针对数据表的配置我这里全部在xml中配置(暂时不用注解的方式了),先看一下目前的工程结...
没有更多推荐了,}

我要回帖

更多关于 mybatisxml配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信