1. Introducción y configuración de MyBatis+Spring+MySQL
1.1 Introducción a MyBatis
MyBatis es un marco de capa de persistencia que puede personalizar SQL, procedimientos almacenados y asignaciones avanzadas. MyBatis elimina la mayor parte del código JDBC, la configuración del parámetro manual y la recuperación del conjunto de resultados. MyBatis utiliza solo XML y anotaciones simples para configurar y mapear tipos de datos básicos, interfaces de mapa y POJOS a registros de bases de datos. En comparación con las soluciones de ORM "única" como Hibernate y Apache OJB, MyBatis es una implementación de ORM "semiautomatizada".
El paquete JAR que debe usarse: MyBatis-3.0.2.Jar (paquete MyBatis Core). mybatis-spring-1.0.0.jar (combinado con primavera).
Dirección de descarga:
http://ibatis.apache.org/tools/ibator
http://code.google.com/p/mybatis/
1.2mybatis+Spring+MySQL Configuración simple
1.2.1 Construir entorno de primavera
(1) Establecer un proyecto web Maven;
(2) agregue el marco de Spring y los archivos de configuración;
(3) Agregue los paquetes de jar requeridos (marco de primavera, mybatis, mybatis-spring, junit, etc.) a pom.xml;
(4) Cambie los archivos de configuración de Web.xml y Spring;
(5) Agregue una página JSP y el controlador correspondiente;
(6) Prueba.
Como referencia: http://limingnihao.iteye.com/blog/830409. Build SpringMVC Project con Maven de Eclipse
1.2.2 Establecer una base de datos MySQL
Establezca una base de datos de gestión de selección de cursos de estudiantes.
Tabla: Tabla de estudiantes, mesa de clase, mesa de maestros, mesa de cursos, tabla de cursos de alumnos.
Relación lógica: cada estudiante tiene una clase; Cada clase corresponde a un maestro de clase; Cada maestro solo puede ser el maestro de clase de una clase;
Use el siguiente SQL para crear una base de datos, primero cree una tabla de estudiantes e inserte datos (más de 2 elementos).
Para obtener más SQL, descargue el archivo fuente del proyecto en recursos/SQL.
/* Crear una base de datos*/ Crear base de datos Student_Manager; Usar student_manager; / ***** Crear tabla de estudiantes *****/ Crear tabla student_tbl (student_id varchar (255) clave principal, student_name varchar (10) no null, student_sex varchar (10), student_birthday date, class_id varchar (255)); /*Insertar datos de Student*/ Insertar en Student_TBL (Student_ID, Student_Name, Student_sex, Student_Birthday, Class_id) Valores (123456, 'xxx', 'femenino', '1980-08-01', 121546)
Cree el archivo de configuración mysql.properties utilizados para conectarse a mysql.
jdbc.driverClassName = com.mysql.jdbc.driver jdbc.url = jdbc: mysql: // localhost: 3306/student_manager? user = root & contraseña = limingnihao & useUnicode = true & caracteringoding = utf-8
1.2.3 Construir entorno mybatis
El pedido es informal y el pedido actual se debe a que puede modificar los archivos escritos lo menos posible.
1.2.3.1 Crear clase de entidad: StudentEntity
Class Public StudentEntity implementa serializable {privado estático final Long SerialVersionUid = 3096154202413606831l; ClassEntity private ClassEntity; Fecha privada Estudiante Birthday; string string studentid; Nombre de estudiante de cadena privada; string string studentsex; public classEntity getClassEntity () {return classEntity; } fecha pública getStudentBirthday () {return StudentBirthday; } public String getStudentId () {return studentId; } public String getStudentName () {return StudentName; } public String getStudentSex () {return studentSex; } public void setClassEntity (classEntity classEntity) {this.classentity = classEntity; } public void setStudentBirthday (fecha estudiantilbirthday) {this.studentbirthday = studentbirthday; } public void setStudentId (string studentId) {this.studentId = studentId; } public void setStudentName (String StudentName) {this.studentName = studentName; } public void setstudentsex (string studentsex) {this.studentsex = studentSex; }} 1.2.3.2 Crear una interfaz de acceso a datos
La interfaz DAO correspondiente de la clase estudiantil: StudentMapper.
interfaz pública StudentMapper {public StudentEntity GetStudent (String StudentId); Public StudentEntity GetStudentAndClass (String StudentId); Lista pública <SentorentEntity> getStudentAll (); Public Void Insert Student (Entidad Estudiantilidad); Public Void Deletestudent (Entidad de Entidad Estudiantil); Public Void UpdateStudent (Entidad Estudiantil de Entidad); }1.2.3.3 Crear archivo de instrucción de asignación SQL
File de instrucción SQL de clase estudiantil StudentMapper.xml
Etiqueta de mapas de resultados: mapeo de campos de tabla y atributos.
Seleccione Etiqueta: Consulta SQL.
<? xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtdd"> <mperspace = "com.data.data.manager" <resultMap type = "StudentEntity" id = "StudentResultMap"> <id Property = "StudentId" column = "Student_id"/> <resultspersi = "StudentName" column = "Student_name"/> <results Property = "StudentSex" column = "Student_sex"/> <Results = "StudentBirthday" columna = "Student_Birthday"/> </</sert. -> <select id = "getStudent" parametertype = "string" resultType = "StudentEntity" resultMap = "StudentResultMap"> <! [CDATA [SELECT * de Student_tbl st Where St.Student_id = #{StudentId}]]> </select> <!-Query the Student List-> <select id = "getStudentall" "" resultType = "com.manager.data.model.studententity" resultMap = "studentResultMap"> <! [CDATA [select * de student_tbl]]> </sect> </ mapper> 1.2.3.4 Crear archivo de configuración mapper mybatis
Cree un archivo de configuración de MyBatis en SRC/Main/Resource: MyBatis-Config.xml.
Etiqueta de typealiases: Dale a los alias a la clase un alias. La clase com.manager.data.model.StudentEntity se puede usar en lugar detentidad estudiantil.
Etiqueta Mappers: Cargue el archivo de instrucción de asignación SQL de la clase de entidad en MyBatis.
<? xml versión = "1.0" encoding = "utf-8"?> < type = "com.manager.data.model.studententity"/> </typealiases> <mappers> <mapper resource = "com/ganager/data/maps/studentmapper.xml"/> </ mappers> </figuration>
1.2.3.5 Modificar el archivo de configuración de Spring
Agrega principalmente el frijol de la clase de fábrica de producción de SQLSession: SQLSessionFactoryBean (en el paquete MyBatis.Spring). Requiere especificar la ubicación del archivo de configuración y la fuente de datos.
Implementación Bean correspondiente a la interfaz de acceso a datos. Creado a través de MapperFactoryBean. Es necesario ejecutar el nombre completo de la clase de interfaz y la referencia al bean de fábrica SQLSession.
< id = "TransactionManager"> <Property Name = "DataSource" ref = "DataSource" /> </ Bean> <Bean ID = "SqlSessionFactory"> <Property Name = "ConfigLocation" Value = "classpath: myBatis-config.xml" /> <Property Name = "DataSource" Ref = "Datase id = "StudentMapper"> <Property name = "mapperinterface" value = "com.data.data.studentmapper" /> <Property name = "sqlsessionFactory" ref = "sqlsessionFactory" /> </reme>
Tampoco puede definir el mapeador, usar anotaciones:
Agregue StudentMapper a la anotación
@Repository @Transactional Public Interface StudentMapper {}Las necesidades correspondientes son agregar escaneos en despachador-servlet.xml:
<Bean> <Property Name = "AnnotationClass" Value = "org.springframework.stereotype.repository"/> <Property name = "BasePackage" value = "com.liming.Manager"/> <Property Name = "SqlSessionFactory" ref = "sqlSessionFactory"/> </ Beel>
1.2.4 Prueba de StudentMapper
Use las pruebas de SpringMVC para crear un TestController, configurar TomCat y acceder a la página index.do.
@Controller Public Class TestController {@aUtowired StudentMapper StudentMapper; @RequestMapping (value = "index.do") public void induxpage () {StudentEntity entity = studentMapper.getStudent ("10000013"); System.out.println ("Nombre:" + Entity.getStudentName ()); }}Prueba con Junit:
@RunWith (value = springJUnit4ClassRunner.class) @ContextConfiguration (valor = "test-servlet.xml") public class StudentMappertest {@aUtowired private classMapper ClassMapper; @AUTOWIREDIREDIRD PRIVADOMAPPER ESTUDIANTEMPER; @Transactional public void getStudentTest () {StudentEntity Entity = StudentMapper.getStudent ("10000013"); System.out.println ("" + entity.getStudentId () + entity.getStudentName ()); LIST <StudentEntity> StudentList = StudentMapper.GetStudentAll (); para (StudentEntity EntityTemp: StudentList) {System.out.println (entityTemp.getStudentName ()); }}} 2. Archivo de configuración principal de Mybatis
Al definir SQLSessionFactory, debe especificar el archivo de configuración principal de MyBatis:
<bean id = "sqlsessionFactory"> <Property name = "configLocation" value = "classpath: mybatis-config.xml" /> <propiedad name = "dataSource" ref = "dataSource" /> </rena>
Las sub-etiquetadas en configuración en la configuración de mybatis incluyen:
Configuración |-Propiedades |-Configuración | --- Typealiases | --- TypeHandlers | --- ObjectFactory | --- Plugins | --- Entornos | --- Medio ambiente | --- | ---- | --- TransactionManager | ---- | ---- | __ DataSource | __ Mapeadores
2.1 Propiedades Propiedades
Los archivos de configuración de propiedades están relacionados con Java.Properties. Configure el recurso de propiedades para especificar la ruta de .properties y luego configure el nombre y el valor de la propiedad en la etiqueta Propiedades. Puede reemplazar el valor de propiedad correspondiente en el archivo .properties.
< valor = "root"/> <propiedad name = "contraseña" value = "limingnihao"/> </propiedades>
2.2 Configuración
Este es un paso importante para MyBatis para modificar los detalles del proceso de operación. La siguiente tabla describe estas configuraciones, significados y valores predeterminados.
Ajustes | describir | Valores permitidos | valor predeterminado |
en caché | Todos los cachés en este archivo de configuración están a nivel mundial de configuración de encendido/apagado. | Verdadero | FALSO | verdadero |
lazyloadingEnabled | Configuración global Carga perezosa. Si se establece en 'falso', todos los asociados se inicializarán y cargarán. | Verdadero | FALSO | verdadero |
agresivo de carga | Cuando se establece en 'Verdadero', los objetos de carga perezosos pueden ser cargados por todas las propiedades perezosas. De lo contrario, cada propiedad se carga según sea necesario. | Verdadero | FALSO | verdadero |
MultipLerSultSetSenable | Permitir y no permitir que una sola declaración devuelva múltiples conjuntos de datos (dependiendo de los requisitos del controlador) | Verdadero | FALSO | verdadero |
usecolumnlabel | Use etiquetas de columna en lugar de nombres de columnas. Diferentes unidades tienen diferentes enfoques. Consulte la documentación de la unidad o pruebe con estas dos opciones diferentes. | Verdadero | FALSO | verdadero |
Usar GeneratedKeys | Permite que JDBC genere claves primarias. Se requiere soporte de manejo. Si se establece en verdadero, esta configuración forzará la clave primaria generada, algunas unidades son incompatibles pero aún se pueden ejecutar. | Verdadero | FALSO | FALSO |
Automapulando | Especifica si MyBatis mapea automáticamente los campos de la tabla de datos a las propiedades de los objetos. Parcial solo asignará automáticamente simple, sin resultados anidados. Completo asignará automáticamente todos los resultados complejos. | NINGUNO, PARCIAL, LLENO | PARCIAL |
DefaultExecutortype | Configurar y establecer el Ejecutor, y el Ejecutor simple ejecuta otras declaraciones. El ejecutor de reutilización puede reutilizar las declaraciones de declaraciones de declaraciones preparadas, y el ejecutor por lotes puede ejecutar repetidamente declaraciones y actualizaciones de lotes. | SIMPLE REUTILIZAR LOTE | SIMPLE |
defaultStatementTimeOut | Establezca un límite de tiempo para determinar cuánto tiempo la unidad esperará a que la base de datos responda a un tiempo de espera | Entero positivo | No establecido (nulo) |
<nettings> <setting name = "cacheenabled" valor = "true" /> <setting name = "lazyLoadingEnabled" value = "true" /> <setting name = "multipleReSultSetSeSEnabled" value = "true" /> <setting name = "useColumnLabel" value = "true" /> <setting name = "useGeneratedKeys value =" false " /> <shatting name =" name = "valiente" valiente "valiente" " </ettences>
2.3 Typealiases tipo alias
El alias de tipo es la abreviatura de los tipos de Java.
Simplemente se asocia con la configuración XML, abreviada como un largo nombre de clase Java. Por ejemplo:
<Pyypealias> <typealias alias = "userEntity" type = "com.manager.data.model.userentity" /> <typealias alias = "studentEntity" type = "com.model.model.studententity" /> <typealias alias = "classentity" type = "com.data.model.classentity
Con esta configuración, "StudentEntity" se puede usar en cualquier lugar en lugar de "com.manager.data.model.studententity".
Para los tipos de Java normales, hay muchos alias de tipo incorporado. Ambos son insensibles a los casos, y debido a los nombres sobrecargados, debe prestar atención al manejo especial de los tipos nativos.
Alias | El tipo de mapa |
_byte | byte |
_largo | largo |
_corto | Corto |
_int | intencionalmente |
_entero | intencionalmente |
_doble | doble |
_flotar | flotar |
_Boolean | booleano |
cadena | Cadena |
byte | Byte |
largo | Largo |
Corto | Corto |
intencionalmente | Entero |
entero | Entero |
doble | Doble |
flotar | Flotar |
booleano | Booleano |
fecha | Fecha |
decimal | BigDecimal |
BigDecimal | BigDecimal |
objeto | Objeto |
mapa | Mapa |
mapache | Mapache |
lista | Lista |
lista de matriz | Lista de matriz |
Recopilación | Recopilación |
Iterador | Iterador |
2.4 TypeHandlers Type Many
Si MyBatis establece un parámetro en una declaración de preprocesamiento o toma un valor del conjunto de resultados, el procesador de tipo se utiliza para convertir el valor obtenido en el tipo Java de la manera apropiada. La siguiente tabla describe el procesador de tipo predeterminado.
Tipo de procesador | Tipos de java | Tipo JDBC |
Booleentypehandler | Booleano, booleano | Cualquier valor booleano compatible |
Bytetypehandler | Byte, byte | Cualquier número compatible o tipo de byte |
Shortttypehandler | Corto, corto | Cualquier forma digital o corta compatible |
Integertypehandler | Entero, int | Cualquier digital e entero compatible |
Longtypehandler | Largo, largo | Cualquier modelo digital o largo compatible |
Tytepehypehler | Flotar, flotar | Cualquier tipo de punto flotante digital o de precisión simple compatible |
Duplete de dudas | Doble, doble | Cualquier tipo de punto flotante digital o de doble precisión compatible |
BigDecimaltyPehandler | BigDecimal | Cualquier tipo decimal numérico o decimal compatible |
StringTypeGhandler | Cadena | Tipos de char y varchar |
Clobtypehandler | Cadena | Tipos de clob y longvarchar |
Ntringtypehandler | Cadena | Tipos de nvarchar y nchar |
Nclobtypehandler | Cadena | Tipo de NCLOB |
Bytearraytypehandler | byte[] | Cualquier tipo de flujo de byte compatible |
Holgazán | byte[] | Tipos de blob y largos |
DataTypeHandler | Fecha (java.util) | Tipo de marca de tiempo |
DateOnlyTyPeHandler | Fecha (java.util) | Tipo de fecha |
TimeOnlyTypehandler | Fecha (java.util) | Tipo de tiempo |
SqltimeMpTypeHandler | Marca de tiempo (java.sql) | Tipo de marca de tiempo |
SqlDateTypeHandler | Fecha (java.sql) | Tipo de fecha |
SqltimeTypeHandler | Tiempo (java.sql) | Tipo de tiempo |
ObjectTypeHandler | Cualquier | Otro tipo o no especificado |
Enumtypehandler | Tipo de enumeración | Varchar: cualquier tipo de cadena compatible, almacenado como código (no indexado). |
public class LimingStringTypeHandler implementa TypeHandler {@Override public void setParameter (preparado en PS, int i, parámetro de objeto, jdbctype jdbctype) lanza sqlexception {system.out.println ("setParameter - parámetro:" + ((string) parámetro) + ", JDBCType:" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " jdbctype.type_code); Ps.SetString (i, ((cadena) parámetro)); } @Override Public Object GetResult (ResultSet RS, String columnName) lanza SQLException {System.out.println ("GetResult - columnName:" + columnName); return rs.getString (columnName); } @Override Public Object GetResult (CallableStatement CS, int ColumnIndex) lanza SQLException {System.out.println ("getResult - columnIndex:" + columnIndex); return cstString (columnIndex); }}Agregue la etiqueta TypeHandler en TypeHandlers en el archivo de configuración.
<PypeHandlers> <typeHandler javatype = "String" jdbctype = "varchar" handler = "liming.student.manager.type.limingstringtypeHandler"/> </typeHandlers>
2.5 ObjectFactory Object Factory
Cada vez que MyBatis crea una nueva instancia del objeto de resultado, se usa ObjectFactory. El ObjectFactory predeterminado no es diferente de crear una instancia utilizando el constructor de la clase de destino. Si ya hay parámetros asignados, también es posible usar un constructor con parámetros.
Si reescribe la operación predeterminada de ObjectFactory, puede crear el suyo heredando org.apache.ibatis.reflection.factory.defaultObjectFactory.
La interfaz ObjectFactory es simple. Contiene dos métodos para la creación, uno es lidiar con el constructor predeterminado, y el otro es tratar con el constructor de parámetros. En última instancia, el método SetProperties se puede usar para configurar ObjectFactory. Después de inicializar su instancia de ObjectFactory, las propiedades definidas en el cuerpo del elemento ObjectFactory se pasarán al método SetProperties.
La clase pública LimingObjectFactory extiende defaultObjectFactory {private static final long SerialVersionUid = -399284318168302833l; @Override Public Object create (tipo de clase) {return super.create (type); } @Override Public Object Create (Tipo de clase, List <Class> ConstructorArGTypes, List <S Object> ConstructorArgs) {System.out.println ("Create - Type:" + Type.ToString ()); return super.create (type, constructorargTypes, constructorargs); } @Override public void setProperties (Properties Properties) {System.out.println ("setProperties - Properties:" + Properties.ToString () + ", SomeProperty:" + Properties.getProperty ("SomeProperty")); super.setProperties (propiedades); }}Agregar etiqueta ObjectFactory al archivo de configuración
<ObjectFactory type = "Liming.student.Manager.Configuration.limingObjectFactory"> <Property Name = "SomeProperty" Value = "100"/> </ObjectFactory>
2.6 complementos de complementos
MyBatis le permite interceptar llamadas ejecutadas por declaraciones mapeadas en cierto punto. Por defecto, MyBatis permite que los complementos intercepten llamadas del método:
Los detalles de los métodos en estas clases se pueden encontrar observando la firma de cada método, y su código fuente está disponible en el paquete de distribución myBatis. Debe comprender el comportamiento de sus métodos primordiales, suponiendo que esté haciendo más que monitorear las llamadas. Si intenta modificar o anular un método dado, puede romper el núcleo de MyBatis. Esta es una clase y método de bajo nivel, y debe usar complementos con precaución.
Usar complementos es la potencia muy simple que proporcionan. Implementación simple de la interfaz interceptor y determine la firma especificada que desea interceptar.
2.7 entornos
MyBatis se puede configurar con múltiples entornos. Esto puede ayudarlo a mapear SQL para corresponder a múltiples bases de datos, etc.
2.8 mapeador
Aquí hay una declaración que le dice a MyBatis dónde buscar el mapeo SQL. Puede usar la referencia de recursos en ClassPath o usar caracteres para ingresar la referencia de URL exacta.
Por ejemplo:
<mapper resource = "com/ganager/data/maps/usermapper.xml"/> <mapper resource = "com/ganager/data/maps/studentmapper.xml"/> <mapper resource = "com/ganager/data/maps/classmapper.xml"/> </mappers>