关于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>