2、Mybatis增删改查(CURD)

来源:互联网 发布:张无忌武力 知乎 编辑:程序博客网 时间:2024/06/01 09:20

  • 使用 mybatis 查询用户数据(读取用户列表)
  • 使用 mybatis 增加用户数据
  • 使用 mybatis 更新用户数据
  • 使用 mybatis 删除用户数据

查询

在入门程序中已经实现了查询单一用户,现在我们实现模糊查询和查找所有用户。

1、查询所有

User.xml:

<!-- 查询所有 --><select id="getAll" resultType="cn.xpu.hcp.bean.User">    select * from user</select>

测试代码:

SqlSession session = sqlSessionFactory.openSession();//selectOne(...)只能查询一条记录,使用selectList(...)查询多条记录List<User> list = session.selectList("getAll");for(User user:list){    System.out.println(user);}session.close();

查询所有结果

2、模糊查询

有两种写法用于模糊查询:
方法一:使用#{value}
User.xml:

<!-- 模糊查询,方法一 --><select id="getLikeByName" parameterType="string" resultType="cn.xpu.hcp.bean.User">    select * from user where username like #{value}</select>

测试代码:

List<User> list = session.selectList("getLikeByName","%张%");

注意:使用#{}这种形式时,输入的参数需要加上%。

当然,如果你一定要使用#{…},在代码中又很傲娇的就是不想加%,那我们就在xml中的sql语句中加:

select * from user where username like CONCAT(CONCAT('%', #{value}),'%')

这种我也不想,我不要写CONCAT()进行拼接。
看一条sql语句:

SELECT * FROM USER WHERE username LIKE "%"'张'"%"

请问这条语句对不对,能不能运行?
我们从来没写过这种形式的模糊查询语句,其实这是正确的。
所以,最终版xml中的写法:

<select id="getLikeByName" parameterType="string" resultType="cn.xpu.hcp.bean.User">         select * from user where username like "%"#{value}"%"</select>

测试结果:
模糊查询方法一

方法二:使用${value}
User.xml:

 <!-- 模糊查询,方法二 --><select id="getLikeByName" parameterType="string" resultType="cn.xpu.hcp.bean.User">        select * from user where username like '%${value}%'</select>

测试代码:

List<User> list = session.selectList("getLikeByName","张");

使用${value}在输入参数时不需要%。并且可以直接写%${value}%。

#{}和${}:

#{}表示一个占位符,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是任意名称。

${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中,且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

#{}方式能有效防止sql注入,首选。


添加

User.xml:

<!-- 添加 --><insert id="insertUser" parameterType="cn.xpu.hcp.bean.User">        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})</insert>

测试代码:

public void insertUser(){        SqlSession session = sqlSessionFactory.openSession();        User user = new User("孙权","m",new Date(),"南昌");        session.insert("insertUser", user);        //需要进行事务提交,否则无法添加成功        session.commit();        session.close();}

这里写图片描述

有时候我们添加完对象后想把这个对象打印出来,但是,由于主键是mysql自增的,我们不做其他处理直接打印显示id=0.
这里写图片描述
这时我们使用SELECT LAST_INSERT_ID()来查找id
只需要修改User.xml中添加部分的代码:

<!-- 添加 --><insert id="insertUser" parameterType="cn.xpu.hcp.bean.User">    <!--         selectKey 标签实现主键的返回        keyColumn:主键对应表中列名        keyProperty:主键对应类中的属性名        order:设置在执行insert语句之前还是之后查询id,这里选择之后     -->    <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">            SELECT LAST_INSERT_ID()    </selectKey>        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})</insert>

现在我们插入后再显示插入对象就能获得id值了:
这里写图片描述


更新

User.xml:

<!-- 更新 --><update id="updateUser" parameterType="cn.xpu.hcp.bean.User">        update user set username=#{username},birthday = #{birthday},sex = #{sex},address = #{address} WHERE id=#{id}</update>

测试代码:

public void updateUser(){        SqlSession session = sqlSessionFactory.openSession();        User user = session.selectOne("GetUserByID", 1);        user.setUsername("曹操");        session.update("updateUser", user);//先取得,再修改,防止空值的出现        session.commit();        session.close();}

删除

User.xml:

<!-- 删除 --><delete id="deleteUserById" parameterType="int">       DELETE FROM USER WHERE id = #{id}</delete>

测试代码:

@Testpublic void deleteUserById(){    SqlSession session = sqlSessionFactory.openSession();    session.delete("deleteUserById", 6);    session.commit();    session.close();}

这里写图片描述


原创粉丝点击