MyBatis的整个运行流程,也是紧紧围绕着数据库连接池配置文件SqlMapConfig.xml,以及SQL映射配置文件Mapper.xml而开展的。
首先SqlSessionFactory会话工厂会通过Resources资源信息加载对象获取SqlMapConfig.xml配置文件信息,然后产生可以与数据库进行交互的会话实例类SqlSession。会话实例类SqlSession可以根据Mapper配置文件中的SQL配置,去执行相应的增删改查操作。而在SqlSession类内部,是通过执行器Executor(分为基本执行器和缓存执行器)对数据库进行操作的。执行器Executor与数据库交互,依靠的是底层封装对象Mappered Statement,它封装了从Mapper文件中读取的信息(包括SQL语句、输入参数、输出结果类型)。通过执行器Executor与底层封装对象Mappered Statement的结合,MyBatis就实现了与数据库进行交互的功能。
MyBatis运行流程结构如图2-1所示。
创建MyBatis入门程序
配置pom.xml
<dependencies>
<!-- 导入mybatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- 导入mysql-connector-java包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<!-- 导入junit包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 导入log4j-core包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
<!-- 导入slf4j-log4j12包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!-- 导入slf4j-api包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
编写日志输出环境配置文件
# Global logging cofiguration
# 在开发环境下日志级别要设成DEBUG,生产环境设为INFO或ERROR
log4j.rootLogger=DEBUG, stdout
#控制台输出
# Console output...
#设置名为stdout的输出端载体是那种类型
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#名为stdout的输出载体的layout(即界面布局)是哪种类型
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#如果layout界面布局选择了PatternLayout灵活布局类型,要指定的打印信息的具体格式
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
编写数据库连接池配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--和spring整合后environments配置将被废除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理-->
<transactionManager type="JDBC"/>
<!--数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis_test"/>
<property name="username" value="root"/>
<property name="passsword" value="wsj199599"/>
</dataSource>
</environment>
</environments>
<!-- -->
<mappers>
<mapper resource="Mapper.xml"/>
</mappers>
</configuration>
编写SQL映射配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
创建User实体类
package com.mybatis.pojo;
public class User {
private int id;
private String username;
private String password;
public User(int id, String username, String password){
this.id = id;
this.username = username;
this.password = password;
}
public User(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
创建一个可以获取SqlSession(即数据库交互对象)的类
package com.mybatis.datasource;
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.InputStream;
import java.io.IOException;
public class DateConnection {
//MyBatis配置文件
private String resource ="SqlMapConfig.xml";
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
public SqlSession getSqlSession() throws IOException {
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工程,传入MyBatis配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
这里发现报了两个错误,一个没导入包的错误,还有一个是字母写错了的报错
通过百度和对照书上的程序解决了 编写测试程序
import com.mybatis.datasource.DateConnection;
import com.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.io.IOException;
public class MyBatisTest {
public DateConnection dateConn = new DateConnection();
@Test
public void TestSelect() throws IOException {
SqlSession sqlSession = dateConn.getSqlSession();
//sqlSession.selectOne最终结果与映射文件所匹配的resultType类型
User user = sqlSession.selectOne("test.findUserById",1);
System.out.println("姓名:"+user.getUsername());
System.out.println("密码:"+user.getPassword());
}
}
出现两个错误,
日志错误
1 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
2 SLF4J: Defaulting to no-operation (NOP) logger implementation
进入网址看了一下是
这个错误是当org.slf4j.impl报道。StaticLoggerBinder类不能被加载到内存中。发生这种情况时,无法找到合适的SLF4J绑定类路径。slf4j-nop放置一个(且只有一个)。slf4j-simple jar。slf4j-log4j12 jar。slf4j-jdk14 jar。jar或logback-classic。jar的类路径应该解决这个问题。
就是导入了两个测试包,但只能用一个
最终输出结果
去掉一个就好了。
另外一个错误是单词拼错的问题。
明天计划的事情:
详解MyBatis配置文件,mybatis高级映射
收获:知道了mybatis的大致的操作流程,让mybatis资源文件(应该是SqlSessionFactory类)加载类解析Mapper文件(资源加载类文件读取数据库连接池配置文件),然后SqlSessionFactory类会获取数据库连接数据和Mapper映射规则,创建能和数据库交互的SqlSession类。然后创建一个测试类MyBatisTest类,在这个类的TestSession方法中,通过DateConnection类获取了sqlSession会话对象,然后使用sqlSession的SelectOne方法, 执行SelectOne之后的结果是SQL映射文件中所匹配的result type类型,将取出的user信息打印出来。
评论