Os relacionamentos que aprendemos principalmente hoje são relacionamentos individuais e relacionamentos individuais.
1. Relacionamento individual
Vamos explicar através de exemplos. (Uma esposa corresponde a um marido).
1) Informações do banco de dados
Crie Tabela T_Wife (ID int Primária Chave Auto_increment, wide_name varchar (), fk_husband_id int); crie tabela t_husband (id int a chave primária Auto_increment, marido_name varchar ();
2) Código Javabean correspondente
Embora existam apenas uma chave estrangeira configurada por uma parte no banco de dados, esse relacionamento individual é um relacionamento de mão dupla.
HusbandBean.Java
pacote com.cy.mybatis.beans; importar java.io.Serializable;/*** um a um*@author Acer **/public class Hardeban implementa serializável {private static final stroubanversionuid = l; private INTEGER ID; nomes privados de string privada;}}), o nome da esposa privado; {super (); this.id = id; this.name = name; this.wife = wife;} public integer getId () {return id;} public void setId (inteiro id) {this.id = id;} public string getName () {retorna nome;} public void setName (string name) {isto Setwife (esposa de esposa) {this.wife = wife;}@substituir string tostring string () {return "marido [id =" + id + ", name =" + name + ", wife =" + wife + "] Wifebean.java
pacote com.cy.mybatis.beans; importar java.io.Serializable;/*** um a um*@author Acer **/public class Wifebean implementa seriizável {private static final serialversionUid = l; private INTEGER ID; private string nomes;) nomes privados de marido; {super (); this.id = id; this.name = name; this.husband = harth;} public integer getId () {return id;} public void setId (Inteiro ID) {this.id = id;} public string getName () {return name;} public void setName (string name) { Void Sethusband (marido do marido) {this.husband = marido;}@SubstridePublic string tostring () {return "wife [id =" + id + ", nome =" + name + ", marido =" + marido + "]";}}} 3) Em seguida, estabeleça duas interfaces, Huschapper e Wifemapper.
Buschapper
pacote com.cy.mybatis.mapper; import com.cy.mybatis.beans.husbandBean; interface pública Hardenhappper {/*** Informações do marido do marido com base em id*@param id* @return*@THURSCECTIONSTH*/public harthBean SelecthusbandbyId (int id) throws Exception; **l e **s harmer e hombean selecthusbandbyid (int) throws Exception; *** e **s e o marido e o marido e o marido e o marido e o marido e o marido e o marido e o hrothban e o marido e o hrothban hrothBean selecthusbandbyid (int) throws Exception; SelecthusbandAndWife (int id) lança exceção;} 4) Defina o arquivo blekspapper.xml
<? xml versão = "." coding = "utf-"?> <! Doctype Mapper Public "-// mybatis.org/dtd mapper." "http://mybatis.org/dtd/mybatis--mapper.dtd"> namespace (" com.cy.mybatis.mapper.husbandmapper "> <resultado propriedade = "name" colun = "name" javatype = "java.lang.string"/> <!- associação uma associação complexa; Muitos resultados serão empacotados nesse tipo de associação do mapa de resultados incorporados ou consulte uma coluna = "id" o id aqui refere -se ao ID da chave primária da tabela T_WIFE. Esta consulta esposa, então existe um método no mapeador da esposa-> <Association Property = "wife" column = "id" javatype = "wifebean" select = "com.cy.mybatis.mapper.wifemapper.selectwifebyhusbandid"> </association> </resultado> <!-resulteTeTeTeTeNefiSek Names ou o nome da qualidade "> </siSulMap> <!-resulteTeTETENSENIFICADO O nome da qualidade"> -> <select id = "SelecthusbandbyId" resultType = "HusbandBean"> Selecione * FROM T_HUSBAND WHERE ID =#{id} </select> <!-ResultMap Name REFERÊNCIAS RESULTMAP EXTERNAL. Retorna uma coleção. -> <select id = "SelecthusbandAndWife" resultmap = "harguendwife"> selecione * de t_husband onde id =#{id} </leclect> </mapper>Existe um método em wifemapper.xml
<? xml versão = "." coding = "utf-"?> <! Doctype Mapper Public "-// mybatis.org/dtd mapper." "http://mybatis.org/dtd/mybatis--mapper.dtd"> namespace (" com.cy.mybatis.mapper.wifemapper "> <SELECT ID =" SelectWifeByHusbandid "Result =" WomeBean "> select * de t_wwwife </mapper> 5) Escreva uma implementação
pacote com.cy.mybatis.service; importar org.apache.ibatis.session.sqlSession; importar com.cy.mybatis.beans.husbandbean; import com.cy.mybatis.mapper.husbandmapper; a classe combatis.mySets.MathTools.mapper.Mapper.HUSPAPPER; {selecthusbanda ewife ();} private estático void selecthusbandAndWife () {SqlSession Session = dbtools.getSession (); harkmapper hm = session.getmapper (harkmapper.class); try {hombean hush hro marido (hlothechusbandwife (); {E.PrintStackTrace ();}}} Nota: A classe de ferramentas foi escrita no capítulo anterior, que é bastante semelhante ao estabelecido de ontem.
Perceber:
Mybatis está realmente operando no XML. Todos os nossos métodos são definidos diretamente em XML. Escrever uma interface é apenas para se conformar melhor ao nosso pensamento de três camadas. Se você não escrever uma interface, poderá operar diretamente os métodos no XML através da sessão.
Enquanto houver métodos no XML, ele pode ser usado, e o método de chamada é: namespace+ nome do método;
Ao usar o ResultType para exceção, verifique se o nome do seu atributo é o mesmo que o nome do campo;
Se não for o mesmo, use o ResultMap.
2. Relacionamento individual
Vamos explicar através de exemplos. (Um bloqueio corresponde a várias teclas).
2.1) Não há dados adicionados aqui nas informações do banco de dados, usamos lote para adicionar dados
Criar tabela T_KEY (ID int Primária Chave Auto_increment, key_name varchar (), fk_lock_id int); Criar tabela T_LOCK (ID int Primária Chave Auto_increment, Lock_name Varchar ());
2.2) Classe de entidade
Keybean.java
pacote com.cy.mybatis.beans; importar java.io.Serializable;/*** MUITOOONE***/classe pública Keybean implementa serializável {private estático final serialversionUid = l; teclado de lock de private; {super (); this.id = id; this.Key = key; this.lock = Lock;} public integer getId () {return id;} public void setId (IDEGER ID) {this.id = id;} public string getKey () {return Key;} public SetKey (string) {this.key; setLock (LockBean Lock) {this.lock = Lock;}@SubstridePublic String tostring () {return "KeyBean [id =" + id + ", key =" + key + ", Lock =" Lock + "]";}} LockBean.javapackage com.cy.mybatis.bans; java.util.list;/*** OneTomany***/classe pública LockBean implementa serializável {private estático final serialversionuid = l; ID inteiro privado; LOCK privado; id; this.lock = Lock; this.Keys = keys;} public integer getId () {return id;} public void setId (IDE mais inteiro) {this.id = id;} public string getLock () {return bloquen;} public void setLock (string bloqueio) {this.lock = lock; SetKeys (list <KeyBean> chaves) {this.keys = keys;}@SubstridePublic string tostring () {return 2.3) estabelecer uma interface
Keymapper.javapackage com.cy.mybatis.mapper; importar java.util.list; importar org.apache.ibatis.annotações.param; importar com.cy.mybatis.beans.keybean; interface pública keymapper keymapper @teclas Add inatch* @Return* It é recomendado BatchSaveKeys (@Param ("Keys") Lista <KeyBean> keys);} LockMapper.javapackage com.cy.mybatis.mapper; importar org.apache.ibatis.annotações.param; importar; savelock (@param ("bloqueio") bloqueio de bloqueio);/*** consulte as informações do bloqueio com base no id* @param id* @return*/public LockBean findLockById (int id);/*** consulte as informações do bloqueio e da chave com base no id* onemany* @param id* @return*/public »Locklandkys 2.4) Crie um arquivo XML
Keymapper.xml
<? xml versão = "." coding = "utf-"?> <! Doctype Mapper Public "-// mybatis.org/dtd mapper." "http://mybatis.org/dtd/mybatis--mapper.dtd"> namespaceapper =" com.cy.mybatis.mapper.keymapper "> <resultmap id =" keyMap "type =" keybean "> <idapriche =" id "column =" id = "javypy" javat) Property = "key" colun = "key_name" javatype = "java.lang.string"/> </resultMap> <!-coleção é um elemento usado para Traversal (necessário), matrizes de suporte, listar, definir-> <!-o item representa o alias quando cada elemento da coleção é iterado. -> <!-O separador indica qual símbolo é usado como separador entre cada iteração. -> <insert id = "batchSaveKeys"> inserir nos valores t_key <foreach collection = "keys" item = "key" separator = ","> (null,#{key.key},#{key.lock.id}) </foreach> </insert> <select id = "findKeyslid "map }map =) #{id} </leclect> </mapper> lockmapper.xml <? xml versão = ". coding = "utf-"?> <! Doctype Mapper Public "-// mybatis.org/dtd mapper." "http://mybatis.org/dtd/mybatis--mapper.dtd"> namespace) javatype = "java.lang.integer"/> <resultado de propriedade = "bloqueio" column = "lock_name" javatype = "java.lang.string"/> <result Property = "Lock" column = "Lock_name" javatype = "java.lang.string"/> <coleção = "Keys" select = "com.cy.mybatis.mapper.keymapper.findkeysbylockid"> </coletor ass 2.5) implementação
pacote com.cy.mybatis.service; importar java.util.ArrayList; importar java.util.list; importar org.apache.ibatis.session.sqlSession; importAtAtAtatis.mybatis.beans.KeyBean; com.cy.mybatis.mapper.lockmapper; importar com.cy.mybatis.tools.dbtools; classe pública OneTomanyService {public static void main (string [] args) {// savelock (); // lotekeys (); findLockandKeys ();} private estático void findLockandKeys () {SqlSession Session = dBtools.getSession (); Lockmapper lm = session.getMapper (LockMapper.class); LockBean Lock = lm.findlockandKeys (); 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 = new Arraylist <KeyBean> (); para (int i =; "key"+i, bloqueio); keys.add (key);} km.batchSaveKeys (keys); session.Commit ();} private estático void savelock () {sqlSession Session = DBTOOLS.GetSession (); Lockmapper lm = session.Getmapper (Locksl); null); lm.savelock (bloqueio); session.Commit ();}} Os resultados mostram:
3. Operação em lote e paginação
Aqui vou usar o usuário do capítulo anterior e escreverei o código principal.
Primeiro defina o objeto de paginação.
pacote com.cy.mybatis.beans; importar java.util.list;/*** Defina um objeto de paginação** @autor**/public class Pager {private int pageno; // número atual de página privada int pagetotal PagEtotal; // número de página total private int rowstotal; // Número total de insultos privados; int getPageno () {retorna pageno;} public void setPageno (int pageno) {this.pageno = pageno;} public int getPageTotal () {retorna pagetotal;} public void setPagetotal (inteiro) {this.Pagettal = Pagettal; 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;@list public list <? tostring () {return "pager [pageno =" + pageno + ", pagetotal =" + pagetotal + ", rowstotal =" + rowstotal + ", PageSize =" + PageSize + ", List =" + list + "]; package com.cy.mybatis.mapper;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.Param;import com.cy.mybatis.beans.UserBean;public interface UserMapper {/*** Add * @param user* @return* @throws Exception*/public int insertUser(@Param("user")UserBean Usuário) lança Exception;/*** Use* @param Usuário* @param id* @return* @throws Exception*/public int updateUser (@param ("u") usuário userbean, @param ("id") int id) lança excepção;/*** Exception* @param id* @retornar* @throws exceção*/public int Deleteer (int id) Exceção*/User Public UserBean SelectUSerById (Int ID) lança Exceção;/*** Consulta todas as informações do usuário* @return* @throws Exception*/public List <UserBean> SelectAllUser () lança exceção;/*** Batch ADD* @PARAM User* @Return* Usuário Excepção*/public int BatchinsertUser (@Param ("Users") @return* @Throws Exception*/public int batchDeleteUser (@param ("list") List <Teger> List) lança exceção;/*** Dados de consulta de paginação* @param parma* @return* @throws excepção*/list public <userBean> statists> PagerUser (map <string> parquemmas) throws; CountUser (mapa <string, objeto> parmas) lança exceção;} arquivo xml <? xml versão = "." coding = "utf-"?> <! Doctype Mapper Public "-// mybatis.org/dtd mapper." "http://mybatis.org/dtd/mybatis--mapper.dtd"> namespace (" com.cy.mybatis.mapper.userMapper "> <!-conjunto de resultados de retorno personalizado-> <resultmap id =" userMap "type =" userBean "> <idmOd propriedades =" "" javatype = "java.lang.integer"> </id> <result Property = "UserName" column = "UserName" javatype = "java.lang.string"> </resultado> <Result Property = "senha" Column = "senha" Javatype = "java.lang.string"> </result> <sturt> <seld> <seld> <seld> <steril) javatype = "java.lang.double"> </resultado> </resultMap> <!- O atributo ID em várias tags deve ser o mesmo que o nome do método na interface, e o valor do atributo de identificação deve ser único e não pode ser reutilizado. The parameterType property specifies the parameter type used when querying, and the resultType property specifies the result set type returned by the query --> <!-- useGeneratedKeys: (It is only useful for insert) This tells MyBatis to use the JDBC's getGeneratedKeys method to retrieve the primary key generated internally by data (for example, the auto-increment field of database management systems like MySQL and SQLSERVER). Valor padrão: false. -> <!-KeyProperty: (útil apenas para inserir) Marque uma propriedade. Mybatis definirá seu valor através do GetGenerated Keys ou através do elemento filho selecionKey da instrução Insert. Padrão: não definido. -> <!-#{} conteúdo é um espaço reservado. Quando o parâmetro é um Javabean, indica o valor da propriedade do objeto Bean que é colocado-> <insert id = "insertUser" useGeneratedKeys = "true" keyProperty = "user.id"> inserir em t_user (usuário, senha, senha) (#{{#Username},#{{UserName. id = "updateUser"> atualizar t_user defina nome de usuário =#{u.username}, senha =#{u.password}, conta =#{u.Account} onde id =#{id} </update> <delete id = "DELETEUSER" parameterType = "int/"> DeLete de t_User Where Where ParameterType = "int" resultmap = "userMap"> selecione * de t_user onde id =#{id} </select> <select = "selectalluser" resultmap = "userMap"> selecione * de t_USerSerTer </select> <!-Batch Operations e for paraach tags-> <nsert Id = "BatchSerTer" " T_USER VALORES <foreach collection = "usuários" item = "usuários" separator = ","> (null,#{users.username},#{users.password},#{users.account}) </foreach> </insert> <delete id = "batchdEleteUser"> deLETE de t_ers idé onde idi (batchdEleteUser ") </foreach> </insert> <delete Id =" batchdeleteUser "> deLete de t _Uer" where wheren wheren wheren wheren whest wheren wheren wheren wheren wheren where (odeeech (batchdeleteUser ") </foreach> </insert> <delete id =" batchdeleteuser "> deLete de t _Ur. separador = ",">#{id} </foueach>) </lete> <!-A coleção é um elemento usado para Traversal (necessário), suportando matrizes, listar, definir-> <!-Item representa o alias quando cada elemento no conjunto é iterado. -> <!-O separador representa que símbolo é usado como separador entre cada iteração. -> <select id = "pageruser" parametertype = "java.util.map" resultmap = "userMap"> selecione * de t_user where = <se test = "nome de usuário! = null"> e username como '%$ {username}%' </if> limite $ {}, $ {} ParameterType = "java.util.map" resultType = "int"> Selecione a contagem (*) de t_user where = <se test = "nome de usuário! = null"> e nome de usuário como '%$ {userName}%' </if> </select> <//tipo de geração de sql. $ Ao gerar SQL, as cotações não serão montadas. Pode ser usado para classes de teste de montagem de parâmetros, como a ordem pelo pacote com.cy.mybatis.service; importar java.util.ArrayList; importar java.util.hashmap; importar java.util.list; importar java.util.map; importar org.apache.ibatis.sess.Sess.Sess.Sess; com.cy.mybatis.beans.userbean; importar com.cy.mybatis.tools.dbtools; importar com.cy.mybatis.mapper.userMapper; public class UserService {/*** @param args*/public static void main (string []) (// inserTer; selectUserById (); // selectAllUser (); // BatchInsertUser (); // BatchDeleteUser (); // CountUser (); PagerUser ();} private static void CountUser () {SQLSession Session = DBTool.GETSession (); USERMAPPERSER () {SQLSession Hashmap <string, object> (); params.put ("nome de usuário", "kitty"); int index =; params.put ("index", index); // de qual página iniciar. mySQL começa com params.put ("Pagesize",); // o número de tiras de dados exibidas por página int condado; tente {count = mapper.countuser (params); system.out.println (count);} catch (exceção e) {e.printstacktrace ();}}} spogers spogers () {) {e.printstack ();}}} spogers spogers () {) {e.printstack ();}}} spogers spogers () {) {e.pracktrace ();}}} spogers spogers () {) {e.printstack ();}}} spogers spogers () {) {E.PrintSack ();}} spogers spogers) mapper = session.getMapper (userMapper.class); map <string, object> params = new hashmap <string, object> (); params.put ("nome de usuário", "kitty"); params.put ("index",); // da qual página. O MySQL começa com params.put ("Pagesize",); // o número de tiras de dados exibidas por página, tente {list <userBean> u = mapper.pagerUser (params); para (UserBean UserBean: u) {System.out.println ("----------"+UserBean);}} Catch (Exceção e) {e.printStackTrace ();}} private static void BatchDeleteUser () {sqlSession. ids = new ArrayList <Teger> (); para (int i =; i <; i ++) {ids.add (i);} tente {mapper.batchDeleteUser (ids); session.commit ();} catch (exceção e) {ePrintStackTrace ();}}) Dbtools.getSession (); UserMerpApper Mapper = session.GetMapper (UserMApper.Class); List <UserBean> Users = new ArrayList <SuserBean> (); para (int i =; i <; i ++) {userBean user = userBean ("kitty"+ury ",.); {mapper.batchinsertUser (usuários); session.Commit ();} Catch (Exceção e) {e.printStackTrace ();}}/*** novo usuário*/private static void insertUser () {sqlSession Session = dbtools.getSession (); usapper () {sqlSession = dbTools.getSession (); usapper = sesspapper = Sesspapper = (sqlSession (userBeanSpper. "",.); tente {mapper.insertUser (usuário); system.out.println (user.toString ()); session.Commit ();} Catch (Exceção e) {e.printStackTrace (); session.rollback ();}}/*** delete user*/private sporats DeleUSer. session = dBtools.getSession (); UserMApper Mapper = session.GetMapper (UserMApper.Class); Try {Mappper.DeleteUser (); session.Commit ();} Catch (Exceção e) {e.printStackTrace (); Sesst.Rollback ();}}/*** Modify Datas*/private (); session = dBtools.getSession (); UserMApper Mapper = session.GetMapper (UserMApper.class); UserBean User = new UserBean ("Xiao Ming", "" ,.); Try {Mapper.UpDateUser (User,); Session.Commit ();} Catch (Exception e) {E.PrinTrace (E.Prace); id*/private estático void selectUSerById () {SQLSession Session = dBtools.getSession (); UsermApper Mapper = session.getMapper (userMApper.class); tente {userBean user = mapper.SelectUserById (); System.out.println (user.tostring ();); {E.PrintStackTrace (); session.rollback ();}}/*** Consulta todos os usuários*/private estático void selectAllUser () {SqlSession Session = DBTOOLS.GetSession (); UserMApper Mapper = session.getmapper (UsermApper.class); Try {List <UserBean> user = mapper.SelectallUser (); System.out.println (user.toString ()); session.Commit ();} Catch (Exceção e) {e.printStackTrace (); session.rollback ();}}} Dê uma olhada no projeto geral:
Tudo precisa ser persistido!