MyBatis

目录

依赖

mysql核心配置文件(mysql-config.xml)

mybatis工具类

mapper接口

junit测试

select语句

注意:

ResultMap(结果集映射)

日志

log4j

@Param()注解

lombok的使用

多对一的查询处理(多个学生对应一个老师)

一对多的查询处理(一个老师对多个学生)

动态SQL

缓存


依赖

mybatis依赖

 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.6</version>
         </dependency>

mybatis项目依赖

<!--import dependencies-->
     <dependencies>
         <!--mysql driver-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.47</version>
         </dependency>
         <!--mybatis-->
         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.6</version>
         </dependency>
         <!--junit-->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
         </dependency>
     </dependencies>

mysql核心配置文件(mysql-config.xml)

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <!--configuration core file-->
 <configuration>
 ​
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                 <property name="username" value="root"/>
                 <property name="password" value="root"/>
             </dataSource>
         </environment>
     </environments>
 ​
     <!--a Mapper.xml need regist in Mybatis core configuration file-->
     <!--没有这句话就报错
     org.apache.ibatis.binding.BindingException: Type interface com.shuai.dao.UserDao is not known to the MapperRegistry.-->
     <mappers>
         <mapper resource="com/shuai/dao/UserMapper.xml"/>
     </mappers>
 </configuration>

解析配置文件

 configuration(配置)
  properties(属性)
  settings(设置)
  typeAliases(类型别名)
  typeHandlers(类型处理器)
  objectFactory(对象工厂)
  plugins(插件)
  environments(环境配置)
   environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
  databaseIdProvider(数据库厂商标识)
  mappers(映射器)

环境配置(environments)

Mybatis可以配置成适应多种环境 不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。 学会使用配置多套运行环境! Mybatis默认的事务管理器就是JDBC,连接池:POOLED

属性(properties)

我们可以通过properties属性来实现引用配置文件 这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可通过properties元素的子元素来传递。【db.properties】 编写一个配置文件

db.properties

driver=com.mysql.cj.jdbc.Driver
 url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
 username=root
 password=123456

在核心配置文件中引入

 <!--引入外部配置文件-->
 <properties resource="db.properties">
     <property name="username" value="root"/>
     <property name="pwd" value="root"/>
 </properties>

可以直接引入外部文件 可以在其中增加一些属性配置 如果两个文件有同一个字段,优先使用外部配置文件的!

类型别名(typeAliases)

类型别名是为Java类型设置一个短的名字。

存在的意义仅在于用来减少类完全限定名的冗余。

<!--可以给实体类起别名-->
     <typeAliases>
         <typeAlias type="com.kuang.pojo.User" alias="User" />
     </typeAliases>

也可以指定一个包名,MyBatis会在包名下面搜索需要的JavaBean,比如:

扫描实体类的包,它的默认别名就为这个类的类名,首字母小写!

<!--可以给实体类起别名-->
 <typeAliases>
     <package name="com.kuang.pojo"/>
 </typeAliases>

在实体类比较少的时候,使用第一种方式。 如果实体类十分多,建议使用第二种。 第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解

 @Alias("user")
 //实体类
 public class User {}

映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件;

方式一:【推荐使用】

 <!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
 <mappers>
     <mapper resource="com/kuang/dao/UserMapper.xml"/>
 </mappers>

方式二:使用class文件绑定注册

 <!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
 <mappers>
     <mapper class="com.kuang.dao.UserMapper"/>
 </mappers>

注意点:

接口和它的Mapper配置文件必须同名! 接口和它的Mapper配置文件必须在同一个包下!

方式三:使用扫描包进行注入绑定

<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
 <mappers>
     <package name="com.kuang.dao"/>
 </mappers>

注意点:

接口和它的Mapper配置文件必须同名! 接口和它的Mapper配置文件必须在同一个包下!

mybatis工具类

读取配置文件,获取工厂

//SqlSessionFactory -->SqlSession
 public class MybatisUtils {
 ​
     private static SqlSessionFactory sqlSessionFactory;
     static {
 ​
         try {
             //使用Mybaties第一步:获取sqlSessionFactory对象
             String resource = "mybatis-config.xml";
             InputStream inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 ​
     //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
     // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
     public static SqlSession getSqlSession(){
 //        SqlSession sqlSession =  sqlSessionFactory.openSession();
 //        return sqlSession;
 ​
         return sqlSessionFactory.openSession();
     }
 ​
 }

mapper接口

 <?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">
 <mapper namespace="com.kuang.dao.UserDao">
 ​
     <!--sql-->
     <select id="getUserList" resultType="com.kuang.pojo.User">
         select * from mybatis.user
     </select>
 </mapper>
namespace后边跟着的包名必须和mapper接口名一致(这里命名写的是dao)

junit测试

 @Test
     public void test(){
         //第一步:获得SqlSession对象
         SqlSession sqlSession = MybatisUtils.getSqlSession();
 ​
         //方式一:getMapper
         UserDao userDao = sqlSession.getMapper(UserDao.class);
         List<User> userList = userDao.getUserList();
 ​
         for (User user : userList) {
             System.out.println(user);
         }
 ​
         //关闭SqlSession
         sqlSession.close();
         
     }

select语句

选择,查询语句;

  • id:就是对应的namespace中的方法名;

  • resultType:Sql语句执行的返回值!

  • parameterType:参数类型!

注意:

  • 增删改需要提交事务!不然数据库中数据不会变化

  •  sqlSession.commit();

模糊查询怎么写?

java代码执行的时候,传递通配符% %

 List<User> userList = mapper.getUserLike("%李%");

在sql拼接中使用通配符!

 select * from mybatis.user where name like "%"#{value}"%"

ResultMap(结果集映射)

处理实体类中字段名称与数据库中字段名称不同时的问题

 <!--  结果集映射  -->
     <resultMap id="UserMap" type="User">
         <!--column数据库中的字段,property实体类中的属性-->
         <result column="id" property="id" />
         <result column="name" property="name" />
         <result column="pwd" property="password" />
     </resultMap>
 ​
     <select id="getUserById" parameterType="int" resultMap="UserMap">
         select * from mybatis.user where id = #{id}
     </select>

日志

日志工厂

如果一个数据库操作出现了异常,我们需要排错。日志就是最好的助手! 曾经:sout、debug 现在:日志工厂!

  • SLF4J

  • LOG4J 【掌握】

  • LOG4J2

  • JDK_LOGGING

  • COMMONS_LOGGING

  • STDOUT_LOGGING【掌握】

  • NO_LOGGING

    在Mybatis中具体使用哪一个日志实现,在设置中设定!STDOUT_LOGGING标准日志输出 在mybatis-config.xml核心配置文件中,配置我们的日志!

     <settings>
         <setting name="logImpl" value="STDOUT_LOGGING"/>
     </settings>
    

log4j

什么是Log4j?

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件

  • 我们也可以控制每一条日志的输出格式;

  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

  • 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

    1.pom.xml导入依赖

         <dependencies>
             <!-- https://mvnrepository.com/artifact/log4j/log4j -->
             <dependency>
                 <groupId>log4j</groupId>
                 <artifactId>log4j</artifactId>
                 <version>1.2.17</version>
             </dependency>
         </dependencies>

    2.在resources文件夹下建立log4j.properties文件进行配置

    #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
     log4j.rootLogger = DEBUG,console ,file
     ​
     #控制台输出的相关设置
     log4j.appender.console = org.apache.log4j.ConsoleAppender
     log4j.appender.console.Target = System.out
     log4j.appender.console.Threshold = DEBUG
     log4j.appender.console.layout = org.apache.log4j.PatternLayout
     log4j.appender.console.layout.ConversionPattern =  [%c]-%m%n
     ​
     #文件输出的相关设置
     log4j.appender.file = org.apache.log4j.RollingFileAppender
     log4j.appender.file.File = ./log/shuai.log
     log4j.appender.file.MaxFileSize = 10mb
     log4j.appender.file.Threshold = DEBUG
     log4j.appender.file.layout = org.apache.log4j.PatternLayout
     log4j.appender.file.layout.ConversionPattern = [%p][%d{yy-MM-dd}][%c]%m%n
     ​
     #日志输出级别
     log4j.logger.org.mybatis=DEBUG
     log4j.logger.java.sql=DEBUG
     log4j.logger.java.sql.Statement=DEBUG
     log4j.logger.java.sql.ResultSet=DEBUG
     log4j.logger.java.sql.PreparedStatement=DEBUG

    3.在mybatis-config.xml核心配置文件中,配置log4j为日志的实现!

      <settings>
             <setting name="logImpl" value="LOG4J"/>
         </settings>

    4.测试

简单使用

在要使用Log4j的测试类中,导入包import org.apache.log4j.Logger; 日志对象,参数为当前类的class

 static Logger logger = Logger.getLogger(UserDaoTest.class);

日志级别

 logger.info("info:进入了testLog4j");
 logger.debug("DEBUG:进入了testLog4j");
 logger.error("erro:进入了testLog4j");

之后可在log文件夹中查看日志文件信息

@Param()注解

  • 基本类型的参数或者String类型,需要加上

  • 引用类型不需要加

  • 如果只有一个基本类型的话,可以忽略,但是建议都加上!

  • 我们在SQL中引用的就是我们这里的@Param("")中设定的属性名!

lombok的使用

1.在setting中引入lombok的插件

2.在pom.xml中引入依赖

3.使用lombok中的注解进行简化开发

 @Data               get/set 无参构造等
 @AllArgsConstructor 有参构造
 @NoArgsConstructor  无参构造

多对一的查询处理(多个学生对应一个老师)

学生实体类

 @Data
 public class Student {
     private int id;
     private String name;
     private Teacher teacher;
 }

老师实体类

 @Data
 public class Teacher {
     private int id;
     private String name;
 }

按照结果嵌套处理(用的多)

 <!--按照结果嵌套处理    -->
     <select id="getStudent2" resultMap="StudentTeacher2">
         select s.id sid,s.name sname,t.name tname
         from mybatis.student s,mybatis.teacher t
         where s.tid = t.id
     </select>
 ​
     <resultMap id="StudentTeacher2" type="Student">
                 <result property="id" column="sid"/>
                 <result property="name" column="sname"/>
                 <association property="teacher" javaType="Teacher">
                         <result property="id" column="teacherid"/>
                         <result property="name" column="tname"/>
                 </association>
         </resultMap>

按照查询嵌套处理

 <!--
       思路:
           1.查询所有的学生信息
           2.根据查询出来的学生的tid,寻找对应的老师! 子查询-->
     <select id="getStudent" resultMap="StudentTeacher">
         select * from mybatis.student
     </select>
 ​
     <resultMap id="StudentTeacher" type="Student">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
         <!--  复杂的属性,我们需要单独处理 对象:association 集合:collection      -->
         <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
     </resultMap>
 ​
     <select id="getTeacher" resultType="Teacher">
         select * from mybatis.teacher where id = #{id}
     </select>

一对多的查询处理(一个老师对多个学生)

学生实体类

 @Data
 public class Student {
     private int id;
     private String name;
     private int tid;
 }

老师实体类

 @Data
 public class Teacher {
     private int id;
     private String name;
     private List<Student> students;
 }

按照结果嵌套处理(用的多)

<resultMap id="teacherMap" type="Teacher">
                 <result property="id" column="tid"/>
                 <result property="name" column="tname"/>
 <!--                这里students对应为一个list集合,所以这里用collection ofType指定list集合里的类型-->
                 <collection property="students" ofType="Student">
                         <result property="id" column="sid"/>
                         <result property="name" column="sname"/>
                         <result property="tid" column="tid"/>
                 </collection>
         </resultMap>
 ​
         <select id="getAllTeacher" parameterType="_int" resultMap="teacherMap">
             select s.id sid,s.name sname,t.id tid,t.name tname,t.name tname
             from student s left join teacher t on s.tid = t.id where t.id = #{tid}
         </select>

按照查询嵌套处理  

 <select id="getTeacher2" resultMap="TeacherStudent2">
         select * from mybatis.teacher where id = #{tid}
     </select>
 ​
     <resultMap id="TeacherStudent2" type="Teacher">
         <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
     </resultMap>
 ​
     <select id="getStudentByTeacherId" resultType="Student">
         select * from  mybatis.student where tid = #{tid}
     </select>

小结

1.关联-association【多对一】 2.集合-collection【一对多】 3.javaType & ofType

  • javaType 用来指定实体类中属性的类型

  • ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!

注意点:

  • 保证SQL的可读性,尽量保证通俗易懂

  • 注意一对多和多对一中,属性名和字段的问题!

  • 如果问题不好排查错误,可以使用日志,建议使用Log4j

动态SQL

缓存

错误解析:

原因:在mybatis中使用二级缓存时候就必须需要将实体类序列化implements Serializable,我的mapper文件使用了<cache/>标签,使用了mybatis提供的二级缓存,所以在我的实体类里面必须序列化

缓存原理

狂神笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值