增删改查的语句都是在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 < #{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"));
}