Las relaciones que aprendemos principalmente hoy son relaciones uno a uno y relaciones de uno a muchos.
1. Relación uno a uno
Vamos a explicarlo a través de ejemplos. (Una esposa corresponde a un esposo).
1) Información de la base de datos
Crear tabla T_wife (ID int primaria Key Auto_incement, wife_name varchar (), fk_husband_id int); Crear tabla t_husband (id int primaria key auto_incement, marido_name varchar ()); inserte en t_husband valores (nulo, 'hola'); insertar en t_wife (null, 'kitty',))
2) Código de Javabean correspondiente
Aunque solo hay una claves extranjeras configuradas por una parte en la base de datos, esta relación individual es una relación bidireccional.
Maridobean.java
paquete com.cy.mybatis.beans; import java.io.serializable;/*** one a uno*@author acer **/clase pública marido implementa serializable {private static final long serialversionUid = l; ID de entero privado; nombre de cadena privada Esposa esposa; esposa) {super (); this.id = id; this.name = name; this.wife = esposa;} Integer getId () {return id;} public void setid (integer id) {this.id = id;} public String getName () {return name;} public void setname (string name) {this.name = name;} getwean getName () {return;} public void setname (string name) {this.name; void setwife (esposa esposa) {this.wife = esposa;}@overridePublic string toString () {return "marido [id =" + id + ", name =" + name + ", esposa =" + esposa + "]";}} Esposabean.java
paquete com.cy.mybatis.beans; import java.io.Serializable;/*** One a One*@author acer **/public class WifeBeBean implementa serializable {private Static final long serialversionUid = l; ID de entero privado; nombre de cadena privada marido privado marido; marido) {super (); this.id = id; this.name = name; this.husband = marido;} Integer getId () {return id;} public void setid (integer id) {this.id = id;} public String String getName () {return name;} public void setName (string name) {this.name; marido;} public void sethusband (marido marido) {this.husband = marido;}@overridePublic string toString () {return "esposa [id =" + id + ", name =" name + ", marido =" + marido + "]";}} 3) A continuación, establezca dos interfaces, esposo y wifemapper.
Marido
paquete com.cy.mybatis.mapper; import com.cy.mybatis.beans.husbandbean; interface public sushMapper {/*** Información de marido de consulta basada en ID*@param id* @return*@throws excepción*/public marido seleccionado seleccionado por @Param Id*@throws @threes @threes @threws @threws* Marido SelecThusbandandwife (int id) arroja excepción;} 4) Definir el archivo maredmapper.xml
<? xml versión = "." encoding = "utf-"?> <! Doctype mapper público "-// mybatis.org/dtd mapper". "http://mybatis.org/dtd/mybatis ---mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.husbandmapper "> <resultmap type =" marido "id =" marido ywife "> <id" columna "Id" columna = "id" javatype = "java.lang.integer"/> <resultado propiedad = "name" column = "name" javatype = "java.lang.string"/> <!- asociación una asociación de tipo complejo; Muchos resultados se empaquetarán en este tipo de Asociación de Map de resultados integrados, o se refieren a una columna = "ID", la ID aquí se refiere a la ID de clave principal de la tabla T_wife. Esta esposa de consulta, por lo que hay un método en el mapeador de la esposa-> <asociación propiedad = "esposa" columna = "id" javatype = "wifeBean" select = "com.cy.mybatis.mapper.wifeMapper.selectwifeByhusbandid"> </asociación> </resultmap> <!-ResultType devuelve el nombre totalmente calificado o alias de la clase de la clase de la clase esperada de este estado de retorno. -> <select id = "selecThusbandById" resultType = "HidbeBean"> SELECT * de T_HUSBAND WHERE ID =#{ID} </select> <!-ResultMap Name References Externos ResultMap. Devuelve una colección. -> <select id = "selectthusbandandwife" resultmap = "marido ywife"> select * de t_husband donde id =#{id} </elect> </ mapper>Hay un método en wifeMapper.xml
<? xml versión = "." encoding = "utf-"?> <! Doctype mapper público "-// mybatis.org/dtd mapper". "http://mybatis.org/dtd/mybatis --mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.wifeMapper "> <select id =" selectwifeHusbandid "resultype =" esposa "> select * from t_wife donde fk_husband = # # #}}} </select/SELECT </SELECT </SELECT </SELECT </SELECT </SELECT </SELECTO </SELECT. </mapper>
5) Escribir una implementación
paquete com.cy.mybatis.service; import org.apache.ibatis.session.sqlsession; import com.cy.mybatis.beans.husbandbean; import com.cy.mybatis.mapper.husbandmapper; import com.cy.mybatis.tools.dbTools; public class Onetooneservice {Public stArt Void. args) {selecThusBandAndWife ();} private static void selECTHUSBandAndWife () {sqlSession session = dBTools.getSession (); marido de marido hm = session.getMapper (maridoMapper.class); try {marido de marido = hm.SelEcthusBandAndWife (); System.Println (sessing); Catch (Exception e) {E.PrintStackTrace ();}}} Nota: La clase de herramientas fue escrita en el capítulo anterior, que es bastante similar a la establecida de ayer.
Aviso:
MyBatis en realidad está operando en XML. Todos nuestros métodos se definen directamente en XML. Escribir una interfaz es simplemente ajustarse a nuestro pensamiento de tres capas. Si no escribe una interfaz, puede operar directamente los métodos en XML a través de la sesión.
Mientras haya métodos en XML, se puede usar, y el método de llamada es: Nombre del espacio de nombres+ Método;
Cuando se use a Resulttype para la excepción, asegúrese de asegurarse de que el nombre de su atributo sea el mismo que el nombre de campo;
Si no es lo mismo, use ResultMap.
2. Relación de uno a muchos
Vamos a explicarlo a través de ejemplos. (Un bloqueo corresponde a múltiples teclas).
2.1) No hay datos agregados aquí en la información de la base de datos, usamos Batch para agregar datos
Crear tabla T_Key (ID int primaria Key Auto_Increment, key_name varchar (), fk_lock_id int); Crear tabla t_lock (ID int primaria Key Auto_incement, Lock_Name varchar ());
2.2) Clase de entidad
KeyBean.java
paquete com.cy.mybatis.beans; import java.io.Serializable;/*** ManyToOne***/public class KeyBean implementa serializable {private static final long serialversionUid = l; ID de entero privado ID; llave de cadena privada; bloqueo de bloqueo privado; public Public Lock; public Public () {super ();} Public KeyBean (Integer Id, String Key, LockBean Lock; Public KeyBean; {super (); this.id = id; this.key = key; this.lock = Lock;} public Integer getId () {return id;} public void setid (ID de entero) {this.id = id;} public String getKey () {return key;} public void setKey (tecla de cadena) {this.key = key;} public lockbean getLock () {Lock de retorno;} LOCK) {this.lock = bloqueo;}@overRidePublic String toString () {return "keyBean [id =" + id + ", key =" + key + ", bloqueo =" + bloqueo + "]";}} LockBean.javapackage com.cy.mybatis.Beans; import java.iO.Serializable; import java.util.ToLIST; **/public class LockBean implementa serializable {private static final long serialversionUid = l; private entero ID; bloqueo de cadena privada; lista privada <KeyBean> Keys; public LockBean () {super ();} public Public LockBean (ID de Integer, String Lock, List <KeyBean Keys) {Super (); this.id = este.Lock = Lock = Lock = Locky getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLock() {return lock;}public void setLock(String lock) {this.lock = lock;}public List<KeyBean> getKeys() {return keys;}public void setKeys(List<KeyBean> keys) {this.keys = keys;}@Overridepublic String toString () {return "listbean [id =" + id + ", teclas =" + teclas + ", bloqueo =" + bloqueo + "]";}} 2.3) Establecer una interfaz
Keymapper.javapackage com.cy.mybatis.mapper; import java.util.list; import org.apache.ibatis.annotations.param; import com.cy.mybatis.beanss.keyBean; batchSaveKeys (@param ("Keys") List <KeyBean> Keys);} LockMapper.Javapackage com.cy.mybatis.mapper; import Org.apache.ibatis.annotations.param; import.cy.mybatis.Beanss.lockBean; interfaz de interfaz público {/*** Adding list* Savelock (@param ("Lock") LockBean Lock);/*** Consulte la información del bloqueo basada en el ID* @param id* @return*/public LockBean findLockByid (int id);/*** Consulta la información del bloqueo y la clave basada en el id* onemany* @param id* @return*/public lockbean findlockeys (inti);} 2.4) Crear un archivo XML
Kymapper.xml
<? xml versión = "." encoding = "utf-"?> <! Doctype mapper público "-// mybatis.org/dtd mapper". "http://mybatis.org/dtd/mybatis --mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.keymapper "> <resultmap id =" keyMap "type =" keybean "> <id" id "columna =" id "javatype =" java.lang.lang.lang.lang.lang " Propiedad = "Key" Column = "Key_Name" javatype = "java.lang.string"/> </lessmap> <!-La colección es un elemento utilizado para el recorrido (requerido), que admite matrices, lista, set-> <!-Elemento representa el alias cuando cada elemento en la colección está iterado. -> <!-El separador indica qué símbolo se usa como separador entre cada iteración. -> <insertar id = "batchSaveKeys"> Insertar en valores t_key <foreach Collection = "Keys" item = "Key" separator = ","> (null,#{key.key},#{key.lock.lock.id}) </foreach> </insert> <select id = "findkeySbylockid" resultMap = "keyMap"> select * de t_key where where where where where fkklock #{id} </select> </ mapper> listmapper.xml <? xml versión = "." encoding = "utf-"?> <! Doctype mapper público "-// mybatis.org/dtd mapper". "http://mybatis.org/dtd/mybatis --mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.lockmapper "> <!-Tipo de retorno personalizado-> <resultmap id =" Lockmap "type =" Lockbean "> <Id Property =" Id "columna =" Id "id" javatype = "java.lang.integer"/> <resultado propiedad = "bloqueo" columna = "list_name" javatype = "java.lang.string"/> <resultado Property = "Lock" columna = "Lock_Name" javatype = "java.lang.string"/> <Propiedad de colección = "Keys" columna = "Id" select = "com.cy.mybatis.mapper.KeyMapper.findkeySBylockid"> </colección> </resultadomap> <insertar id = "Savelock"> Insertar en t_lock valores (null, #{lister.lock}) </insertar> <select id = "findlockByid" resultMap = "Lockmap"> SELEC id = "findlockandkeys" resultMap = "LockandKeySmap"> SELECT * de t_lock donde id = #{id} </select> </mapper> 2.5) Implementación
paquete com.cy.mybatis.service; import java.util.arrayList; import java.util.list; importar org.apache.ibatis.session.sqlsession; import com.cy.mybatis.beans.keybean; import com.cy.mybatis.beans.lockbean; import.mybatis.mapper; com.cy.mybatis.mapper.lockmapper; import com.cy.mybatis.tools.dbtools; public class onetomanyService {public static void main (string [] args) {// savelock (); // batchSaveKeys (); findlockandkeys ();} private estático void findlockandkeys () {sqlsession session = dBTools.getSession (); LockMapper lm = session.getMapper (LockMapper.Class); LockBean Lock = LM.FindLockAys (); System.out.println (Lock);} DBTools.getSession (); LockMapper lm = session.getMapper (LockMapper.Class); keyMapper km = session.getMapper (keyMapper.class); LockBean Lock = lm.FindlockById (); List <KeyBean> Keys = NewAn KeyBean(null, "key"+i, lock);keys.add(key);}km.batchSaveKeys(keys);session.commit();}private static void saveLock() {SqlSession session = DBTools.getSession();LockMapper lm = session.getMapper(LockMapper.class);LockBean lock = new LockBean(null, "bloquear", nulo); lm.savelock (bloqueo); session.commit ();}} Los resultados muestran:
3. Operación por lotes y paginación
Aquí usaré el usuario del capítulo anterior y escribiré el código principal.
Primero defina el objeto de paginación.
paquete com.cy.mybatis.beans; import java.util.list;/*** Define un objeto de paginación** @autor**/public class Pager {private int pageno; // número de página actual private int pageTotal pageToTal; // total de página privada private private private Conjunto de datos devuelto public int getpageno () {return pageno;} public void setPageno (int pageno) {this.pageno = pageno;} public int getpageToTal () getRowStotal () {return RowStotal;} public void setRowStotal (int rowstotal) {this.rowstotal = rowstotal; pageTotal = rowstotal % pageSize ==? RowStotal / PageSize: RowStotal / Pagesize +;} public int getPagesize () {return Pagesize;} public void setPagesize (int pageSize) {this.pagesize = pageSize;} public lista de publicidad <?> getList () {Lista de retorno;} public void setList (list> list) {this.list = list;}@anebring (anebring ttingeT {return "Pager [Pageno =" + Pageno + ", PageToTal =" + PageTotal + ", RowStotal =" + RowStotal + ", PageSize =" + Pagesize + ", List =" + List + "]";}} Usermapper.Java Interface. paquete com.cy.mybatis.mapper; import java.util.list; import java.util.map; import org.apache.ibatis.annotations.param; import com.cy.mybatis.beans.userBean; interface pública usermapper {/*** add* @param user* @regreso* @throws excepción*/pública intencion Insertuser (@param ("User") UserBean User) lanza excepción;/*** use* @param user* @param id* @return* @throws excepción*/public int updateUser (@param ("u") userbean user, @param ("id") int id) lanza la excepción;/*** excepción* @param id* @@throws excepción*/public inteleteus (inti inti). Basado en ID* @param id* @return* @throws excepción*/public userBean selectUserByid (int id) lanza excepción;/*** Consulta Toda la información del usuario* @return* @throws Exception*/public List <Serebean> selectAllUser () lanza Exception;/*** Batch add* @param user* @return* @throws Exception*/public int batchinsertuser (@param ("usuarios") usuarios ") usuarios). Excepción;/*** Batch Eliminar* @param list* @return* @throws Exception*/public int BatchDeleteUser (@Param ("List") List <Steger> List) lanza Exception;/*** Paging Consuly Data* @Param* @Return* @throws Exception*/public List <SurerBean> Pageruser (Map <String> Object> Parmas Shows;/*** *** @throws Lista de excepción* @UserBean> Pageruser (Map <Caded> Object> Parmas Shougs;/*** *** @throws Lista de excepción* parma* @return* @throws excepción*/public int countuser (map <string, object> parmas) lanza excepción;} archivo xml <? xml versión = "." encoding = "utf-"?> <! Doctype mapper público "-// mybatis.org/dtd mapper". "http://mybatis.org/dtd/mybatis --mapper.dtd"><mapper namespace =" com.cy.mybatis.mapper.usermapper "> <!-set de resultados de retorno personalizado-> <resultado id =" usermap "type =" userbean "> <id" id "columna =" id "id" javatype = "java.lang.integer"> </id> <resultado propiedad = "username" column = "username" javatype = "java.lang.string"> </sul javatype = "java.lang.double"> </resultado> </ resultadomap> <!- El atributo de identificación en varias etiquetas debe ser el mismo que el nombre del método en la interfaz, y el valor del atributo de identificación debe ser único y no se puede reutilizar. La propiedad de ParametTerType especifica el tipo de parámetro utilizado al consultar, y la propiedad resultType especifica el tipo de conjunto de resultados devuelto por la consulta-> <!-UsarGeneratedKeys: (solo es útil para insertar) Esto le dice a MyBatis para usar el método de administración de datos de JDBC Generated Key a My Sqlserver). Valor predeterminado: falso. -> <!-KeyProperty: (Útil solo para insertar) Marque una propiedad. MyBatis establecerá su valor a través de GetGeneratedKeys o a través del elemento infantil de KeyKey de la instrucción Insertar. Valor predeterminado: no configurado. -> <!-#{} El contenido es un marcador de posición. Cuando el parámetro es un javabean, indica el valor de la propiedad del objeto de bean que se coloca-> <insertar id = "insertuser" useGeneratedKeys = "true" keyproperty = "user.id"> Insertar en t_user (username, contraseña, cuenta) valores (#{user.userNeName},#{user.password},#{{user.account} </insert </inserto id = "updateUser"> update t_user set username =#{u.username}, contraseña =#{u.password}, cuenta =#{u.account} where id =#{id} </port update> <deletete id = "deleteuser" parametertype = "int"> delete de t_user where id =#{id} </deletero " parametertype = "int" resultmap = "usermap"> select * de t_user donde id =#{id} </select> <select id = "selectAlluser" resultMap = "usermap"> select * de t_user </select> <!-Operaciones de lotes y etiquetas de Foreach-> <insert ID = "BatchinSer" Parametertype = "Java.Util. values <foreach collection="users" item="users" separator=",">(null,#{users.username},#{users.password},#{users.account})</foreach></insert><delete id="batchDeleteUser">delete from t_user where id in (<foreach collection="list" item="list" separator = ",">#{id} </stideach>) </elelete> <!-Collection es un elemento utilizado para recorrer (requerido), que soporta matrices, listas, set-> <!-Elemento representa el alias cuando cada elemento en el conjunto está iterado. -> <!-El separador representa qué símbolo se usa como separador entre cada iteración. -> <select id = "Pageruser" parametertype = "java.util.map" resultMap = "usermap"> select * de t_user where = <if test = "username! = null"> y nombre de usuario como '%$ {username}%' </if> limitar $ {índice}, $ {pageSize} </select> <select id = " parametertype = "java.util.map" resultType = "int"> select Count (*) de t_user where = <if test = "username! = null"> y nombre de usuario como '%$ {username}%' </if> </select> </mapper> #when generando sql, las cotizaciones se armarán para los parámetros de tipo de caracteres. $ Al generar SQL, las cotizaciones no se ensamblarán. Se puede utilizar para las clases de prueba de ensamblaje de parámetros como el orden por paquete com.cy.mybatis.service; import java.util.arrayList; import java.util.hashmap; import java.util.list; import java.util.map; import org.apache.ibatis.session.sqlsession; import; importar; import com.cy.mybatis.beans.userbean; import com.cy.mybatis.tools.dbtools; import com.cy.mybatis.mapper.usermapper; public class userservice {/*** @param*/public static void main (string [] args) {// insertuser (); // deleteuser (); selectUserById (); // selectAllUser (); // batchInsertUser (); // batchDeleteUser (); // countUser (); PagerUser ();} private static void countUser () {sqlSession session = dBTools.getSession (); usermapper mapper = session.getMapper (usermapper.class); new HashMap <String, Object> (); params.put ("UserName", "Kitty"); int index =; params.put ("index", index); // de qué página se inicia. mySQL comienza con params.put ("pageSize",); // El número de tiras de datos mostradas por página int County; try {count = mApper.Countuser (params); system.out.println (count);} capt (excepción e) {e.printtArtace ();}} private estatic estatic bageruser () {sqlSession session session = = DBTools.getSession (); usermapper mapper = session.getMapper (usermapper.class); map <string, object> params = new Hashmap <String, object> (); params.put ("username", "kitty"); params.put ("index",); // de qué página. mySQL comienza con params.put ("pageSize",); // El número de tiras de datos mostradas por página prueba {list <serebean> u = mapper.pageruser (params); para (UserBean UserBean: U) {System.out.println ("----------"+UserBean);}} Catch (Exception e) {E.PrintStackTrace ();}} privado estático void batchDeleteUser () {sqlsession session = dBTools.getSession (); usermapper mApper = session.getMapper (usermapper.class); list <Integer> ids = new ArrayList <Integer> (); for (int i =; i <; i ++) {id.add (i);} try {mapper.batchDeleteUser (ids); session.commit ();} Catch (excepción) {E.PRINTSTSTSTACE (); batchInsertUser() {SqlSession session = DBTools.getSession();UserMapper mapper = session.getMapper(UserMapper.class);List<UserBean> users = new ArrayList<UserBean>();for(int i = ; i < ; i ++){UserBean user = new UserBean("kitty"+i, "", .); ussers.add (user);} try {mApper.batchinsertuser (ussers); session.commit ();} catch (excepción e) {E.PrintStacktrace ();}}/*** Nuevo usuario*/private static void insertuser () {sqlSession session = dBTools.getSession (); usermapper mapperper = = session.getMapper (usermapper.class); userBean user = new UserBean ("yi", "",.); try {mapper.insertuser (user); system.out.println (user.toString ()); session.commit ();} Catch (excepción e) {E.PrintStArtTrace (); session.Rollback ();} static void deleteUser () {sqlSession session = dBTools.getSession (); usermapper mapper = session.getMapper (usermapper.class); try {mapper.deleteUser (); session.commit ();} capt (excepción) {E.PrintStackTrace (); session.rollback ();}}/*** data de datos) void updateUser () {sqlsession session = dBTools.getSession (); usermapper mapper = session.getMapper (usermapper.class); userBean user = new UserBean ("xiao ming", "",.); try {mapper.UpdateUser (user,); session.commit ();} catch (excepción e) {e.printStackTrace();session.rollback();}}/*** Query user by id*/private static void selectUserById(){SqlSession session=DBTools.getSession();UserMapper mapper=session.getMapper(UserMapper.class);try {UserBean user= mApper.SelectUserById (); System.out.println (user.ToString ()); session.ComMit ();} Catch (Exception e) {E.PrintStackTrace (); session.rollback ();}}/*** Query Todos los usuarios*/privado void void selectAllUser () {sqlSsession session = dBtOolss.getsession (); mApper = session.getMapper (usermapper.class); intente {list <sererBean> user = mApper.Selectalluser (); System.out.println (user.ToString ()); session.commit ();} Catch (Exception e) {E.PrintStackTrace (); session.rollback ();}}}} Eche un vistazo al proyecto general:
¡Todo necesita ser persistido!