一、增删改查

  • mybatis允许增删改的方法直接定义返回值为Integer、Long、Boolean、void这些类型的,mybatis会自动帮我们封装返回值
  • sqlSessionFactory.openSession(),获取到的SqlSession不会自动提交数据,我们需要手动提交数据;sqlSessionFactory.openSession(true);===》自动提交

映射插入语句

  • 自增主键添加

mysql支持自增主键
  useGeneratedKeys="true";使用自增主键获取主键值策略
  keyProperty="id";指定对应的主键属性;

mybatis利用statement.getGenreatedKeys()获取到自增主键值后,将这个值封装给javaBean的哪个属性;不定义的话对象是获取不到id值的

    <insert id="addEmp" parameterType="com.mybatis.bean.Employee"
        useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
        insert into tbl_employee(last_name,email,gender) 
        values(#{lastName},#{email},#{gender})
    </insert>
  • 非自增主键添加

Oracle不支持自增,Oracle使用序列来模拟自增,每次插入的数据的主键是从序列中拿到的值;
  keyProperty:查出的主键值封装给javaBean的哪个属性
order="BEFORE":先运行selectKey查询id的sql;查出id值封装给javaBean的id属性
     resultType:查出的数据的返回值类型
    <insert id="addEmp" databaseId="oracle">
        <selectKey keyProperty="id" order="BEFORE" resultType="Integer">
            select EMPLOYEES_SEQ.nextval from dual 
        </selectKey>
        
        insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
        values(#{id},#{lastName},#{email<!-- ,jdbcType=NULL -->}) 
    </insert>
  
order="AFTER":先运行插入的sql(从序列中取出新值作为id);再运行selectKey查询id的sql;
ps:如果同时插入多条数据,这样获取到的序列值不是当前插入的id
 <insert id="addEmp" databaseId="oracle">
        <selectKey keyProperty="id" order="AFTER" resultType="Integer">
         select EMPLOYEES_SEQ.currval from dual
        </selectKey>
       
        insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
        values(employees_seq.nextval,#{lastName},#{email}) 
    </insert>

映射删除语句

<delete id="deleteEmpById">
    delete from tbl_employee where id=#{id}
</delete>

映射更新语句

<update id="updateEmp">
        update tbl_employee 
        set last_name=#{lastName},email=#{email},gender=#{gender}
        where id=#{id}
</update>

映射查询语句

<select id="getEmpById" resultType="com.mybatis.bean.Employee">
        select * from tbl_employee where id = #{id}
</select>

代码

@Test
    public void test03() throws IOException{
        
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //获取到的SqlSession不会自动提交数据
        SqlSession openSession = sqlSessionFactory.openSession();
        
        try{
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            //测试添加
            Employee employee = new Employee(null, "jerry4",null, "1");
            mapper.addEmp(employee);
            System.out.println(employee.getId());
            
            //测试修改
            //Employee employee = new Employee(1, "Tom", "jerry@com", "0");
            //boolean updateEmp = mapper.updateEmp(employee);
            //System.out.println(updateEmp);
            //测试删除
            //mapper.deleteEmpById(2);
            //手动提交数据
            openSession.commit();
        }finally{
            openSession.close();
        }

二、参数处理

  • sql映射文件中的参数类型parameterType可以省略,mybatis会根据TypeHandle自动判断;个人认为如果写入的话能让开发者更清楚对应的是哪个JavaBean类或者哪种数据结构。
  • returnType定义别名或全类名

mybatis传入参数

1、单个参数:mybatis不会做特殊处理,#{参数名/任意名}:取出参数值。

2、多个参数:mybatis会做特殊处理。多个参数会被封装成 一个map,mybatis会帮我们把多个参数的key定义成param1...paramN

key:param1...paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值;

  如果我们按照接口方法传入的参数名称去获取会出现以下异常

操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}


异常:
org.apache.ibatis.binding.BindingException: 
Parameter 'id' not found. 
Available parameters are [1, 0, param1, param2]
View Code

相关文章:

  • 2021-10-08
  • 2019-01-31
  • 2023-02-26
  • 2022-03-04
  • 2022-12-23
  • 2020-06-15
  • 2022-03-06
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-08
  • 2021-08-10
  • 2021-11-28
相关资源
相似解决方案