insert 方法:
说明: BaseMapper 接口中提供了数据新增insert 方法
作用:完成数据新增
参数: 封装要新增的数据对象
使用:
直接调用就可以,运行的时候根据实体类动态生成sql语句,会判断实体类中的属性值是否为null,只有非null的才会拼接在sql语句中完成新增
注意:
需要在实体类中用@TableName注解指定实体类对应的表,如果实体类和表名一致可以省略不写
需要在对应的主键属性上使用注解@TableId,表明该属性是表的主键,并且需要说明主键设置类型,比如:自增
需要在普通属性上使用注解@TableField,表明改改属性对应表的字段的名称,如果属性名称和表的字段名称一致,可以省略
@Testpublic void testInsert(){//创建一个学生Student stu = new Student(); stu.setSname("黄药师"); stu.setSage(70); stu.setSphone("1234"); stu.setSsex("1");int insert = studentMapper.insert(stu); System.out.println("insert = " + insert); }
所有的属性都有的sql:
INSERT INTO t_student ( s_name, sage, ssex, sphone ) VALUES ( ?, ?, ?, ? )
@Testpublic void testInsert1(){//创建一个学生Student stu = new Student(); stu.setSname("黄药师"); stu.setSphone("aaaa");int insert = studentMapper.insert(stu); System.out.println("insert = " + insert); }
没有属性后动态生成的sql:
INSERT INTO t_student ( s_name, sphone ) VALUES ( ?, ? )
修改操作
UpdateById方法:
作用:更新数据到数据库中
参数: 更新的数据
注意:
根据主键ID作为条件来完成更新,并且更新实体类中有值的属性,null值的属性不参与更新
@Testpublic void testUpdate(){//创建一个学生Student stu = new Student(); stu.setSname("张无忌"); stu.setSage(24); stu.setSid(5);int update = studentMapper.updateById(stu); System.out.println("update = " + update); }
查询操作
SelectById方法:通过第查询数据
参数: 要查询的数据id
返回值:查询结果的实体对象
@Testpublic void query01(){ Student student = studentMapper.selectById(1); System.out.println("student = " + student); }
selectByMap 方法: 根据指定的字段查询数据
参数: 指定的字段及字段值的map集合
返回值:查询结果的list集合
注意:
map中的键名为要查询的数据的字段名
@Testpublic void query02(){ MapcolMap = new HashMap<>(); colMap.put("s_name","黄蓉"); colMap.put("sage",24); List students = studentMapper.selectByMap(colMap); System.out.println("students = " + students); }
selectBatchIds方法:
作用: 根据id查询数据:
参数:要查询的数据的id的集合
返回值:存储查询结果的list集合
@Testpublic void query03(){ Listlist =new ArrayList<>();list.add(1);list.add(2);list.add(3); List students = studentMapper.selectBatchIds(list); System.out.println("students = " + students); }
删除操作
deleteById() 方法 通过id删除
@Testpublic void delete01(){int i = studentMapper.deleteById(1); System.out.println("i = " + i); }
deleteByMap() 放 通过指定的字段完整数据删除
@Testpublic void delete02(){ MapcolMap = new HashMap<>(); colMap.put("s_name","黄蓉"); colMap.put("sage",24);int i = studentMapper.deleteByMap(colMap); System.out.println("i = " + i); }
deleteBatchIds() 多选删除,通过符合id要求的数据全部删除
@Testpublic void delete03(){ Listlist =new ArrayList<>();list.add(1);list.add(2);list.add(3);int i = studentMapper.deleteBatchIds(list); System.out.println("i = " + i); }
原理:
问题: xxxMapper 继承了BaseMapper
通过现象看到本质
StudentMapper的本质
org.apache.ibatis.binding.MapperProxy
MapperProxy 中 sqlSession –>SqlSessionFactory
SqlSessionFacotry 中→ Configuration→ MappedStatements
每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件中的一个 SQL。
MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保存到 configuration 对象中的 mappedStatements 中.
本质:
Configuration: MyBatis 或者 MP 全局配置对象
MappedStatement:一个MappedStatement 对象对应 Mapper 配置文件中的一个
select/update/insert/delete 节点,主要描述的是一条SQL 语句
SqlMethod : 枚举对象,MP 支持的 SQL 方法
TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息
SqlSource: SQL 语句处理对象
MapperBuilderAssistant: 用于缓存、SQL 参数、查询方剂结果及处理等.
通过 MapperBuilderAssistant 将每一个 mappedStatement
添加到 configuration 中的mappedstatements 中