一、增删改查
- 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]