发布时间:2022-08-19 13:04
看源码到底怎么去看,我总结的是要有目的的去看源码。例如mybatis,我们在github拉下来源码后发现一堆代码,没头没尾无从下手。但是如果我们先写一个Demo,来分析这个demo的每一步到底干了什么,就好分析了。这也就是为啥学习一门新技术都需要先学习怎么使用。
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.6version>
dependency>
/** 实体类 */
public class File {
private Integer id;
private Integer parentId;
private String name;
private Integer isFolder;
.... 省略get/set
}
/** mapper接口 */
public interface FileMapper {
List<File> selectList();
}
一段很简单的sql语句,就是查询全部的file文件,我已经提前在数据库中插入了几条数据。数据库就不展示了,很简单就这几个字段。
<mapper namespace="org.mybatis.internal.example.mapper.FileMapper">
<select id="selectList" resultType="org.mybatis.internal.example.pojo.File">
select id,parent_id parentId, name, is_folder isFolder from file;
select>
mapper>
myabtis-config.xml
全局配置文件
<configuration>
<properties>
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
properties>
<typeAliases>
<package name="org.mybatis.internal.example.pojo"/>
typeAliases>
<environments default="development2">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
<environment id="development2">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle" />
databaseIdProvider>
<mappers>
<package name="org.mybatis.internal.example.mapper"/>
mappers>
configuration>
public class MybatisHelloWorld {
// 配置阶段
// 得到mybatis 配置类的文件路径
String resource = "mybatis/Configuration.xml";
Reader reader = null;
SqlSession session = null;
try{
Yaml yml = new Yaml();
LinkedHashMap map = yml.loadAs(MybatisHelloWorld.class.getClassLoader().getResourceAsStream("config.yml"), LinkedHashMap.class);
System.out.println(map);
Map dataSourceMap = (Map)map.get("dataSource");
System.out.println(dataSourceMap.get("username"));
// 通过Resources.getResourceAsReader 得到配置文件的字节流
reader = Resources.getResourceAsReader(resource);
// 这里的Properties 和配置文件Configuration.xml 里面的一致,使用Java配置可以实现动态的properties
Properties properties = new Properties();
// properties.setProperty("username", dataSourceMap.get("username") + "");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,properties);
// 执行SQL阶段
// 得到一个session连接
session = sqlSessionFactory.openSession();
FileMapper fileMaper = session.getMapper(FileMapper.class);
List<File> fileList = fileMaper.selectList();
list.forEach(System.out::println);
}catch (Exception e){
e.printStackTrace();
}finally {
session.commit();
session.close();
}
}
这段代码中核心的代码只有四句代码,这四句我把整个mybatis 从配置到执行sql语句得到想要的结果 分为两个阶段:
配置阶段
执行阶段