MyBatis的由来
JDBC是基础访问数据库的能力【基础代表操作方式简单、原始(不简练)】
在实际的项目中为了解决代码冗余,提高效率,追求编码的一致性。用Mybatis来处理
什么是MyBatis
Mybatis是一个开源、轻量级的数据持久化框架,内部封装了JDBC,简化了加载驱动、创建
框架名词解释:
不仅帮我们节省代码量(解决了冗余代码),还给我们提供了编程的标准,变得更加地通用。
使用了MyBatis的好处[变化]
1.只关注SQL的编写,将SQL配置好(映射)好,Mybatis会帮你找到并执行
2.不用写Connection、PrepareStatement,ResultSet等,这些会由一个SqlSession对象【建立程序和数据库之间的一个会话】去执行映射好的sql
基本步骤
一、准备工作
1.下载MyBatis依赖【两类:MyBatis有关的+JDBC驱动】
2.创建数据库表结构
3.创建实体类
二、实现SQL映射文件--【务必保证Sql语句正确】
【关键之一:最后一步要执行的Sql是怎样传递给MyBatis的】
目的:想要执行的Sql通过框架规定的方式配置出来
注意:在项目里会特意放在一个mapper<映射器>包中:xml文件中
分为两部分:一部分是版本信息【xml的版本信息和dtd文件的引入】用来做校验。
一部分是内容【结点是有要求的,不能随心所欲】
<mapper>是根结点
其中namespace属性:设置当前映射器的命名空间【规范:所在包+当前文件名】
子节点
<select> 查询强调结果
resultType属性:查询结果每一条用实体类来封装
【要求:实体类的属性名和表的字段名要一样】
<insert> 插入强调传值
parameterType属性:强调传递的值是以对象的方式
#{属性} :获取传入对象的某个属性值
知识点: #{ } 是OGNL【对象图访问语言】表达式:可以以对象的方式来访问数据
<delete>
<update>
id属性:Sql映射的名称
寻找某条Sql:是命名空间+Sql的 id
再次理解框架:
就是做好了一切,根据规则接受你给它的设置参数【即:把它想知道的东西(sql)传给它】
三、核心配置文件 --放在根目录下
SqlSession除了要找到执行的Sql语句,还要知道怎么连接数据库 ,需要主配置文件
<?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>
<settings>
<!--日志 需要创建log4j.configuration文件 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--配置Mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!--1.事务管理 -->
<transactionManager type="JDBC"/>
<!--2.数据源,用连接池 -->
<dataSource type="POOLED">
<!-- 驱动类,使用驱动包里面的驱动类 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/north_american?charset=utf8mb4&useSSL=false&userTimezone=true&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--将mapper包下的所有文件加入到配置文件中 -->
<mappers>
<mapper resource="De01_chubu/mapper/WebsiteMapper.xml"/>
</mappers>
</configuration>
四、日志文件
# Global logging configuration
log4j.rootLogger=ERROR,stdout
# MyBatis logging configuration...
log4j.logger.De01_chubu=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
五、测试类
public class Test {
public static void main(String[] args) throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
List<Website> list = sqlSession.selectList("De01_chubu.mapper.WebsiteMapper.selectList");
for(Website w : list) {
System.out.println(w);
}
}
}
1.Resources.getResourceAsStream()默认从ClassPath根目录路径下找mybatis-config.xml文件
2.SqlSessionFactory去读主配置文件
3.所以由SqlSessionFactory创建出来的SqlSession都能得到主配置文件的信息
4.通过SqlSession执行指定的Sql映射:
4.1 根据映射路径在主配置文件中找
找到后:
插入语句有表达式会替换【底层用的是PeraparedStatement】
事务是手动事务,所有的增删改以事务的方式去提交
sqlSession.commit(); 【JDBC中是Connection提交】
没找到:报错
报错分析:
Mapped Statements collection 是Mapper映射操作集合
在Sql映射文件中会有很多的映射,会被放到一个集合里,
这个集合里面,每一个映射操作(执行的Sql)都是一个Mapped Statement,以Map的方式存储
Map的Key是Sql映射的完整访问名称:namespace+id
value是每个要操作的Mapped Statement
所以:根据你给的路径去找value,
情况1:没有在主配置文件中加载
情况2:在主配置文件中加载,但书写路径错误