一对多时,在映射文件中写出它们的映射关系,这时是使用collection
<resultMap id="manMap" type="ManBean">
<id property="manId" column="man_id"></id>
<result property="manName" column="man_name"></result>
<result property="manAge" column="man_age"></result>
<result property="manGender" column="man_gender"></result>
</resultMap>
<!-- extends 继承指定resultMap中的映射关系
collection 专用于做集合属性中的元素对象映射关系
property 书写集合属性的属性名 ofType 该集合属性元素的类型-->
<resultMap id="man_car_map" type="ManBean" extends="manMap">
<collection property="carList" ofType="CarBean">
<id property="carId" column="car_id"></id>
<result property="carName" column="carName"></result>
<result property="carType" column="car_type"></result>
<result property="carPrice" column="car_price"></result>
</collection>
</resultMap>
而一对一,多对一时时则使用association
<resultMap id="carMap" type="CarBean">
<id property="carId" column="car_id"></id>
<result property="carName" column="car_name"></result>
<result property="carType" column="car_type"></result>
<result property="carPrice" column="car_price"></result>
</resultMap>
<!-- association 用于属性对象属性中映射关系
property 表示关联属性-书写属性名称
javaType 表示关联属性的类型 -书写类的别名(类的全限定名 -包名+类名)-->
<resultMap id="car_man_map" type="CarBean" extends="carMap">
<association property="man" javaType="ManBean">
<id property="manId" column="man_id"></id>
<result property="manName" column="man_name"></result>
<result property="manAge" column="man_age"></result>
<result property="manGender" column="man_gender"></result>
</association>
</resultMap>
这里博主可以借一个实例来讲述它们的用法
这个项目中有两个表,一个人类实体,一个是车的实体
人类实体
public class ManBean {
private int manID;//人的ID
private String manName;//姓名
private int manAge;//年龄
private String manGender;//性别
private ArrayList<CarBean> carList;//人拥有的汽车集合
public ManBean() {
}
public ManBean( String manName, int manAge, String manGender) {
this.manName = manName;
this.manAge = manAge;
this.manGender = manGender;
}
public int getManID() {
return manID;
}
public void setManID(int manID) {
this.manID = manID;
}
public String getManName() {
return manName;
}
public void setManName(String manName) {
this.manName = manName;
}
public int getManAge() {
return manAge;
}
public void setManAge(int manAge) {
this.manAge = manAge;
}
public String getManGender() {
return manGender;
}
public void setManGender(String manGender) {
this.manGender = manGender;
}
public ArrayList<CarBean> getCarList() {
return carList;
}
public void setCarList(ArrayList<CarBean> carList) {
this.carList = carList;
}
@Override
public String toString() {
return "ManBean{" +
"manID=" + manID +
", manName='" + manName + '\'' +
", manAge=" + manAge +
", manGender='" + manGender + '\'' +
", carList=" + carList +
'}';
}
}
汽车实体
public class CarBean {
private int carID;
private String carName;//汽车姓名
private String carType;//汽车类型
private int carPrice;//汽车价格
private ManBean man;//汽车主人
public CarBean() {
}
public CarBean(String carName, String carType, int carPrice) {
this.carName = carName;
this.carType = carType;
this.carPrice = carPrice;
}
public int getCarID() {
return carID;
}
public void setCarID(int carID) {
this.carID = carID;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
public int getCarPrice() {
return carPrice;
}
public void setCarPrice(int carPrice) {
this.carPrice = carPrice;
}
public ManBean getMan() {
return man;
}
public void setMan(ManBean man) {
this.man = man;
}
@Override
public String toString() {
return "CarBean{" +
"carID=" + carID +
", carName='" + carName + '\'' +
", carType='" + carType + '\'' +
", carPrice=" + carPrice +
", man=" + man +
'}';
}
}
dao层
ICarDao
public interface ICarDao {
//根据人的id添加汽车集合
void addCar(@Param("list") ArrayList<CarBean> carBeans,@Param("manID") int manID);
//根据人的id删除他的汽车
void delCar(@Param("manID") int manID);
//根据人的id查询他的所有汽车
ArrayList<CarBean> findCarsByManID(int manID);
//根据汽车价格动态查询
ArrayList<CarBean> findByTypePrice(@Param("carType") String carType,@Param("startPrice") int startPrice,@Param("endPrice") int endprice);
//根据汽车类型和价格动态查询
ArrayList<CarBean> findByItem(String carTypr,int startPrice,int endPrice);
//根据车的id查看属于哪个人
CarBean findCarIncludeMan(int carID);
//根据车名分页查询
ArrayList<CarBean> checkByCut(String carName);
}
IManDao
public interface IManDao {
//添加一个人
void addMan(ManBean manBean);
//根据id删除一个人
void delMan(@Param("manID") int manID);
//根据人的id查询这个人的所有车
ManBean findManIncludeCars(int manID);
//根据id查询一个人
ManBean findById(int manID);
//根据id更改这个人的姓名和年龄
void updateman(@Param("manID") int manID,@Param("manName") String manName,@Param("manAge") int manAge);
//根据条件动态分页查询
ArrayList<ManBean> cutList(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize, @Param("manName") String manName,
@Param("manAge") int manAge, @Param("manGender") String manGender);
//根据条件查询
int cutcount(@Param("manName") String manName,@Param("manAge") int manAge,@Param("manGender") String manGender);
//根据id更改人的性别
void updateman1(@Param("manID") int manID,@Param("manGender") String manGender);
}
service层
ICarService
public interface ICarService {
ArrayList<CarBean> findByItem(String carTypr,int startPrice,int endPrice);
CarBean findCarIncludeMan(int carID);
PageInfo<CarBean> checkByCut(int pageNo,String carName);
}
IManService
public interface IManService {
//在添加公民信息时,需要将其汽车信息一并添加到数据库
void addManIncludeCar( ManBean manBean, ArrayList<CarBean> carBeans);
void delMan(int manID);
ManBean findManIncludeCars(int manID);
CutPageBean<ManBean> findByCut(@Param("pageNO") int pageNO, @Param("manName") String manName, @Param("manAge") int manAge, @Param("manGender") String manGender);
void updateMan(@Param("manID") int manID,@Param("manGender") String manGender);
}
它们的实现类
ManServiceImpl
public class ManServiceImpl implements IManService {
private IManDao dao = new ManDaoImpl();
private ICarDao carDao = new CarDaoImpl();
@Override
public void addManIncludeCar(ManBean manBean, ArrayList<CarBean> carBeans) {
dao.addMan(manBean);
carDao.addCar(carBeans,manBean.getManID());
}
@Override
public void delMan(int manID) {
carDao.delCar(manID);
dao.delMan(manID);
}
@Override
public ManBean findManIncludeCars(int manID) {
ManBean manBean = dao.findById(manID);
carDao.findCarsByManID(manID);
return manBean;
}
@Override
public CutPageBean<ManBean> findByCut(int pageNO, String manName, int manAge, String manGender) {
CutPageBean<ManBean> cutPageBean = new CutPageBean<>();
ArrayList<ManBean> list = dao.cutList((pageNO-1)*CutPageBean.PAGE_SISE,CutPageBean.PAGE_SISE,manName,manAge,manGender);
int count = dao.cutcount(manName,manAge,manGender);
cutPageBean.setCount(count);
cutPageBean.setList(list);
return cutPageBean;
}
@Override
public void updateMan(int manID, String manGender) {
dao.updateman1(manID,manGender);
}
}
CarServiceImpl
public class CarServiceImpl implements ICarService {
private ICarDao dao;
@Override
public ArrayList<CarBean> findByItem(String carTypr, int startPrice, int endPrice) {
return null;
}
@Override
public CarBean findCarIncludeMan(int carID) {
return null;
}
@Override
public PageInfo<CarBean> checkByCut(int pageNo, String carName) {
PageHelper.startPage(pageNo,3);
PageInfo<CarBean> pageInfo = PageInfo.of(dao.checkByCut(carName));
return pageInfo;
}
}
它们的映射文件
ICarDao.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.project.dao.ICarDao">
<insert id="addCar">
insert into t_car(t_carname,t_cartype,t_carprice,fk_manid) values
<foreach collection="list" item="car" separator=",">
(#{car.carName},#{car.carType},#{car.carPrice},#{manID})
</foreach>
</insert>
<delete id="delCar">
delete from t_car where fk_manid=#{manID}
</delete>
<resultMap id="carMap" type="CarBean">
<id property="carID" column="pk_carid"></id>
<result property="carName" column="t_carname"></result>
<result property="carType" column="t_cartype"></result>
<result property="carPrice" column="t_carprice"></result>
</resultMap>
<resultMap id="car_man_map" type="CarBean" extends="carMap">
<!-- property表示属性名称在carBean里面 javaTYPE写关联属性的类型 一般写类的别名(类的全限定名)-->
<association property="man" javaType="ManBean">
<id property="manID" column="pk_manid"></id>
<result property="manName" column="t_manname"></result>
<result property="manAge" column="t_manage"></result>
<result property="manGender" column="t_mangender"></result>
</association>
</resultMap>
<select id="findCarsByManID" resultMap="carMap">
select * from t_car where fk_manid = #{manID}
</select>
<select id="findByTypePrice" resultMap="carMap">
select * from t_car where 1=1
<if test="carType != null and carType !=''">
and t_carType like "%"#{carType}"%"
</if>
<if test="startPrice != 0">
and t_carprice >=#{startPrice}
</if>
<if test="endPrice != 0">
<![CDATA[and t_carprice <=#{endPrice}]]>
</if>
</select>
<!--当我们需要查找一辆车属于哪个主人的时候属于一对一,这时我们就可以选用association-->
<select id="findCarIncludeMan" resultMap="car_man_map">
select c.*,m.* from t_car c left join t_human m on c.fk_manid = m.pk_manid
where c.pk_carid=#{carID}
</select>
<select id="checkByCut" resultMap="carMap">
select * from t_car where t_carname like "%"#{carName}"%"
</select>
</mapper>
IManDao.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.project.dao.IManDao">
<!-- keyproperty可以绑定bean里的主键 usegeneratedKeys 使用数据库自动增长列,并将最最新的数据主键值赋值给绑定的主键属性-->
<insert id="addMan" keyProperty="manID" useGeneratedKeys="true">
insert into t_human(t_manname,t_manage,t_mangender)
values (#{manName},#{manAge},#{manGender})
</insert>
<delete id="delMan">
delete from t_human where pk_manid=#{manID}
</delete>
<resultMap id="manMap" type="ManBean">
<id property="manID" column="pk_manid"></id>
<result property="manName" column="t_manname"></result>
<result property="manAge" column="t_manage"></result>
<result property="manGender" column="t_mangender"></result>
</resultMap>
<resultMap id="man_car_map" type="ManBean" extends="manMap">
<collection property="carList" ofType="CarBean">
<id property="carID" column="pk_carid"></id>
<result property="carName" column="t_carname"></result>
<result property="carType" column="t_cartype"></result>
<result property="carPrice" column="t_carprice"></result>
</collection>
</resultMap>
<!-- 当我们想要查找一个人拥有多少辆车时,这种情况属于一对多,这时我们就需要使用collection-->
<select id="findManIncludeCars" resultMap="man_car_map">
select m.*,c.* from t_human m left join t_car c on m.pk_manid = c.fk_manid
where m.pk_manid = #{manID}
</select>
<select id="findById" resultMap="manMap">
select * from t_human
where pk_manid = #{manID}
</select>
<update id="updateman">
update t_human set t_manname=#{manName},t_manage=#{manAge} where pk_manid = #{manID}
</update>
<select id="cutList" resultMap="manMap">
select * from t_human where 1=1
<include refid="dySql"></include>
limit #{startIndex},#{pageSize}
</select>
<!-- include 引用sql语句块 用它的id引用-->
<select id="cutcount" resultType="int">
select count(*) from t_human where 1=1
<include refid="dySql"></include>
</select>
<!-- 用于封装可重用的代码-->
<sql id="dySql">
<if test="manName != null and manName !=''">
and t_manname like "%"#{manName}"%"
</if>
<if test="manAge != 0">
and t_manage >=#{manAge}
</if>
<if test="manAge != 0">
<![CDATA[and t_manage <=#{manAge}]]>
</if>
<if test="manGender != null and manGender != ''">
and t_mangender like "%"#{manGender}"%"
</if>
</sql>
<update id="updateman1">
update t_human set t_mangender=#{manGender} where pk_manid = #{manID}
</update>
</mapper>
当然需要测试的话还需要配置文件放在resource目录下
mybatis.cfg.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>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<typeAliases>
<package name="com.project.bean"/>
</typeAliases>
<!-- 分页插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:端口号/数据库名称?characterEncoding=utf-8&allowMultiQueries=true"/>
<property name="username" value="用户名"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="mapper/ManBean.xml"/>-->
<package name="com.project.dao"/>
</mappers>
</configuration>
测试类如下
public class TestService {
public static void main(String[] args) {
// IDepartService service = new DepartServiceImpl();
// System.out.println(service.findByCutItem(2,null,null,null));
IManService manService = new ManServiceImpl();
// ManBean manBean = new ManBean();
// ArrayList<CarBean> carBeans = new ArrayList<>();
// carBeans.add(new CarBean("奥迪","suv",250000));
// carBeans.add(new CarBean("宝马","小轿车",300000));
// carBeans.add(new CarBean("特斯拉","suv",280000));
//
// manService.addManIncludeCar(manBean,carBeans);
// manService.delMan(manBean.getManID());
// manService.findManIncludeCars(manBean.getManID());
// manService.findByCut(1,null,0,null);
// manService.updateMan(17,"女");
ICarService carService = new CarServiceImpl();
System.out.println(carService.checkByCut(1,"马"));
}
}
总结一下就是一对一,多对一时使用association
一对多时使用collection
这周的画在这里啦 还没有涂完