发表于: 2020-10-12 23:49:45

1 1465


今天完成的事情:

遇到的问题:

mybatis学习

mybatis是为了解决传统JDBC开发模式中存在的需要优化的缺陷。

  • 1.连接参数、SQL语句的硬编码:将SQL语句配置在XML或其他非Java的配置文件中,这样即使SQL发生变化,也不需要重新编译Java文件。
  • 2.数据库的频繁连接与断开:使用数据库连接池来管理数据的连接。
  • 3.查询结果集取数据的硬编码:使用一种机制,将查询出的结果集自动映射为Java对象,无须手动设置。

硬解码:就是将程序中的外部变量值,使用赋值语句写死在程序中,需要修改时,要修改源码并重新编译。

MyBatis整体架构

MyBatis整体的构造由数据源配置文件、SQL映射配置文件、会话工厂、会话、执行器以及底层封装对象组成。接下来对这些核心对象进行逐一讲解。

1. 数据源配置文件

数据库连接池配置文件

配置mybatis-config文件报错

解决方法将报红的网址加入到IDEA中

那么我们就需要把这个不被识别的统一资源标识符添加到IDEA中,步骤如下:

file-->settings...-->languages & frameworks --> Schemas and DTDs

2. SQL映射配置文件

Mapper.xml基本配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>


</mapper>

3. 会话工厂与会话

准备好了数据库连接池配置文件SqlMapConfig.xml,以及SQL映射配置文件Mapper.xml之后,需要相关的程序来读取并加载这些配置文件的信息。而MyBatis中处理这些配置信息的核心对象就是“会话工厂”与“会话”。

4.MyBatis运行流程

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,生产环境设为INFOERROR
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
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<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
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<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
3 SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
进入网址看了一下是
这个错误是当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信息打印出来。

返回列表 返回列表
评论

    分享到