Mybatis-02-对数据库的基本操作

来源:互联网 发布:淘宝的临期化妆品 编辑:程序博客网 时间:2024/06/05 20:20

一.使用Mybatis进行一些基本的数据库操作

首先要创建一个使用了Mybatis框架的Java项目,在我的上篇博客中有详细的讲解Mybatis-01-简介及入门
另外我将这个示例程序传到了Github上Mybatis入门

1.模糊查询

1.1 mapper.xml配置文件中配置查询语句

  //mapper.xml文件中定义的SQL,使用模糊查询的关键字LIKE  <select id="query1" parameterType="String"          resultType="com.sandking.mybatis.pojo.BbsEmployee">    SELECT * FROM `bbs_employee` WHERE username LIKE #{username}  </select>
  • mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的id即是Mappedstatement对象的id
  • parameterType属性用来声明输入参数的类型
  • resultTypey属性用来声明输出结果的类型,如果是持久化类,则填写其全路径
  • # { }是输入参数的占位符,相当于JDBC中的PreparedStatement类编程中的 ? 占位符

1.2 测试程序通过SQL的id调用查询语句

    @Test    public void query1(){        SqlSession sqlSession = sqlSessionFactory.openSession();        //在测试程序中传入参数  ----->  %参数%        //使用sqlSessoin的selectOne()方法,只能用来查询一条数据,如果查出多条数据则报错,查询多条数据使用selectList()方法        BbsEmployee bbsEmployee = sqlSession.selectOne("query1","%ad%");        System.out.println(bbsEmployee.getUsername());        sqlSession.close();    }

Mybatis查询总结:

1.根据结果集的数量使用查询方法,selectList()方法可以用来执行查询有多个结果的查询,而selectOne()方法不能,否则会报错

这里写图片描述

2.mapper.xml文件中的SQL必须定义参数类型(parameterType)和结果类型(resultType)

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中
resultType:指定输出结果类型,mybatis将SQL查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象存放到List容器中

3.mapper映射文件中将参数拼接进SQL语句的方式“ #{ } ”和 ” ${ } ”

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

上面示例程序使用 #{ } 拼接SQL语句,下面再举例使用 ${ } 拼接SQL语句

//这里SQL语句中的 LIKE '%${value}%' 部分变量名value是固定的,指程序中传来的值<select id="query2" parameterType="String"          resultType="com.sandking.mybatis.pojo.BbsEmployee">    SELECT * FROM `bbs_employee` WHERE username LIKE '%${value}%'  </select>
    @Test    public void query2(){        SqlSession sqlSession = sqlSessionFactory.openSession();        //查询方法的第二个参数,即输入参数不用再加修饰符        BbsEmployee bbsEmployee = sqlSession.selectOne("query2","ad");        System.out.println(bbsEmployee.getUsername());        sqlSession.close();    }

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

实际应用中 #{ } 和 ${ }经常搭配混合使用

2.插入数据

2.1 mapper.xml映射文件中定义SQL语句

  //insert语句只用定义输入参数类型,这里是一个持久化类  <insert id="insert" parameterType="com.sandking.mybatis.pojo.BbsEmployee">    INSERT INTO `bbs_employee`    (username,password) VALUES    (#{username},#{password})  </insert>

2.2 编写测试程序

    @Test    public void insert(){        SqlSession sqlSession = sqlSessionFactory.openSession();        //创建一个持久化类的对象作为插入操作的参数        BbsEmployee bbsEmployee = new BbsEmployee();        bbsEmployee.setUsername("sisisi");        bbsEmployee.setPassword("123");        sqlSession.insert("insert",bbsEmployee);        System.out.println(bbsEmployee);        sqlSession.commit();    }

2.3 运行结果:

这里写图片描述

id为自增主键,执行插入操作后打印bbsEmployee对象,发现id值为0
打开Navicat却看见插入的这条数据的id值为6,说明插入语句不会自动返回自增主键的值

这里写图片描述

如果想得到插入数据后自增主键的值,需要通过在映射文件中添加配置,返回插入数据后自动生成的自增主键
Mybatis不仅可以返回自增主键的值,也可以返回uuid主键的值

<1>返回自增主键

  <insert id="insert" parameterType="com.sandking.mybatis.pojo.BbsEmployee">    <!-- selectKey:主键返回 -->    <!-- keyColumn:主键对应的表中的字段 -->    <!-- keyProperty:主键对应的持久化类中的属性 -->    <!-- order:设置执行查询操作的时机(在instert执行之前或执行之后) -->    <!-- resultType:设置返回的id的类型 -->    <selectKey keyColumn="id" keyProperty="id" order="AFTER"               resultType="int">      SELECT LAST_INSERT_ID()    </selectKey>    INSERT INTO `bbs_employee`    (username,password) VALUES    (#{username},#{password})  </insert>

再次执行插入操作后,控制台打印的结果

这里写图片描述

发现打印id值不再为0,打开Navicat发现第二次插入数据的id值为7,与控制台打印的id相同,说明程序正确返回了自增主键的值

<2>返回uuid主键

  <insert id="insert" parameterType="com.sandking.mybatis.pojo.BbsEmployee">    //在执行insert操作前执行查询    <selectKey keyColumn="id" keyProperty="id" order="BEFORE"               resultType="String">      SELECT LAST_INSERT_ID()    </selectKey>    INSERT INTO `bbs_user`    (username,password) VALUES    (#{username},#{password})  </insert>

3.更新数据

  //根据id值确定更改哪条数据  <insert id="update" parameterType="com.sandking.mybatis.pojo.BbsEmployee">    UPDATE `bbs_employee` SET    password = #{password} WHERE id = #{id}  </insert>
    @Test    public void update(){        SqlSession sqlSession = sqlSessionFactory.openSession();        BbsEmployee bbsEmployee = new BbsEmployee();        bbsEmployee.setId(5);        bbsEmployee.setPassword("3425");        sqlSession.update("update",bbsEmployee);        sqlSession.commit();        sqlSession.close();    }

这里写图片描述

4.删除数据

<delete id="delete" parameterType="int">    DELETE FROM `bbs_employee` WHERE id = #{id}  </delete>
@Test    public void delete(){        SqlSession sqlSession = sqlSessionFactory.openSession();        sqlSession.delete("delete",6);        sqlSession.commit();        sqlSession.close();    }