MyBatis之xml开发and注解开发--实现增删改查功能
目录
一:注解开发
1.1 通用Mapper和注解可混用,写在同一个接口中
2.2 通用Mapper(对于单表而言)
3.1Mybatis注解sql语句
二、Mybatis映射xml
重点1:动态SQL语句多条件查询
重点2:动态SQL语句In查询
4.1.3 多表查询映射
图集总结
一:注解开发
1.1 通用Mapper和注解可混用,写在同一个接口中
对于一些简单的普通的增删改查,接口可继承通用Mapper进行实现
对于一些复杂的增删改查功能可在接口方法上写明注解sql 开发实现
2.2 通用Mapper(对于单表而言)
2.2.1 准备说明
-
仅仅适用于单表而言的增删改查
-
所创建的接口只需继承mapper接口,以及在javaBean类中注释说明表名和主键
资源:MyBatisUtils工具类 --- > 获得Mapper的会话工厂并进行会话,提交事务回滚事务等操作
package com.czxy.ums.utils;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 tk.mybatis.mapper.common.Mapper;import tk.mybatis.mapper.common.MySqlMapper;import tk.mybatis.mapper.entity.Config;import tk.mybatis.mapper.mapperhelper.MapperHelper;import java.io.InputStream;public class MyBatisUtils {//会话工厂private static SqlSessionFactory factory;/初始化:会话工厂*/static{try{//1、获取资源流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2、获取会话工厂factory = new SqlSessionFactoryBuilder().build(is);}catch(Exception e){throw new RuntimeException(e);}}/使用ThreadLocal,管理某个线程的SqlSession*/private static ThreadLocal local = new ThreadLocal();/获取新会话*/public static SqlSession openSession(){SqlSession session = null;session = local.get();if(session==null){session = factory.openSession();//创建一个MapperHelperMapperHelper mapperHelper = new MapperHelper();//特殊配置Config config = new Config();// 3.3.1版本增加config.setEnableMethodAnnotation(true);config.setNotEmpty(true);//设置配置mapperHelper.setConfig(config);// 注册通用Mapper接口 - 可以自动注册继承的接口mapperHelper.registerMapper(Mapper.class);mapperHelper.registerMapper(MySqlMapper.class);//配置完成后,执行下面的操作mapperHelper.processConfiguration(session.getConfiguration());local.set(session);}return session;}/关闭会话*/public static void close(){SqlSession session = local.get();if(session!=null){session.close();//不删除会导致线程再次使用到一个关闭的SqlSession会话local.remove();}}/提交并关闭事务*/public static void commitAndClose(){SqlSession session = local.get();if(session!=null){session.commit();close();}}/回滚并关闭事务*/public static void rollbackAndClose(){SqlSession session = local.get();if(session!=null){session.rollback();close();}}/获取Mapper * 注:若session已被关闭,必须重新调用getMapper获取新的Dao对象 * */public static T getMapper(Class clazz){return openSession().getMapper(clazz);}}
图片展示工具类所在idea的位置【可自行定义】
步骤:定义接口---》继承Mapper --- 》 测试类调用接口中的方法
2.2.2步骤
------1. 创建JavaBean并对其进行注释说明表名和主键
-----2. 创建mapper接口继承mapper类 【Mapper】
注:接口继承了Mapper,可对单表进行简单查询
同时接口中还可进行注解开发,在接口上书写注解 sql语句进行复杂查询
------3.编写测试类,直接调用mapper类中的方法进行增删改查 【可供参考】
2.2.3 通用Mapper中的方法
- 查询方法
方法名 |
描述 |
T selectOne(T t) |
根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号 |
List select(T t) |
根据实体中的属性值进行查询,查询条件使用等号 |
List selectAll() |
查询全部结果 |
int selectCount(T t) |
根据实体中的属性查询总数,查询条件,使用等号 |
T selectByPrimaryKey(Object key) |
根据主键字段进行查询 |
boolean existsWhithPrimaryKey(Object key) |
根据主键字段查询记录是否存在 |
List selectByExample(Object example) |
根据Example条件进行查询 |
T selectOneByExample(Object example) |
根据Example条件进行查询,只能有一个返回值 |
int selectCountByExample(Object example) |
根据Example条件进行查询记录数 |
- 插入方法
方法名 |
描述 |
int insert(T t) |
保存一个实体,null的属性也会保存,不会使用数据库默认值 |
int intsertSelective(T t) |
保存一个实体,null的属性不会保存,使用数据库默认值 |
- 更新方法
方法名 |
描述 |
int updateByPrimaryKey(T t) |
根据主键更新实体全部字段,null值会被更新 |
int updateByPrimaryKeySelective(T t) |
根据主键更新实体中不为null值的字段 |
- 删除方法
方法名 |
描述 |
int delete(T t) |
根据实体属性作为条件进行删除,查询条件使用等号 |
int deletePrimaryKey(Object key) |
根据主键字段进行删除 |
int deleteByExample(Object example) |
根据Example条件删除数据 |
3.1Mybatis注解sql语句
//查询所有 @Select("select * from student") //sql语句 List list (); //接口方法 //查询指定用户 @Select("select * from student where sid=#{sid}") Student selectById(@Param("sid") String id); //添加 @Insert("insert into student(loginname,studentname,password,gender,major,birth,telephone,hobby,photo,remark) values(#{loginname},#{studentname},#{password},#{gender},#{major},#{birth},#{telephone},#{hobby},#{photo},#{remark})") Integer add(Student student); //删除 @Delete("delete from student where sid=#{sid}") Integer delete(@Param("sid") String sid); //修改 @Update("update student set loginname=#{loginname},studentname=#{studentname},password=#{password},gender=#{gender},major=#{major},birth=#{birth},telephone=#{telephone},hobby=#{hobby},photo=#{photo},remark=#{remark} where sid = #{sid}") Integer update(Student student); //模糊查询 @Select("select * from student where studentname like #{studentname}") List likeAll(String sid);
3.1.1注意事项:
-
1.在查询指定条件以及删除时要给予条件 id=#{id}
-
2.在添加时,添加用户时, 表名后面的()中的字段必须要和数据库保持一致,values中的()尽量, 与表名后面的()字段保持一致;
-
3.在修改时 set后面的字段 等号(=) 的左边字段必须和数据库保持一致,右边#{}中字段尽量保持一致
3.1.2 多表映射
----- 基本字段详解
@Results(id = "设置映射id",value = { @Result(property = "javaBean中的属性",column = "数据库中的列"), @Result(property = "javaBean中的集合",column = "数据库中的列",many = @Many(select = "要映射的方法全路径名"))})many == 用来映射返回结果是集合,多个用户的字段, 【一对多】 @Results(id = "可设置自己的id,也可调用已经映射好的id进行引用",value = { @Result(property = "javaBean中的属性",column = "数据库中的列"), @Result(property = "JavaBean中的对象",column = "数据库中的列",one = @One(select = "要映射返回的方法全路径名")) }) one == 用来映射返回结果是单个的,一个用户的字段 【多对一】
--- 图集详解 【可供参考】
二、Mybatis映射xml
4.1.2 准备工作
---------1.导入已经写好的UserMapper.xml
在此进行SQL语句的编写<!--select * from user -->
-------2. Mysql核心配置文件进行设置扫描
重点1:动态SQL语句多条件查询
- 在按照需求在UserMapper.xml中书写SQL语句【可供参考】
重点2:动态SQL语句In查询
4.1.3 多表查询映射
-
相关字段详解
resultType = "响应返回的类型"parameterType = "传入的类型"resultMap = "根据id调用resultMap中的方法" 映射方法,相对于一个子查询,在一个查询里面套 一个子查询 collection标签返回多个用户,列,当调用的方法返回的是一个集合时使用该标签 【多对一】 association标签返回单个用户或列,当调用的方法返回的是一个对象时使用 【一对多】
---- 图集详解【可供参考】