Mybatis框架中的注解应用之关系映射
使用开发工具:mysql +IDEA
MyBatis实例:
目录结构
一:先导依赖,导入mysql和mybatis的jar包
<!-- Mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> </dependency>
<!--MyBatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId <version>3.4.5</version> </dependency>
二:创建并配置MyBatis的配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <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="123456"/> </dataSource> </environment> </environments>
<mappers> <!-- xml映射 --> <!--<mapper resource="com/entity/Person.xml"/>--> <!-- PersonDao注解 --> <mapper class="com.dao.PersonDao"/> <!-- 用户配置 --> <mapper resource="com/entity/usera.xml"/> <!-- 角色配置 --> <mapper resource="com/entity/roles.xml"/> </mappers>
</configuration>三:写实体类
1.一对一映射
Person表和Card表一对一(实体类)
Person实体类
package com.entity; public class Person{ private int pid; //编号 private String pname; //名字 private int page; //年龄 private Card card; public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } public Person() { } public Person(int pid, String pname, int page) { this.pid = pid; this.pname = pname; this.page = page; } //get和set方法 public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } @Override public String toString() { return "Person{" + "pid=" + pid + ", pname='" + pname + '\'' + ", page=" + page + '}'; } }
Card实体类
package com.entity; public class Card { private int cid; //编号 private String cnum; //身份证号码 public Card() { } public Card(int cid, String cnum) { this.cid = cid; this.cnum = cnum; } //get和set方法 public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getCnum() { return cnum; } public void setCnum(String cnum) { this.cnum = cnum; } @Override public String toString() { return "Card{" + "cid=" + cid + ", cnum='" + cnum + '\'' + '}'; } }
四:在映射文件中实现关系映射操作
Person.xml
<?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.dao.PersonDao"> <resultMap id="myPersonMap" type="com.entity.Person"> <id property="pid" column="pid"></id> <result property="pname" column="pname"></result> <result property="page" column="page"></result> <association property="card" javaType="com.entity.Card"> <id property="cid" column="cid"></id> <result property="cnum" column="cnum"></result> </association> </resultMap> <!-- 一对一关系映射 --> <select id="getPersonAndCardById" parameterType="int" resultMap="myPersonMap"> select p.*,c.cnum from person p,card c where p.uid = c.uid and p.pid=#{0} </select>
</mapper>
五:实现数据
package com.test; import com.dao.PersonDao; import com.dao.RolesDao; import com.dao.UseraDao; import com.entity.Roles; import com.entity.Usera; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.util.List; public class TestMyBatis { @Test public void testSelect(){ //读取配置文件 //获取SqlsessionFactory对象 try { SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); //通过sessionFactory获得Sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); PersonDao personDao=sqlSession.getMapper(PersonDao.class); //一对一 Person person = personDao.getPersonAndCardById(1); System.out.println(person); System.out.println(person.getCard().getCnum());
调用Dao的一对一方法:
先写dao的接口:
package com.dao; import com.entity.Person; import com.entity.Province; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Set; public interface PersonDao {
//查询getPersonAndCardByIdy一对一 public Person getPersonAndCardById(int pid);
}
}
运行结果如下:
2. 一对多映射
一:写实体类Province表和City表一对多(实体类)
Province表
package com.entity; import java.util.Set; public class Province { private int pid; //编号 private String pname; //省份名 private Set<City> cities; public Set<City> getCities() { return cities; } public void setCities(Set<City> cities) { this.cities = cities; } public Province() { } public Province(int pid, String pname) { this.pid = pid; this.pname = pname; } //get和set方法 public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; }
@Override public String toString() { return "Province{" + "pid=" + pid + ", pname='" + pname + '\'' + '}'; } }City表
package com.entity; public class City { private int cid; //编号 private String cname; //市 private int pid; //编号 public City() { } public City(int cid, String cname, int pid) { this.cid = cid; this.cname = cname; this.pid = pid; } //get和set方法 public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } }
二:在映射文件中实现关系映射操作
Person.xml
<?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.dao.PersonDao"> <resultMap id="myPersonMap" type="com.entity.Person"> <id property="pid" column="pid"></id> <result property="pname" column="pname"></result> <result property="page" column="page"></result> <association property="card" javaType="com.entity.Card"> <id property="cid" column="cid"></id> <result property="cnum" column="cnum"></result> </association> </resultMap> <!-- 一对一关系映射 --> <select id="getPersonAndCardById" parameterType="int" resultMap="myPersonMap"> select p.*,c.cnum from person p,card c where p.uid = c.uid and p.pid=#{0} </select>
<resultMap id="myProvinceMap" type="com.entity.Province"> <id property="pid" column="pid"></id> <result property="pname" column="pname"></result> <collection property="cities" ofType="com.entity.City"> <id property="cid" column="cid"></id> <result property="cname" column="cname"></result>
<!-- 一对多关系映射 --> <select id="getProvinceAndCityByid" parameterType="int" resultMap="myProvinceMap"> select p.*,c.cname from province p,city c where p.pid and p.pid=#{pid} </select>
</collection> </resultMap>
三:实现数据
package com.test; import com.dao.PersonDao; import com.dao.RolesDao; import com.dao.UseraDao; import com.entity.Roles; import com.entity.Usera; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.util.List; public class TestMyBatis { @Test public void testSelect(){ //读取配置文件 //获取SqlsessionFactory对象 try { SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); //通过sessionFactory获得Sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); PersonDao personDao=sqlSession.getMapper(PersonDao.class); //一对一 Person person = personDao.getPersonAndCardById(1); System.out.println(person); System.out.println(person.getCard().getCnum());
//一对多 Province province = personDao.getProvinceAndCityByid(1);
for (City city : province.getCities()) { System.out.println(city.getCname()); }
调用Dao的一对多方法:
先写dao的接口:
package com.dao; import com.entity.Person; import com.entity.Province; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Set; public interface PersonDao {
//查询getPersonAndCardByIdy一对一 public Person getPersonAndCardById(int pid);
//查询getProvinceAndCityByid一对多 public Set<Province> getProvinceAndCityByid(int pid);
}
}
运行结果如下:
3. 多对多映射
一:写实体类Usera用户表和Roles角色表以及U_R关系表多对多(实体类)
Usera用户表
package com.entity; import java.util.Set; public class Usera { private int uid; private String uname; //多对多关系 private Set<Roles> roles; public Set<Roles> getRoles() { return roles; } public void setRoles(Set<Roles> roles) { this.roles = roles; } public Usera(){ } //get和set方法 public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; }
}
Roles角色表
package com.entity; import java.util.Set; public class Roles { private int rid; private String rname; //多对多关系 private Set<Usera> usera; public Roles() { } //get和set方法 public int getRid() { return rid; } public void setRid(int rid) { this.rid = rid; } public String getRname() { return rname; } public void setRname(String rname) { this.rname = rname; } public Roles(Set<Usera> usera) { this.usera = usera; } }
U_R关系表
package com.entity; public class u_r { private Usera usera; private Roles roles; public u_r(){ } //get和set方法 public Usera getUsera() { return usera; } public void setUsera(Usera usera) { this.usera = usera; } public Roles getRoles() { return roles; } public void setRoles(Roles roles) { this.roles = roles; } }
二:在映射文件中实现关系映射操作Usera.xml用户表
<?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.dao.UseraDao"> <resultMap type="com.entity.Usera" id="useraMap"> <id property="uid" column="uid" /> <result property="uname" column="uname" /> </resultMap> <resultMap type="com.entity.Usera" id="useraRolesMap" extends="useraMap"> <collection property="roles" ofType="com.entity.Roles"> <id property="rid" column="rid" /> <result property="rname" column="rname" /> </collection> </resultMap> <select id="selectAllUser" resultMap="useraMap"> select * from usera </select> <select id="selectuseraRoles" parameterType="int" resultMap="useraRolesMap"> select u.uid,u.uname,r.rid,r.rname from users u left join u_r ur on u.uid=ur.uid left join roles r on ur.rid=r.rid where u.uid =#{uid} </select> </mapper>
Roles.xml角色表
<?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.dao.RolesDao"> <resultMap type="com.entity.Roles" id="rolesMap"> <id property="rid" column="rid" /> <result property="rname" column="rname" /> </resultMap> <resultMap type="com.entity.Roles" id="rolesUseraMap" extends="rolesMap"> <collection property="usera" ofType="com.entity.Usera"> <id property="uid" column="uid" /> <result property="uname" column="uname" /> </collection> </resultMap> <select id="selectAllRoles" resultMap="rolesMap"> select * from roles </select> </mapper>
三:实现数据以及运行结果如下:
package com.test; import com.dao.PersonDao; import com.dao.RolesDao; import com.dao.UseraDao; import com.entity.Roles; import com.entity.Usera; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.util.List; public class TestMyBatis { @Test public void testSelect(){ //读取配置文件 //获取SqlsessionFactory对象 try { SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); //通过sessionFactory获得Sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); PersonDao personDao=sqlSession.getMapper(PersonDao.class); //一对一 Person person = personDao.getPersonAndCardById(1); System.out.println(person); System.out.println(person.getCard().getCnum());
//一对多 Province province = personDao.getProvinceAndCityByid(1);
for (City city : province.getCities()) { System.out.println(city.getCname());
//多对多: //用户 UseraDao useraDao=sqlSession.getMapper(UseraDao.class); List<Usera> us=useraDao.selectuseraRoles(1);
for (Usera usera : us) { System.out.println(usera.getUname()); for (Roles roles : usera.getRoles()) { System.out.println(roles.getRname()); } }
//角色 RolesDao rolesDao=sqlSession.getMapper(RolesDao.class); List<Roles> ro=rolesDao.selectAllRoles(); for (Roles roles : ro) { System.out.println(roles.getRname()); }
调用Dao的注解方法:
先写dao的接口:
注解一对一和一对多
package com.dao; import com.entity.Person; import com.entity.Province; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Set; public interface PersonDao { //查询getPersonAndCardByIdy一对一 @Select("select * from person where pid = #{pid}") public Person getPersonAndCardById(int pid); //查询getProvinceAndCityByid一对多 @Select("select * from province") public Set<Province> getProvinceAndCityByid(int pid); }
实现数据以及运行结果如下:
package com.test; import com.dao.PersonDao; import com.dao.RolesDao; import com.dao.UseraDao; import com.entity.Roles; import com.entity.Usera; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.util.List; public class TestMyBatis { @Test public void testSelect(){ //读取配置文件 //获取SqlsessionFactory对象 try { SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); //通过sessionFactory获得Sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); PersonDao personDao=sqlSession.getMapper(PersonDao.class); //一对一 // Person person = personDao.getPersonAndCardById(1); // System.out.println(person); // System.out.println(person.getCard().getCnum());
//一对多 // Province province = personDao.getProvinceAndCityByid(1);
// for (City city : province.getCities()) { // System.out.println(city.getCname());
//多对多: //用户 UseraDao useraDao=sqlSession.getMapper(UseraDao.class); List<Usera> us=useraDao.selectuseraRoles(1);
for (Usera usera : us) { System.out.println(usera.getUname()); for (Roles roles : usera.getRoles()) { System.out.println(roles.getRname()); } }
//角色 RolesDao rolesDao=sqlSession.getMapper(RolesDao.class); List<Roles> ro=rolesDao.selectAllRoles(); for (Roles roles : ro) { System.out.println(roles.getRname()); }
//通过dao方法注解方式进行一对一 //用注解方式实现(一对一) PersonDao personDao1=sqlSession.getMapper(PersonDao.class); Person person = personDao.getPersonAndCardById(1); System.out.println(person);
//通过dao方法注解方式进行一对多 //用注解方式实现(一对多) Set<Province> set = personDao.getProvinceAndCityByid(1); for (Province provinces : set) { System.out.println(provinces); }}
ok,就到这里结束了