一:注解开发
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<SqlSession> local = new ThreadLocal<SqlSession>(); /**获取新会话*/ public static SqlSession openSession(){ SqlSession session = null; session = local.get(); if(session==null){ session = factory.openSession(); //创建一个MapperHelper MapperHelper 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> T getMapper(Class<T> clazz){ return openSession().getMapper(clazz); } }
图片展示工具类所在idea的位置【可自行定义】
步骤:定义接口---》继承Mapper<类名> --- 》 测试类调用接口中的方法
2.2.2步骤
------1. 创建JavaBean并对其进行注释说明表名和主键
-----2. 创建mapper接口继承mapper类 【Mapper<写与之相关的JavaBean类名>】
注:接口继承了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<Student> 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<Student> 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
<?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"> <!-- namespace必须为对应dao接口的全类名 --> <mapper namespace="com.czxy.demo1.dao.UserDao"> 在此进行SQL语句的编写 <!--<select id="selectAll" resultType="com.czxy.demo1.domain.User"> select * from user </select> --> </mapper>
-------2. Mysql核心配置文件进行设置扫描
重点1:动态SQL语句多条件查询
- 在按照需求在UserMapper.xml中书写SQL语句【可供参考】
重点2:动态SQL语句In查询
4.1.3 多表查询映射
- 相关字段详解
1.resultType = "响应返回的类型" parameterType = "传入的类型" resultMap = "根据id调用resultMap中的方法" <resultMap id = "id"> <result property = "javaBean中的一个属性" column = "数据库中的列"/> </resultMap> 映射方法,相对于一个子查询,在一个查询里面套 一个子查询 <collection/> collection标签返回多个用户,列,当调用的方法返回的是一个集合时使用该标签 【多对一】 <association/> association标签返回单个用户或列,当调用的方法返回的是一个对象时使用 【一对多】
---- 图集详解【可供参考】
图集总结