2024年鸿蒙最新MyBatis基础原理_哪个类在监听mysbtis,详细的HarmonyOS鸿蒙学习指南

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

static {

try {
  //读取配置文件
  InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-onfig.xml");

  //工厂构建类 构建 得到sql会话工厂
  sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

} catch (IOException e) {
  e.printStackTrace();
}

}

//用工厂类来获取执行sql操作的对象
public static SqlSession getSqlSession(){
//打开会话,也就是开启和数据库的连接
return sqlSessionFactory.openSession();
}

}




---


6. 用SqlSession对象来**获取实现类对象**,然后执行方法



@Test
public void test(){
//工具类获取SqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();

//底层用反射机制,获取了接口TeacherMapper的类对象
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

//接口被实现类TeacherMapper.xml实现了,调用接口就是调用实现类的方法
List teacherList = mapper.getTeacherList();

id:1,姓名是:秦老师
for (Teacher teacher : teacherList) {
System.out.println(“id:”+teacher.getId()+“,姓名是:”+teacher.getName());
}

//一定要关闭会话,免得占用资源
sqlSession.close();

}


7. 早年间官方给我们提供了一些默认的方法,可以通过**传入方法路径,来直接执行.**不过没有**第一种方法好理解**



@Test
public void test(){

SqlSession sqlSession = MyBatisUtil.getSqlSession();

TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

//sql会话时,直接调用接口中的方法
List teacherList = sqlSession.selectList(“com.changGe.li.mapper.TeacherMapper.getTeacherList”);

//id:1,姓名是:秦老师
for (Teacher teacher : teacherList) {
System.out.println(“id:”+teacher.getId()+“,姓名是:”+teacher.getName());
}

sqlSession.close();
}




---


#### 注意事项


如果**找不到对象**,可能因为**maven是找不到mapper.xml**,用下面的代码,让maven在构建项目时把文件构建进来



src/main/java **/*.properties **/*.xml false

**好像说mapper.xml中的中文注释也会出问题,可能是要把文件格式改成UTF-8**




---


#### 官方名词概念


##### 三大对象


在后面的生命周期和作用域会讲解


##### 完全限定名


就是可以**让mybatis直接打到资源的一个精确名字**,如com.changGe.li.pojo.Teacher




---


### CRUD



> 
> 对象中的值可以直接拿来用
> 
> 
> 



select * from teacher where id=#{id} and name = #{name};


@Test
public void test(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();

TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

HashMap<String, String> map = new HashMap<String, String>();

map.put(“id”,“1”);
map.put(“name”,“秦老师”);
Teacher teacherByIdAndName = mapper.getTeacherByIdAndName(map);
System.out.println(teacherByIdAndName);

sqlSession.close();

}



> 
> 增删改一定要提交事务sqlsession.commit();
> 
> 
> 



insert into teacher values(#{id},#{name})


@Test
public void test(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();

TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

Teacher teacher = new Teacher(2,“李长歌”);

mapper.addTeacher(teacher);

//不提交事务,不更新数据
sqlSession.commit();

sqlSession.close();

}


#### 获取更新时记录的key(slelectKey)


https://blog.youkuaiyun.com/kongkongyanan/article/details/86096657



SELECT LAST_INSERT_ID() AS ID insert into student values(#{id},#{name},#{tid})


Student student = new Student();
student.setName(“张三”);
student.setTid(1);

mapper.insertStudent(student);

System.out.println(student.getId());



> 
> 模糊查询
> 
> 
> 



select * from teacher where name like concat(‘%’,#{name},‘%’);



Teacher teacher = mapper.getTeacherByName(“长歌”);




---


### 配置优化


**xml规定了所有标签的顺序,必须完全符合规定**


**properties,settings,**


**typeAliases,typeHandlers,**


**objectFactory,objectWrapperFactory,**


**reflectorFactory,plugins,**


**environments,databaseIdProvider,**


**mappers**



> 
> 多环境配置
> 
> 
> 






---


#### 属性优化properties 替换需要动态配置的属性值




#### 类型别名: 降低冗余的全限定类名书写





> 
> 注解设置别名
> 
> 
> 



@Alias(“teacher”)
public class Teacher {}



> 
> 但是需要在mybatis-config.xml中,配置在哪个包下扫描注解
> 
> 
> 






---


##### 系统默认别名


**基本类型加\_,包装类是对应的基本类型,集合首字母小写**


int 别名是 **\_int**,Integer = **int**, Map = **map**






---


#### settings系统配置:改变 MyBatis 的运行时行为


可以设置如**日志**,**缓存**和**懒加载**



> 
> slf4j依赖
> 
> 
> 



org.slf4j slf4j-api 2.0.0-alpha4





---


#### MapperGesitry注册,映射器: 直接告诉 MyBatis 到哪里去找映射文件


当用实现类或包注册时,要求:**实现类和配置文件与接口同名,且同包!**




如果想分离,要在**resource包下创建和接口相同结构的包.**


因为**mybatis的resource是通过classpath来找文件的**




---


### 生命周期和作用域


错误的使用可能会出现**严重的并发问题**  
 ![](https://img-blog.csdnimg.cn/2171eea29bc644a99076bb933a2c4653.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2O6ZW_5q2Mcw==,size_20,color_FFFFFF,t_70,g_se,x_16)


1. 程序开始,**配置文件被sqlsessionfactoryBuilder构建**,
2. 得到**sqlsessionfatory工厂模式**,
3. 由此**创建sqlsession对象**,
4. 产生**对应接口的SQLMapper对象**,
5. **执行数据库操作**,最后结束.


#### 从 XML 中构建 SqlSessionFactory


1. **SqlSessionFactoryBuilder 可以从 XML 配置文件**或一个预先配置的 Configuration 实例来**构建出 SqlSessionFactory 实例**。
2. **每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。**


#### 从 SqlSessionFactory 中获取 SqlSession


1. 我们可以**从SqlSessionFactory中获得 SqlSession 的实例**。
2. SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。


#### 通过 SqlSession 实例来直接执行已映射的 SQL 语句


1. sqlsession执行**rselectOne()或者selectList()**等方法,直接执行sql操作,最后**结束**
2. 这种方式对使用旧版本 MyBatis 的用户来说,比较熟悉。


##### 更简洁的方式


1. 使用**指定了语句的参数和返回值相匹配的接口**(比如 BlogMapper.class)
2. 现在代码更**清晰**,更加**类型安全**,**不用担心可能出错的字符串字面值**,以及**强制类型转换**。



BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);




---


#### 作用域


![](https://img-blog.csdnimg.cn/a222656b36e74252a67c44ea53f9880c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2O6ZW_5q2Mcw==,size_20,color_FFFFFF,t_70,g_se,x_16)




---


![](https://img-blog.csdnimg.cn/c148d965227643e5a805313c335890ce.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2O6ZW_5q2Mcw==,size_20,color_FFFFFF,t_70,g_se,x_16)




---


### 结果集映射:解决数据库字段与对象属性不对应的问题


作用就是:**把数据库中返回的字段的值,映射到对象的属性上**



> 
> 对象中有id和age两个属性
> 
> 
> 



@Data
@AllArgsConstructor
@NoArgsConstructor
@Alias(“teacher”)
public class Teacher {

private int id;
private String ame;

}



> 
> 配置结果集映射
> 
> 
> 



select * from teacher where id = #{id} and name = #{ame};


> 
> 执行查询
> 
> 
> 



Teacher teacher1 = new Teacher(2, “李长歌”);
Teacher teacher = mapper.getTeacherByName(teacher1);


**写resultMap时,resultType就可以不用写了**




---


### 日志工厂


Mybatis 通过使用**内置的日志工厂提供日志功能**。内置日志工厂将会把**日志工作委托给下面的实现**之一:


* SLF4J
* Apache Commons Logging
* Log4j 2
* Log4j
* JDK logging


1. MyBatis 内置日志工厂:会**基于运行时检测信息**,**选择日志委托实现**。
2. 它会(按上面罗列的顺序)**使用第一个查找到的实现**。
3. 如果你的**环境中并不存在** Log4J,你**却试图调用了相应的方法**,MyBatis 就会**忽略这一切换请求** .
4. 当**没有找到**这些实现时,将会**禁用日志功能**。




---


#### STDOUT\_LOGGING(标准输出记录)



> 
> xml声明
> 
> 
> 





> 
> 执行结果
> 
> 
> 



//读者入口
Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
//检查类 com.changGe.li.mapper.StudentMapper 是否符合条件 [可分配给对象]
Checking to see if class com.changGe.li.mapper.StudentMapper matches criteria [is assignable to Object]

Checking to see if class com.changGe.li.mapper.TeacherMapper matches criteria [is assignable to Object]

//打开 JDBC 连接
Opening JDBC Connection
//创建连接 1312381159
Created connection 1312381159.
//在 JDBC 连接 [com.mysql.cj.jdbc.ConnectionImpl@4e3958e7] 上将 autocommit(自动提交) 设置为 false
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4e3958e7]
//准备中
> Preparing: select * from teacher where id = ? and name = ?;
//参数
> Parameters: 2(Integer), 李长歌(String)
//列
<
Columns: id, name
//行
<
Row: 2, 李长歌
//总计
<== Total: 1
//返回结果
Teacher(id=2, name=李长歌)
//在 JDBC 连接 [com.mysql.cj.jdbc.ConnectionImpl@4e3958e7] 上将自动提交重置为 true
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4e3958e7]
//关闭 JDBC 连接 [com.mysql.cj.jdbc.ConnectionImpl@4e3958e7]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4e3958e7]
//将连接 1312381159 返回到池
Returned connection 1312381159 to pool.




---


#### Log4j :java日志


[log4j\_百度百科 (baidu.com)](https://bbs.youkuaiyun.com/topics/618636735)


**使用Log4j框架的作用通俗的解释:**


* 能够控制**日志信息想往哪里打就往哪里打**,比如:控制台、文件、邮箱、[数据库](https://bbs.youkuaiyun.com/topics/618636735)等等。
* 能够控制**日志信息想怎么打就怎么打**,比如:我想要打印时间、程序的名称、程序的方法名、程序的行号、线程的名称等等。
* 能够控制**日志信息想打什么打什么,不想打的就不打**,日志信息是分级别的,有时候我只想看错误的信息或者警告的信息,有时候我想看到所有的信息我想调试程序等等。



> 
> 依赖
> 
> 
> 



log4j log4j 1.2.17


> 
> 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/kuang.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

#日志输出级别:输出DEBUG级别及以上的日志信息
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


##### 简单使用



public class MyBatisTest {

//在当前类运行时,输出日志
private static Logger logger = Logger.getLogger(MyBatisTest.class);

@Test
public void test(){

//在debug时,输出当前为debug模式
logger.debug("当前为debug模式");

SqlSession sqlSession = MyBatisUtil.getSqlSession();

//输出一条普通信息:打印sqlSession
logger.info(sqlSession);

TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

Teacher teacher1 = new Teacher(2, "李长歌");
Teacher teacher = mapper.getTeacherByName(teacher1);

System.out.println(teacher);

sqlSession.close();

try {}catch (Exception e){}
finally {
  logger.error("报错了");
}

}

}



> 
> 日志文件的存放地址
> 
> 
> 


![](https://i-blog.csdnimg.cn/blog_migrate/a90a548ce841f4d04b02bd1b8fae4a8a.png)



> 
> 部分日志信息
> 
> 


![img](https://img-blog.csdnimg.cn/img_convert/116cfb630b18e38a2238fb25e4e1a02e.png)
![img](https://img-blog.csdnimg.cn/img_convert/cae03d295c51afa13a346f467d24e031.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

atisUtil.getSqlSession();

    //输出一条普通信息:打印sqlSession
    logger.info(sqlSession);

    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

    Teacher teacher1 = new Teacher(2, "李长歌");
    Teacher teacher = mapper.getTeacherByName(teacher1);

    System.out.println(teacher);

    sqlSession.close();

    try {}catch (Exception e){}
    finally {
      logger.error("报错了");
    }

  }

}

日志文件的存放地址

部分日志信息

[外链图片转存中…(img-cyyhFHFp-1715742497439)]
[外链图片转存中…(img-ztJNjtSI-1715742497440)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值