在学习 MyBatis 之前我们先聊一聊传统 JDBC 编程的操作的优点和缺点。
JDBC操作数据库回顾:https://blog.csdn.net/young_1004/article/details/80686161
我们都知道在 JDBC 编程中常常会碰见如下问题:
1、 数据库频繁的连接和关断,浪费数据库的资源,影响效率。 解决:使用数据库连接池。
2、sql 语句是硬编码,如果需求要求修改 sql 就需要修改 java 代码,需要重新编译,不易于系统维护。解决:将 sql 语句统一配置在文件中,修改 sql 不需要修改 java 代码。
3、通过preparedStatement向占位符设置参数,存在硬编码(参数位置,参数)问题,不易于系统维护。解决:将 sql 中的占位符及对应的参数配置在配置文件中,能够自动输入,映射。
4、遍历查询结果集存在硬编码。解决:自动进行 sql 查询向 java 对象的映射(输出映射)。
一、MyBatis的架构
MyBatis执行过程:
-
创建配置文件SqlMapConfig,用来初始化SqlSessionFactory对象
-
创建编写sql语句的xml文件(映射文件)
-
创建SqlSessionFactory对象
-
创建SqlSession对象
-
使用SqlSession对象执行MapStatement(对映射文件的封装)
1、导入pom依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
2、创建全局配置文件 sqlMapConfig.xml
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/UserMapper.xml"></mapper>
</mappers>
</configuration>
3、创建sql语句的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 namespace="test">
<select id="findAgeById" parameterType="int" resultType="int">
select age from user where id = #{id}
</select>
</mapper>
4、测试类
@Test
public void findAgeById() throws IOException {
InputStream cof = Resources.getResourceAsStream("sqlMapConfig.xml");
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(cof);
//使用会话工厂创建会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//使用会话对象执行sql语句(MapStatment)
Object obj = sqlSession.selectOne("test.findAgeById",1);
System.out.println(obj);
}
5、数据库
6、效果
(谨以此文赠给正在苦学框架的李安琰同学)