- IDE:IDEA: 2022.2.4。
- 构建工具:maven 3.8.5
- MySQL版本:MySQL8
- MyBatis 版本:MyBatis 3.5.7
pom.xml
org.mybatis mybatis 3.5.7 junit junit 4.12 test mysql mysql-connector-java 8.0.16
建议命名:mybatis-config.xml
放置路径:src/main/resources
核心配置文件作用:
- 配置链接数据库的环境
- 配置MyBatis
mybatis-config.xml
相当于DAO,但是不用创建实现类,MyBatis会创建代理类,并执行映射文件当中的SQL。
起名规则:POJO的名+Mapper
放置路径:src/main/java/com/atguigu/mybatis/mapper/UserMapper.java
package com.atguigu.mybatis.mapper;public interface UserMapper {/*** 添加用户信息*/int insertUser();
}
Mapper 接口当中的一个抽象方法 对应 映射文件当中的一个SQL语句。
起名规则:POJO的名+Mapper.xml
放置路径:src/main/resources/com/atguigu/mybatis/mapper/UserMapper.xml
这里我们写一条固定的插入SQL,参数如何传递请请看后方比较详细的笔记。
UserMapper.xml
下方代码:从开始到创建 SqlSessionFactory 只用创建一次即可,因此可以单独封装即可。
openSession() 获得 SqlSession 默认是不自动提交事务,因此需要自己手动提交。
放置路径:src/test/java/com/atguigu/mybatis/test/MybatisTest.java
MybatisTest.java
package com.atguigu.mybatis;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 org.junit.Test;
import com.atguigu.mybatis.mapper.UserMapper;import java.io.IOException;
import java.io.InputStream;public class MyBatisTest {@Testpublic void testInsert() throws IOException {// 获取核心配置文件的输入流InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");// 获取SqlSessionFactoryBuilder 对象 -> 工厂构建器SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 创建 SqlSession 工厂 -> 创建会话SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);// 获取 会话 对象 -> MyBatis 提供的操作数据库的对象SqlSession sqlSession = sqlSessionFactory.openSession();// 获得Mapper接口的代理类 -> 操纵Mapper类执行数据库操作UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 执行SQL操作Integer rows = userMapper.insertUser();System.out.println("rows = " + rows);// 提交事务 -> 事务是默认开启的sqlSession.commit();// 关闭资源sqlSession.close();}
}
日志级别:FATAL(致命)> ERROR(错误)>WARN(警告)INFO(信息)> DEBUG(调试)
从左到右打印的内容越来越详细.
pom.xml
log4j log4j 1.2.17
放置路径:src/main/resources/log4j.xml
网址爆红不用管他
log4j.xml
- 1.单个字面量类型(基本数据类型)
- 2.多个字面量类型(基本数据类型)
- 3.Map
- 4.单个POJO(最常用)
- 5.@Param (最常用)
- 6.List<泛型>
src/main/java/com/atguigu/mybatis/mapper/UserMapper.java
package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;import java.util.Map;/*** Mybatis获取参数值的两种方式:#{}和${}* #{}的本质是占位符赋值;(较为多的使用)* ${}的本质是字符串拼接;* 1、若mapper接口方法的参数为单个的字面量类型,此时可以通过#{}或${}以任意内容获取参数值,但是一定要注意${}的单引号问题。* 2、若mapper接口方法的参数是多个的字面临类型,此时Mybatis会将参数放入map集合中,以两种方式存储数据:* (1)以arg0、arg1....为键,以参数为值;* (2)以param1、param2....为键,以参数为值;* 因此,我们只需要通过#{}和${}访问map集合的键,就可以拿到参数值。* 3、若mapper接口方法的参数为一个map集合类型的参数,此时我们只需要通过#{}和${}访问map集合的键,就可以拿到相对应参数值。* 4、若mapper接口方法的参数为实体类类型的参数,此时我们只需要通过#{}和${}访问实体类中属性名,就可以拿到相对应的参数值。* 5、可以在mapper接口方法的参数上设置@Param注解,此时mybatis会将这些参数放在map中,以两种方式来进行存储:* (1)以@Param注解的value属性值为键,以参数为值;* (2)以param1、param2....为键,以参数为值;*/
public interface UserMapper {/*** 根据用户名查询用户信息* @param username* @return*/User getUserByUsername(String username);/*** 验证登录* @param username* @param password* @return*/User checkLogin(String username,String password);/*** {username: "xxxx"}* {password: "xxxx"}* @param map* @return*/User cheLoginByMap(Map map);/*** 添加用户信息的功能* @param user*/void insertUser(User user);/*** 验证登录功能(使用@Param注解方式)* @param username* @param password* @return*/User checkLoginByParam(@Param("username") String username, @Param("password") String password);
}
src/main/resources/com/atguigu/mybatis/mapper/UserMapper.xml
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
查询功能:
- 返回结果是一个实体类
- 返回结果是一个List集合
- 返回结果是一个单行单列的数据
- 返回结果是一个Map集合
- 返回结果是一个map的list集合
src/main/java/com/atguigu/mybatis/mapper/SelectMapper.java
package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface SelectMapper {/*** 1、若SQL语句查询的结果为多条时,一定不能以实体类类型为返回值,否则会抛出异常(TooManyResultException);* 2、若SQL语句查询的结果为一条时,此时可以使用实体类类型或List集合类型来作为方法的返回值;*//*** 根据id来查询用户信息* @param id* @return*/User getUserById(@Param("id") Integer id);/*** 获取所有的用户信息* @return*/List getAllUser();/*** 查询用户的总数量* @return*/Integer getCount();/*** 根据用户id查询用户信息为一个map集合* @param id* @return*/Map getUserByIdToMap(@Param("id") Integer id);/*** 获取所有用户信息到一个map集合* 若查询的数据有多条时,并且要将每条数据转换为map集合,此时有两种解决方案:* 1、将mapper接口方法的返回值设置为泛型是map的List集合;* 2、将每条数据转换的map集合放到一个大的map集合中,但是必须通过@MapKey注解,将查询的某个字段的值作为这个大的map的键* (id作为键,小map作为值)* {* 2={password=123456, gender=男, id=2, age=23, email=12345@qq.com, username=admin},* 3={password=123, gender=男, id=3, age=23, email=12345@qq.com, username=root},* 5={password=123456, gender=男, id=5, age=23, email=12345@qq.com, username=admin}* }* @return*///List
src/main/resources/com/atguigu/mybatis/mapper/SelectMapper.xml
特殊的SQL语句:
- 模糊查询
- 批量删除
- 动态设置表名
- 添加信息并获取自增的主键
src/main/java/com/atguigu/mybatis/mapper/SpecialSQLMapper.java
package com.atguigu.mybatis.mapper;import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface SpecialSQLMapper {/*** 通过用户名模糊查询用户信息* @param mohu* @return*/List getUserByLike(@Param("mohu") String mohu);/*** 批量删除* @param ids*/void deleteMoreUser(@Param("ids") String ids);/*** 动态设置表名* @param tableName* @return*/List getUserList(@Param("tableName") String tableName);/*** 添加用户信息并获取自增的主键* @param user* @return*/Integer insertUser(User user);
}
src/main/resources/com/atguigu/mybatis/mapper/SpecialSQLMapper.xml
delete from t_user where id in (${ids}) insert into t_user values (null,#{username},#{password},#{age},#{gender},#{email})
属性名和数据库字段名不一致的查询的三种方式:
- 为查询的字段设置别名,和属性名保持一致;
- 当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰。此时可以在mybatis的核心配置文件中设置一个全局配置,可以自动的将下划线映射为驼峰;
- 使用resultMap自定义映射处理;
通过SQL语句起别名的方式解决数据库的字段和实体类的属性名称不一致的问题。
src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml
在核心配置文件配置typeAliases标签以后,就可以直接在映射文件中自动映射。
src/main/resources/mybatis-config.xml
src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml
使用 ResltMap , 注意 resultMap 和 resultType 是二选一的。
POJO:多个emp对应一个Dept,多个成员对应一个部门。
public class Emp {private Integer empId;private String empName;private Integer age;private String gender;//多对一关系,对应的是一个对象private Dept dept;
}
处理多对一的映射关系:
- 级联方式
- association标签:专门用来处理多对一的映射关系(处理实体类类型的属性)
- 分步骤查询方式
src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml
src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml
分布查询需要两个接口方法,然后再各自的映射文件中填写SQL语句,两条语句使用association标签中的select和column连接在一起。
src/main/java/com/atguigu/mybatis/mapper/EmpMapper.java
/*** 通过分步骤查询获取员工及员工部门信息的第一步* @param empId* @return*/Emp getEmpAndDeptByStep(@Param("empId") Integer empId);
src/main/java/com/atguigu/mybatis/mapper/DeptMapper.java
/*** 通过分步骤查询获取员工及员工部门信息的第二步* @return*/Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml
src/main/resources/com/atguigu/mybatis/mapper/DeptMapper.xml
POJO:一个 Dept 对应多个 Emp。一个部门对应多个成员。
public class Dept {private Integer deptId;private String deptName;//一对多,对应的是一个集合private List emps;
}
处理一对多的映射关系:
- collection
- 分步骤查询
src/main/java/com/atguigu/mybatis/mapper/DeptMapper.java
/*** 查询部门以及部门中的员工信息* @param deptId* @return*/Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);
src/main/resources/com/atguigu/mybatis/mapper/DeptMapper.xml
src/main/java/com/atguigu/mybatis/mapper/DeptMapper.java
/*** 分步骤查询-查询部门以及部门中的员工信息-第一步* @param deptId* @return*/Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);
src/main/java/com/atguigu/mybatis/mapper/EmpMapper.java
/*** 分步骤查询-查询部门以及部门中的员工信息-第二步* @param deptId* @return*/List getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);
src/main/resources/com/atguigu/mybatis/mapper/DeptMapper.xml
src/main/resources/com/atguigu/mybatis/mapper/EmpMapper.xml