Mybatis复习笔记:4

关于Mybatis中的一些注意点

一.关于实体类属性

当我们封装的时候我们一般要求实体类中和数据库的列名保持一致。
如果不一致将会导致查询结果为空。

解决属性名和数据库中表的字段名不一致的方法

1.在sql语句中给数据库中的字段起别名

如:

 <select id="findAll" resultType="com.domain.User">
        select product_name as name, product_type as type,product_price as price,regist_date as date from product ;
 </select>
2.给实体类和数据库建立对应关系

利用resultMap配置查询结果中的列名和实体类的属性名的对应关系,如下:

<mapper namespace="com.dao.UserDao">
    <!--配置查询结果中的列名和实体类的属性名的对应关系-->
    <!--resultMap的id指定唯一标识,可以随便起,type指定结果集映射,返回的是User对象-->
    <resultMap id="userMap" type="com.domain.User">
        <!--主键字段的对应如下,由于我的表没有设置主键,所以...-->
        <!--<id property="userid" column="id"/>-->
        <!--非主键字段的对应如下-->
        <!--property对应的是实体类属性  column对应的是数据库的字段-->
        <result property="name" column="product_name"/>
        <result property="type" column="product_type"/>
        <result property="price" column="product_price"/>
        <result property="date" column="regist_date"/>
    </resultMap>

    <select id="findAll" resultMap="userMap">
        select * from product
    </select>

然后在sql语句中将resultType设置为"userMap"即可;

<select id="findAll" resultMap="userMap">
        select * from product
</select>

二.关于动态sql语句运用的理解

where标签

where标签类似于MySQL中的where语句。

<select id="findByProduct" parameterType="Product" resultType="Product">
        select * from product
        <where>
            <if test="product_type!=null">
                and product_type like #{product_type}
            </if>
            <if test="product_price!=null">
                and product_price>#{product_price}
            </if>
        </where>
</select>

当上面的product_type和product_price都不为null的时候,那么打印出来的SQL语句为:
select * from product where product_type like “xxx” and product_price>xxx;
where标签会自动将其后第一个条件的and或者是or给忽略掉。

if标签

if标签就类似于我们平时使用的if语句,起着选择的作用,如下:

<select id="findByProduct" parameterType="Product" resultType="Product">
        select * from product
        <where>
            <if test="product_type!=null">		<!--给出的条件-->
                and product_type like #{product_type}
            </if>
            <if test="product_price!=null">		<!--给出的条件-->
                and product_price>#{product_price}
            </if>
        </where>
</select>

我们可以根据product_type或product_price的符合条件来查询,只要满足了if标签里面给出的条件,即可进行查询。

只依照一个条件查询

@Test
public void testFindByProduct(){
	Product product = new Product();
    //product.setProduct_type("%用品%");	//select * from product where product_type like "%用品%";
    product.setProduct_price(100);			//select * from product where product_price>100;
    List<Product>productList = productDao.findByProduct(product);
    for (Product product1:productList){
    	System.out.println(product1);
    }
}

当上面两个条件都启用的时候,即:

@Test
public void testFindByProduct(){
	Product product = new Product();
    product.setProduct_type("%用品%");
    product.setProduct_price(100);
    List<Product>productList = productDao.findByProduct(product);
    for (Product product1:productList){
    	System.out.println(product1);
    }
}

表示的sql语句为:select * from product where product_type like “%用品%” and product_price>100;

foreach标签

foreach标签如其名,起到遍历集合类型的作用,如下:

<!--下面的查询语句相当于MySQL中的"select * from product where product_type in(xxx,xxx,xxx);"写法-->
<select id="findByType2" parameterType="QueryProduct" resultType="Product"><!--传入类型(parameterType)为实体类QueryProduct,返回类型(resultType)为实体类Product-->
        select * from product
        <where>
            <if test="product_types!=null and product_types.size()>0"><!--该判断条件为product_types集合不为空,且product_types集合的长度大于0-->
                <foreach collection="product_types" open="and product_type in(" close=")" item="product_type" separator=",">
                    #{product_type}
                </foreach>
            </if>
        </where>
</select>

上面中的collection表示这是一个集合,由open开始,在close结束,并且将遍历出来的每一项存到item里面,由separator分割

    @Test
    public void testFindByType2(){
        QueryProduct queryProduct = new QueryProduct();
        List<String>list = new ArrayList<>();
        //往集合里面添加元素
        list.add("生活用品");
        list.add("乐器");
        list.add("文具");
        queryProduct.setProduct_types(list);
        List<Product>productList = productDao.findByType2(queryProduct);
        for (Product product1:productList){
            System.out.println(product1);
        }
    }

关于抽取重复sql语句的标签

利用sql标签来配置重复的sql语句,可以避免在项目开发的过程中重复编写大量相同的sql语句,如下:

<!--抽取重复的sql语句片段-->
<sql id="defaultUser">
	select * from product
</sql>

使用方式(使用include标签)

    <select id="findByProduct" parameterType="Product" resultType="Product">
        <include refid="defaultUser"/>	<!--使用include标签来引用前面已定义的sql语句片段,等价于select * from product-->
        <where>
            <if test="product_type!=null">
                and product_type like #{product_type}
            </if>
            <if test="product_price!=null">
                and product_price>#{product_price}
            </if>
        </where>
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值