第十章 MyBatis作业

MyBatis

平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。

那么用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

MyBatis整体框架

  1. 数据源配置文件

数据库连接池:与数据库链接,在Java代码中就不需要在每个类中都写或者都调用数据库连接信息了

PS:不同的数据库,拥有不同的数据库连接驱动,开发者需要你根据自己的需要去下载jar包和配置连接参数

  1. SQL映射配置文件

将SQL配置在单独的Mapper.xml中,简称Mapper文件

<mapper>连接数据库-找到表-设置表的数据类型-返回值类型(全路径名)

-SQL语句</mapper>

<mapper>将mapper文件告诉mybatis</mapper>

一个mappers标签对里面可以添加很多mapper标签,每个标签都对应着一个mapper.xml配置文件

  1. 会话工厂与会话(核心)

会话工厂(SqlSessionFactory)加载配置的数据库连接池配置文件,可以根据配置文件产生出连接数据库并与其交互的SqlSession会话实例类

MyBatis运行流程

1. 应用程序找Mybatis要数据

2. mybatis从数据库中找来数据

2.1 通过mybatis-config.xml 定位哪个数据库

2.2 通过Category.xml执行对应的select语句

2.3 基于Category.xml把返回的数据库记录封装在Category对象中

2.4 把多个Category对象装在一个Category集合中

3. 返回一个Category集合

 

作业

 

  1. 根据how2j案例进行基础增删改查的练习

①修改原有的Category.xml配置文件,提供sql语句

 

②增加

 

Category c = new Category();

//为Category类创建一个对象c

C.setName("漂亮的Category");

//调用Category.java中的方法给c赋值

session.insert("addCategory",c);

//调用会话找到Category.xml中的insert给addCategory传c的值

删除

删除前

 

删除后

 

给sql的一种操作赋id,test中创建实体类的对象c,调用类中的方法给c传值,通过c给id赋值,id中的值带入到sql封装的操作中,调用这一类操作,最后体现在页面中

④获取

 

⑤修改

修改语句

session.update("updateCategory",c);

 ⑥查询所有

执行查询语句

List<Category> cs = session.selectList("listCategory");

对应语句

<select id="listCategory" resultType="Category">

select * from category_

</select>

模糊查询

修改Category.xml,提供listCategoryByName查询语句

select * from   category_  where name like concat('%',#{0},'%')

concat('%',#{0},'%') 这是mysql的写法

如果是oracle,写法是

select * from   category_  where name like '%'||#{0}||'%'

②运行测试

 

List<Category> cs = session.selectList("listCategoryByName","1");

意义:查询含有("listCategoryByName","1")的值的元组

多条件查询

1. Category.xml 准备sql语句

 <select id="listCategoryByIdAndName"  parameterType="map" resultType="Category">

    select * from   category_  where id> #{id}  and name like concat('%',#{name},'%')

</select>

//有两个条件,①id>多少②name like concat('%',#{name},'%')

2. 测试代码

因为是多个参数,而selectList方法又只接受一个参数对象,所以需要把多个参数放在Map里,然后把这个Map对象作为参数传递进去

Map<String,Object> params = new HashMap<>();

params.put("id", 3);

params.put("name", "cat");

List<Category> cs = session.selectList("listCategoryByIdAndName",params);

 

练习动态sql

IF

假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询。
那么按照现在的方式,必须提供两条sql语句:listProduct和listProductByName
然后在调用的时候,分别调用它们来执行。

<select id="listProduct" resultType="Product">

      select * from product_         

</select>

<select id="listProductByName" resultType="Product">

      select * from product_  where name like concat('%',#{name},'%')        

</select>

②如果Product的字段比较多的话,为了应付各个字段的查询,那么就需要写多条sql语句,这样就变得难以维护。

这个时候,就可以使用Mybatis 动态SQL里的if标签

<select id="listProduct" resultType="Product">

select * from product_

<if test="name!=null">

where name like concat('%',#{name},'%')

</if>  

</select>

如果没有传参数name,那么就查询所有,如果有name参数,那么就进行模糊查询。

这样只需要定义一条sql语句即可应付多种情况了,在测试的时候,也只需要调用这么一条sql语句listProduct 即可。

 

WHERE

①多条件的矛盾

如果要进行多条件判断,就会写成这样:

<select id="listProduct" resultType="Product">

select * from product_

<if test="name!=null">

where name like concat('%',#{name},'%')

</if>  

<if test="price!=0">

and price > #{price}

</if>  

</select>

这么写的问题是:当没有name参数,却有price参数的时候,执行的sql语句就会是:

select * from product_ and price > 10.

这样执行就会报错

②通过where标签解决

把if标签里的内容框进where标签里

<where>标签会进行自动判断

如果任何条件都不成立,那么就在sql语句里就不会出现where关键字

如果有任何条件成立,会自动去掉多出来的 and 或者 or。

 

补充:①还有update里的set标签

②rim 用来定制想要的功能,比如where标签就可以用

<trim prefix="WHERE" prefixOverrides="AND |OR ">

  ...

</trim>

来替换

set标签就可以用

<trim prefix="SET" suffixOverrides=",">

  ...

</trim>

来替换

运行set标签中的代码,其效果是一样的。

CHOOSE /WHEN OTHERWISE(代替if else 的选择功能)

①where里面套一个choose就可以用when otherwise代替if else了

<where>

    <choose>

       <when test="name != null">

         and name like concat('%',#{name},'%')

       </when>          

       <when test="price !=null and price != 0">

             and price > #{price}

       </when>                

       <otherwise>

            and id >1

       </otherwise>

    </choose>

</where>

 FOREACH

SELECT * FROM product_

  WHERE ID in

<foreach item="item" index="index" collection="list"

     open="(" separator="," close=")">

                    #{item}

</foreach>

foreach标签通常用于in 这样的语法里

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值