简单的Mybatis应用
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以又通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件加载配置信息,然后创建SqlSessionFactory。先看下面的例子
主程序:
package org.apache.test.model;
import lombok.extern.slf4j.Slf4j;
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 java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Slf4jp
ublic class MybatisTest {
public static void main(String[] args) throws IOException {
String resource = "resources\\mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UUID uuid = UUID.randomUUID();
// 插入记录
session.insert("org.apache.test.model.User.insert", new User(uuid, "songhongwei", 28, 250000));
// 提交事务
session.commit();
// 通过xml方式查询数据
User user = session.selectOne("org.apache.test.model.User.selectUser", uuid.toString());
log.info("User is {}", user);
//通过mapper接口的方式查询数据
user = session.getMapper(UserMapper.class).selectOne(uuid.toString());
log.info("User is {}", user);
}
}
配置文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeHandlers>
<typeHandler handler="org.apache.ibatis.submitted.uuid_test.UUIDTypeHandler"></typeHandler>
</typeHandlers>
<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://127.0.0.1:3306/mybatisdb?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="resources/UserMapper.xml"/>
<mapper class="org.apache.test.model.UserMapper"/>
</mappers>
</configuration>
Mapper文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.test.model.User">
<select id="selectUser" resultType="org.apache.test.model.User">
select * from User where id = #{id}
</select>
<insert id="insert" parameterType="org.apache.test.model.User">
insert into user(id,name,age,salary)values (#{id},#{name},#{age},#{salary})
</insert>
</mapper>
Mapper接口
package org.apache.test.model;
import org.apache.ibatis.annotations.Select;
/**
* Description
*
* @author s19744
* @time 2021:01:05 2021/1/5-10:50
* @package_name org.apache.test.model
**/
public interface UserMapper {
@Select("select * from user where id = #{id}")
User selectOne(String id);
}
程序如果不出错将输出,并在数据库中插入一条记录
INFO [main] - User is {"id":c646ac00-0976-444b-9700-4609226b0151,"name":"songhongwei","age":28,"salary":250000.0}
INFO [main] - User is {"id":c646ac00-0976-444b-9700-4609226b0151,"name":"songhongwei","age":28,"salary":250000.0}
配置解析过程
从上述代码可以看出,SqlSessionFactoryBuilder是一个关键的入口类,其中承担了mybatis配置文件的加载,解析,内部构建等职责。
String resource = "resources\\mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
Resources.getResourceAsStream(resource)读取文件
public static InputStream getResourceAsStream(String resource) throws IOException {
return getResourceAsStream(null, resource);
}
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
if (in == null) {
throw new IOException("Could not find resource " + resource);
}
return in;
}
public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {
return getResourceAsStream(resource, getClassLoaders(classLoader));
}
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
for (ClassLoader cl : classLoader) {
if (null != cl) {
// try to find the resource as passed
InputStream returnValue = cl.getResourceAsStream(resource);
// now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
if (null == returnValue) {
returnValue = cl.getResourceAsStream("/" + resource);
}
if (null != returnValue) {
return returnValue;
}
}
}
return null;
}
总结:主要是通过ClassLoader.getResourceAsStream()方法获取指定的classpath路径下的Resource
时序图: