Mybatis 框架总结(二) :增删改查

本文介绍如何使用MyBatis进行数据库操作,包括增删改查的基本语法及动态SQL的应用。

增删改查的语句都是在xml里面编写的,到时候直接调用。接下来的操作是对book这个表的增删改查


insert

因为用的是mysql,在设计表的时候设置的id是自动生成的,所以并不用写上

<?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">
<!-- namespace必须定义,非绑定到类或是接口的方式 -->
<mapper namespace="sdibt.lxj.entity.Book">
	<!-- 增加一本书 -->
  <insert id="insert1">
     	insert into book(book_name,book_price,book_page) values('mysql',30.2,500);
  </insert>
</mapper>

测试,因为是增删改语句,所以必须要提交事务

//创建session
		SqlSession session = sf.openSession();		
		session.insert("sdibt.lxj.entity.Book.insert1");
		//提交事务
		session.commit();

insert语句插入的值一般会是用户传来的数据 ,所以对刚才的语句进行修改,parameterType="java.util.Map"表示传来的参数类型,通常是传来一个map集合,也可以简写成parameterType="map",#{bookName}表示的是map里面的key对应的value

<!-- 增加一本书 -->
  <insert id="insert1" parameterType="java.util.Map">
     	insert into book(book_name,book_price,book_page) values(#{bookName},#{bookPrice},#{bookPage})
  </insert>

测试

Map map = new HashMap();
		map.put("bookName", "c++");		
		map.put("bookPrice", 60.6);
		map.put("bookPage", 3000);
		
		session.insert("sdibt.lxj.entity.Book.insert1",map);
		//提交事务
		session.commit();

delete

<!-- 删除id为1的书 -->
  <delete id="delete1" parameterType="int">
  	delete from book where id=#{id}
  </delete>

测试

session.delete("sdibt.lxj.entity.Book.delete1",1);
		//提交事务
		session.commit();

update

<!-- update语句  将id为3,页数改为1000-->
    <update id="update1" parameterType="map">
    	update book set book_page=#{bookPage} where id=#{id}
</update>

测试

	Map map = new HashMap();
		map.put("id", 3);
		map.put("bookPage", 1000);
		
		session.update("sdibt.lxj.entity.Book.update1",map);
		//提交事务
		session.commit();

有时候用户在更新的时候可能只修改一行的某一部分,比如这个用户要修改书名和页数,那个用户要修改书名和价格,其他的参数不变。针对这样的业务如果写很多的sql语句就太麻烦了,所以动态sql可以解决这一方案。trim标签里包含的是可能要进行更新的值,如果用户传来的某一个数据是空,那么将不会进行修改。prefix="set" 表示这些语句的前缀 suffix=""  表示这些语句的后缀   suffixOverrides=","  指定去除的多余的后缀内容 prefixOverrides="" 指定去除的多余的前缀内容

<!-- 动态更新 -->
	<update id="dynamicUpdate" parameterType="map">
		update book
		<trim prefix="set" suffixOverrides=",">
			<if test="bookName!=null">
				book_name=#{bookName},
			</if>
			<if test="bookPrice!=null">
				book_price=#{bookPrice},
			</if>	
		</trim>
		where id=#{id}		
	</update>

测试,只修改书的名字


Map map = new HashMap();
		map.put("id", 2);
		map.put("bookName", "c++++");		
//		map.put("bookPrice", 60.6);
		
		session.update("sdibt.lxj.entity.Book.dynamicUpdate",map);
		//提交事务
		session.commit();

查询

1.查询所有书本,返回类型是一个map集合

<select id="all" resultType="map">
		select * from book
	</select>

测试

List<Map> lst = session.selectList("sdibt.lxj.entity.Book.all");
		for (Map map : lst) {
			System.out.println(map.get("book_name")+"  "+map.get("book_price"));
		}

2.查询部分列,返回值也是个map类型

<select id="allReturnPart" resultType="map">
		select book_name,book_price from book
	</select>

3.查询id为3的书本,只有一个参数的情况下#{...},里面可以使任意值

 <select id="allById" resultMap="map" parameterType="int">

    select * from book where id=#{abc}   

      </select>

测试,当确定查询的只有一条数据的时候,可以使用selectOne方法,返回的对象是Object,

//创建session
		SqlSession session = sf.openSession();	
		
		Map map = session.selectOne("sdibt.lxj.entity.Book.allById",7);
		System.out.println(map.get("book_name"));
		System.out.println(map.get("book_price"));

4.多条件查询,单引号,大于号,小于号等出现在xml配置文件sql中要用转义符号。 


 <!-- 多条件查询,要求页数小于1000,名称含有语言两个字,那本书 -->
    <select id="allMultiCondition" resultType="map" parameterType="map">
    	 select * from book where book_page &lt; #{page} and book_name like #{keyword}
      </select>

测试:

//创建session
		SqlSession session = sf.openSession();	
		
		Map map = new HashMap();
		map.put("page", 1000);
		map.put("keyword","%语言%");
		
		List<Map> lst = session.selectList("sdibt.lxj.entity.Book.allMultiCondition",map);
		for (Map map2 : lst) {
			System.out.println(map2.get("book_name")+"  "+map2.get("book_page"));
		}

5.动态sql查询,与动态更新差不多,用trim标签

<!-- trim方式实现动态sql -->
    <select id="dynamicSql1" resultType="map" parameterType="map">
       select * from book 
        <trim prefix="where" prefixOverrides="and | or ">
			      <if test="name!=null">
			       and book_name = #{name}
			  </if>
			   <if test="page!=null">
			       and book_page>#{page}
			  </if>
	  </trim>

6.查询参数是集合的情况,查询book的id是7,8,9的书籍,传来的参数会是一个list集合

<!-- 集合查询,查询book的id是7,8,9的书籍 -->
      <select id="lstSelect" resultType="map" parameterType="java.util.List">
      	select * from book where id in
      	 <foreach collection="list" open="(" close=")" separator=","  item="item">
      	 	#{item}
      	 </foreach>      
      </select>

测试:

		List<Integer> list = new ArrayList<Integer>();
		list.add(7);
		list.add(8);
		list.add(9);
		
		List<Map> lst = session.selectList("sdibt.lxj.entity.Book.lstSelect",list);
		for (Map map : lst) {
			System.out.println(map.get("book_name"));
		}

7.分页查询

//,创建一个分页对象,第一个参数表示从第几个数据开始查,下标从0开始。第二参数表示查询几条数据
		RowBounds rb = new RowBounds(2, 3);		
		//第一个参数表示sql的id,第二参数是参数,第三个参数是分页对象
		List<Map> lst = session.selectList("sdibt.lxj.entity.Book.all", null, rb);
		
		for (Map map : lst) {
			System.out.println(map.get("book_name"));
		}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值