MyBatis学习笔记(3)-增删改查操作说明

一些配置参数的说明

parameterType:

在映射文件中通过parameterType指定输入参数的类型

resultType:

在映射文件中通过resultType指定输出结果的的类型

#{}和${}

#{}表示一格占位符,不会引起sql注入

${}表示一格拼接符号,会引起sql注入,所以不建议使用${}

selectOne()和selectList()

selectOne表示查询出一条记录进行映射,如果使用slectOne可以实现,使用selectList也可以实现,只不过结果是只包含一个元素的列表。

selectList表示查询出一个列表(多条记录)进行映射,当需要查询多条记录的时候,不能使用selectOne去查询。

测试案例:一个本该列表查询的语句,我故意使用selectOne去调用:

User list11 =sqlSession.selectOne("test.findUserByName",userName);

将会产生一个运行时你报错,如图:


以下分别是增删改查用户表的操作

查询用户

两个查询用户的statement语句配置demo,如下代码:

  <select id="findUserById" parameterType="int" resultType="cn.mytest.mybatis.po.User">

     SELECT * FROM USER WHERE id=#{value}

  </select>

  <!-- 根据用户名模糊查询用户信息,可能返回多条,以查询用户名包含‘赵’这个字为例,具体 LIKE 关键字表示字符串匹配,如果传入常量‘赵六’则表示查找用户名等‘赵六’的人

  resultType:指定的就是单挑记录所映射的java对象类型

  ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,使用${}拼接sql,引起sql注入,如输入串为'OR 1=1' (始终为真)

  ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value

  -->

  <select id="findUserByName" parameterType="java.lang.String" resultType="cn.mytest.mybatis.po.User">

     SELECT * FROM USER WHERE NAME LIKE '%${value}%'

  </select>


添加用户

user表的主键id资源,不要指定默认值并且勾选“自增”选项,这样插入表的时候就不需要填写id值了,如图表结构信息,此外Unsigned也需要勾选,我试过,不勾选,插入语句会“主键值插入1”的错误。我怀疑是修改完表妹立即刷新的结果(感觉Unsigned不是必须修改)

插入用户的Demo表达式:

      //demo3:插入用户信息

      //插入用户对象--主键自增的方式

      try {

         User insertItemUser=new User();

         insertItemUser.setName("Stephanie123");

         insertItemUser.setAge(12);

         sqlSession.insert("test.insertUser",insertItemUser);

        

         //提交事务,保存

         sqlSession.commit();

        

         System.out.println("插入数据库成功!");

      }

      catch (Exception e)

      {

         System.out.println("插入数据库失败!e="+e);

      }

获取刚刚插入记录的主键id

表属性为主键自增的方式时:

进一步改进InsertUser的定义,使得可以获得user(id主键为自增方式下),刚刚插入那条记录的用户id:

  <insert id="insertUser" parameterType="cn.mytest.mybatis.po.User">

     <!-- 将插入数据的主键返回,返回到User对象中

     SELECT LAST_INSERT_ID():得到刚Insert进去记录的主键值,只适用于自增主键

     keyProperty:将查询到主键设置到parameterType指定的对象的哪个属性

     order:SELECT LAST_INSERT_ID()执行顺序,相对于Insert语句来说它的执行顺序

     resutType:指定返回id的类型

     -->

     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

         SELECT LAST_INSERT_ID()

     </selectKey>

     INSERT INTO USER(user.`name`,user.`age`) VALUES(#{name},#{age})

  </insert>

在之前的sqlSesion.commit()逻辑之后,通过如下代码测试查看新插入记录的用户id:

         //获取用户信息主键

         //自增主键的返回,MySQL的自增主键:指定Insert提交之前自动生成一个自增主键。

         //通过MySQL函数获得刚刚插入记录的自增主键:LAST_INSERT_ID(),是在Insert语句之后调用

         System.out.println("用户id="+insertItemUser.getId());

表属性为主键非自增的方式时:使用uuid()

使用MySQL的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成36位。(老师讲错了,uuid()生成的字符串长度实际为36位)

执行思路:

先通过uuid()查询到主键,将主键输入到sql语句中;

指定uuid()语句顺序相对于Insert函数之前。

如下先是为使用非自增主键的statement的调用,我新加了insertUser2这个statement:

sqlSession.insert("test.insertUser2",insertItemUser);

此外,相应的增加Mapper.xml中的配置:

  <!-- 使用MySQL的uuid()生成主键

              执行过程:

               首先通过uuid()得到主键,将主键设置为user对象的id属性中

               其次在Insert执行时,从user对象中取出id属性值

     order:指的是该项执行在insert语句之前还是之后,uuid()函数是执行在Insert之前

   -->

   <insert id = "insertUser2" parameterType="cn.mytest.mybatis.po.User">

     <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">

         SELECT uuid()

     </selectKey>

     INSERT INTO USER(user.id,user.`name`,user.`age`) VALUES(#{id},#{name},#{age})

  </insert>

并且,User.java数据结构类的主键id也得是String类型,数据库表user的主键类型也得是varchar(36)类型


修改用户 和删除用户

懒得写了,只粘statement配置了。

猜你喜欢

转载自blog.csdn.net/stephanie_1/article/details/81131567