MyBatis MapperXML文件insert、update、delete元素标签、多参数传入

注意:在实现增删改查时,必须手动提交数据,即session.commit(),否则增删改查的语句回滚连接数据库了,导致插入增删改查失败。

InsertInter接口

package com.mybatis.dao;

import com.mybatis.employee.Employee;

public interface InsertInter {
    public void insertEmpByid(Employee employee);
    public void insertEmpByid2(String names, String sex, String email);
    public void updateEmpByid(Employee employee);
}

 Employee类,注意要先实现无参数构造方法,在实现有参数构造方法

package com.mybatis.employee;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Employee {

    private Integer id;
    private String names;
    private String sex;
    private String email;

    //有参数构造器
    public Employee(Integer id, String names, String sex, String email) {
        this.id = id;
        this.names = names;
        this.sex = sex;
        this.email = email;
    }

    //无参构造器
    public Employee() {
        super();
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", names='" + names + '\'' +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

Mapper.xml文件

<?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">
<mapper namespace="com.mybatis.dao.InsertInter">
    <insert id="insertEmpByid">
        insert into table_employee(names,sex,email) values (#{names},#{sex},#{email})
    </insert>

    <update id="updateEmpByid" >
        update table_employee set names = #{names},sex = #{sex},email = #{email} where id = #{id}
    </update>
</mapper>

 实现类

package com.mybatis.employee.test;

import java.io.IOException;
import java.io.InputStream;

import com.mybatis.dao.EMPInter;
import com.mybatis.dao.EmployeeMapper;
import com.mybatis.dao.InsertInter;
import com.mybatis.employee.EMP;
import com.mybatis.employee.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;

public class MyBatisTest {

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
         return new SqlSessionFactoryBuilder().build(inputStream);
    }

    
    @Test
    public void testUpdate() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();


        /*
        try {
            InsertInter insertInter = session.getMapper(InsertInter.class);
            Employee employee = new Employee(null,"123456","男","123456@163.com");

            insertInter.insertEmpByid(employee);
            session.commit();
            System.out.println("成功");
        } finally {
            session.close();
        }
        */
        try {
            InsertInter insertInter = session.getMapper(InsertInter.class);
            Employee employee = new Employee(3,"789","nv","789@163.com");

            insertInter.updateEmpByid(employee);
            session.commit();
            System.out.println("成功");
        } finally {
            session.close();
        }
    }
}

insert、update、delete语法

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

<update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

<delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">
 
属性描述
id命名空间中的唯一标识符,可被用来代表这条语句。
parameterType将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
parameterMap这是引用外部 parameterMap 的已经被废弃的方法。使用内联参数映射和 parameterType 属性。
flushCache将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句)。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。
statementTypeSTATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
useGeneratedKeys(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
keyProperty(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
databaseId如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。

下面就是 insert,update 和 delete 语句的示例:

<insert id="insertAuthor">
  insert into Author (id,username,password,email,bio)
  values (#{id},#{username},#{password},#{email},#{bio})
</insert>

<update id="updateAuthor">
  update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
  where id = #{id}
</update>

<delete id="deleteAuthor">
  delete from Author where id = #{id}
</delete>

如前所述,插入语句的配置规则更加丰富,在插入语句里面有一些额外的属性和子元素用来处理主键的生成,而且有多种生成方式。

首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server,Oracle数据库不支持),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上就OK了。例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>

如果你的数据库还支持多行插入, 你也可以传入一个Authors数组或集合,并返回自动生成的主键。

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

对于不支持自动生成类型的数据库或可能不支持自动生成主键的 JDBC 驱动,MyBatis 有另外一种方法来生成主键。

这里有一个简单(甚至很傻)的示例,它可以生成一个随机 ID(你最好不要这么做,但这里展示了 MyBatis 处理问题的灵活性及其所关心的广度):

<insert id="insertAuthor">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>

在上面的示例中,selectKey 元素将会首先运行,Author 的 id 会被设置,然后插入语句会被调用。这给你了一个和数据库中来处理自动生成的主键类似的行为,避免了使 Java 代码变得复杂。

selectKey 元素描述如下:

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">
属性描述
keyPropertyselectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。
statementType与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。

多参数传入

1、利用接口类注解的方式@Param

接口类

package com.mybatis.dao;

import com.mybatis.employee.Employee;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

public interface InsertInter {

    public Employee getEmpByIdNames(@Param("id") Integer id, @Param("names") String names);
}

Mapper.xml文件

<?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">
<mapper namespace="com.mybatis.dao.InsertInter">
   
    <select id="getEmpByIdNames" resultType="com.mybatis.employee.Employee">
        select * from table_employee where id = #{id} and names =#{names}
    </select>

   
</mapper>

测试类

 /*
    * 传入多个参数
    * */
    @Test
    public void testIdAndNames() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();

        try {
            InsertInter insertInter = session.getMapper(InsertInter.class);
            Employee employee = insertInter.getEmpByIdNames(1,"tom");

            System.out.println(employee);
        } finally {
            session.close();
        }
    }

2、利用param标号(不推荐,因为不明确,不利于维护等)

接口类

package com.mybatis.dao;

import com.mybatis.employee.Employee;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

public interface InsertInter {
   
    public Employee getEmpByIdNames(Integer id,String names);
}

Mapper.xml文件

<?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">
<mapper namespace="com.mybatis.dao.InsertInter">

    <select id="getEmpByIdNames" resultType="com.mybatis.employee.Employee">
       
        select * from table_employee where id = #{param1} and names =#{param2}

    </select>

</mapper>

测试类

/*
    * 传入多个参数
    * */
    @Test
    public void testIdAndNames() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();

        try {
            InsertInter insertInter = session.getMapper(InsertInter.class);
            Employee employee = insertInter.getEmpByIdNames(1,"tom");

            System.out.println(employee);
        } finally {
            session.close();
        }
    }

3、利用Map方式

接口类

package com.mybatis.dao;

import com.mybatis.employee.Employee;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

public interface InsertInter {
  
    public Employee selectMapid(Map<String, Object> emp);

}

Mapper.xml文件

 <select id="selectMapid" resultType="com.mybatis.employee.Employee">
        select * from table_employee where id = #{id} and names = #{names}
 </select>

测试类

/*
     * 传入多个参数Map方式
     * */
    @Test
    public void testIdMap() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();

        try {
            InsertInter insertInter = session.getMapper(InsertInter.class);
            Map<String,Object> map = new HashMap<>() ;
            map.put("id",1);
            map.put("names","tom");
            Employee employee = insertInter.selectMapid(map);
            System.out.println(employee);
        } finally {
            session.close();
        }
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值