我不知道这里的问题。其他映射器可以工作,但事实并非如此。当我尝试使用Mapper时,抛出异常:session.getMapper(ModeloDAO.class)
。可能是byte []字段或带有错误。我试过没有关联和byte []字段,但问题仍然存在。
型号:
@Alias("Modelo")
public class Modelo {
private int id;
private String nombre;
private String estado;
private Date fechaCreacion;
private Date creadoPor;
private byte[] foto;
private Marca marca;
public Modelo() {
}
public Modelo(String nombre, String estado, Date fechaCreacion, Date creadoPor,
byte[] foto, Marca marca) {
super();
this.nombre = nombre;
this.estado = estado;
this.fechaCreacion = fechaCreacion;
this.creadoPor = creadoPor;
this.foto = foto;
this.marca = marca;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
public Date getFechaCreacion() {
return fechaCreacion;
}
public void setFechaCreacion(Date fechaCreacion) {
this.fechaCreacion = fechaCreacion;
}
public Date getCreadoPor() {
return creadoPor;
}
public void setCreadoPor(Date creadoPor) {
this.creadoPor = creadoPor;
}
public byte[] getFoto() {
return foto;
}
public void setFoto(byte[] foto) {
this.foto = foto;
}
public Marca getMarca() {
return marca;
}
public void setMarca(Marca marca) {
this.marca = marca;
}
}
映射器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.acme.repository.ModeloDAO">
<resultMap id="modeloResult" type="Modelo">
<id property="id" column="modelo_id" />
<result property="nombre" column="nombre" />
<result property="estado" column="estado" />
<result property="foto" column="foto" javaType="_byte[]" jdbcType="BLOB" />
<result property="fechaCreacion" column="fecha_creacion" />
<result property="creadoPor" column="creado_por" />
<association property="marca" column="marca_id" javaType="Marca">
<id property="id" column="marca_id" />
<result property="nombre" column="nombre" />
<result property="estado" column="estado" />
<result property="fechaCreacion" column="fecha_creacion" />
<result property="creadoPor" column="creado_por" />
</association>
</resultMap>
<select id="list" resultMap="modeloResult">
select
modelos.modelo_id,
modelos.nombre,
modelos.estado,
modelos.foto,
modelos.fecha_creacion,
marcas.marca_id,
marcas.nombre as nombreM,
marcas.estado,
marcas.fecha_creacion
from
modelos,marcas
where
modelos.marca_id=marcas.marca_id;
</select>
<select id="searchById" resultMap="modeloResult" parameterType="int">
select * from modelos where modelo_id = #{id}
</select>
<select id="searchByMarca" resultMap="modeloResult" parameterType="int">
select * from modelos where marca_id = #{marcaId}
</select>
<insert id="save" parameterType="Modelo">
insert into modelos(nombre, creado_por, foto) values(#{nombre}, #{creadoPor}, #{foto})
</insert>
<update id="update" parameterType="Modelo">
update modelos set nombre = #{nombre}, foto = #{foto} where modelo_id = #{id}
</update>
<update id="delete" parameterType="int">
update modelos set estado = 'INACTIVO' where modelo_id = #{id}
</update>
</mapper>
DAO:
public interface ModeloDAO {
List<Modelo> list();
Modelo searchById(int id);
List<Modelo> searchByMarca(int marcaId);
void save(Modelo m);
void update(Modelo m);
void delete(int id);
}
配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="com.acme.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mapper/MarcaMapper.xml" />
<mapper resource="mybatis/mapper/ModeloMapper.xml" />
</mappers>
</configuration>
堆栈追踪:
org.apache.ibatis.binding.BindingException: Type interface com.acme.repository.ModeloDAO is not known to the MapperRegistry.
org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47)
org.apache.ibatis.session.Configuration.getMapper(Configuration.java:675)
org.apache.ibatis.session.defaults.DefaultSqlSession.getMapper(DefaultSqlSession.java:250)
com.acme.repository.ModeloDAOImpl.list(ModeloDAOImpl.java:22)
com.acme.service.ModeloService.list(ModeloService.java:20)
com.acme.controller.ModeloController.list(ModeloController.java:22)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
答案 0 :(得分:0)
来自MapperRegistry源代码:
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
MapperProxyFactory mapperProxyFactory = (MapperProxyFactory)this.knownMappers.get(type);
if(mapperProxyFactory == null) {
throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
} else {
try {
return mapperProxyFactory.newInstance(sqlSession);
} catch (Exception var5) {
throw new BindingException("Error getting mapper instance. Cause: " + var5, var5);
}
}
}
似乎你的mapper类没有被mybatis注册。 请检查你的ModeloDAO包是com.acme.repository 或者你应该手动添加mapper:
session.getConfiguration().addMapper(ModeloDAO.class)
似乎ModeloDAOImpl导致问题,如果你选择使用mapper类,那么你不需要编写mapper的实现,mybatis会为你生成它。
答案 1 :(得分:0)
在mapper.xml文件中,mapper的命名空间应该是mapper接口的路径。
例如:
<mapper namespace="com.app.mapper.LineMapper">
<select id="selectLine" resultType="com.jiaotong114.jiaotong.beans.Line">
select * from bus_line where id = #{id}
</select>
</mapper>
你的mapper接口应该在com.app.mapper包中,它的名字是LineMapper。