Pregunta

Así que estoy trabajando en un proyecto (JSF2, Spring3 Core, MVC, Webflow, MyBatis3, RichFaces, y un legado de Oracle 10g). La fuente de todos mis problemas de tiene que ver con el diseño de la base de datos. El problema es que la mayoría de las tablas de datos han de cambiar de esquema (mal diseño, tal vez?). Así que tengo que ser capaz de soportar la adición y eliminación de columnas adicionales.

Para adaptarse a este que he hecho de extracción de datos de MyBatis en un objeto de dominio personalizado "universal", que básicamente sólo se extiende un HashMap. Mi problema actual es la actualización de estos objetos HashMap. Debe haber una manera de hacer que funcione, pero puedo parecer conseguir MyBatis a cooperar. He intentado usar HashMap.entrySet () y MyBatis de, pero fue en vano. por ejemplo.

UPDATE MYTABLE
SET 
<foreach collection="entries" index="i" item="entry" close=""  open="" separator=", ">
  #{entry.key} = #{entry.value}
</foreach>
WHERE FOO='BAR';

He intentado un TypeHandler costumbre pero setParameter () no me da acceso suficiente para hacer lo que necesito. Un ResultHandler no me dio lo suficiente acceso a cada resultado individual, por lo que no podía usar eso.

Ahora sé que podría hacer algo como Obj.createUpdateSqlString () e insertarlo en el asignador como una cadena literal, pero eso es un poco de un truco y se va a abrir a la inyección de SQL. Por no mencionar que implicaría escapar una gran cantidad de cadenas, y que constituyan una amplia gama de posibles aportaciones, ya menos que todas las posibilidades están cubiertas que abre la puerta a algunos errores graves.

Entonces, ¿hay una forma establecida de hacer esto? O al menos de una manera medio decente? He oído un número de defensores incondicionales de MyBatis dicen que aún tengo que encontrar una situación MyBatis no podía manejar con gracia; por lo que los expertos de MyBatis, por favor me ayude !!

¿Fue útil?

Solución

Suena como si estuvieran tratando de evitar el uso de tablas EAV.

Usted tiene que escoger su veneno cuando se trata de la adición de campos de forma dinámica. EAV es bueno desde el punto de vista teoría, pero tiene serios problemas de rendimiento en tablas grandes. Al tiempo que añade dinámicamente columnas es mejor para la consulta de rendimiento que tiene que hacer frente a una interfaz de tabla cambiante y SQL dinámico. No escribiría la base de datos fuera como un mal diseño de plano.

Es posible que desee utilizar el marco que está utilizando. Consulte el esquema de la tabla (para una apariencia de Oracle en USER_TAB_COLUMNS) y generar los scripts de inserción / actualización. Parametrizarlos por lo que están a salvo de la inyección. Será un dolor de cabeza, pero no veo una alternativa.

Otros consejos

MyBatis o Hibernate tanto del hedor con schemeas base de datos locos. Yo sólo tiene que utilizar SpringJDBC o similar.

No trate de hacer un ajuste clavija redonda en un agujero cuadrado, incluso si se trata de una muy agradable clavija redonda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top