MyBatis環境配置
MyBatis是一款優秀的持久層框架,她是半自動的化的ORM(Object Relationship Mapping)框架。
1.準備工具
- jdk 13.0.2
- maven 3.6.3
- MyBatis 3.5.4
- junit 4.13
- logback 1.2.3
- MySQL-connector-java 8.0.20
- slf4j 1.7.25
2.創建一個空的maven項目
- 可以使用IDE創建,比如IDEA或者Eclipse之類的;
- 也可以使用命令行創建
mvn archetype:generate -DgroupId=com.kestiny -DartifactId=mybatis -Dversion=0.1.0
3.導入MyBatis依賴包
MyBatis相關依賴包主要是MySQL驅動,都可在maven倉庫中查找到;
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<scope>runtime</scope>
</dependency>
4.編寫MyBatis核心配置文件
MyBatis的配置和使用都可參見MyBatis官方文檔
<?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>
<properties resource="application.porperties"/>
<typeAliases>
<package name="com.kestiny.mybatis.entities"/>
</typeAliases>
<environments default="development">
<environment id="development">
<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>
<mappers>
<mapper resource="mapper/PersonMapper.xml"/>
<mapper resource="mapper/SchoolMapper.xml"/>
</mappers>
</configuration>
注意:
- MyBatis的xml配置文件標籤是有順序的,順序和官方定位的不符時,是無法正確的使用的,當前版本時的順序爲:properties=>settings=>typeAliases=>typeHandlers=>objectFactory=>objectWrapperFactory=>reflectorFactory=>plugins=>environments=>databaseIdProvider=>mappers
- 變量的引用需要使用**${}**,變量的配置文件需要在properties resource標籤中指定,當然也可以使用代碼的方式讀取;
- environment中可以配置多個環境,但是可以生效的只有一個,需要在default中指定;
- 數據源類型默認爲POOLED,目前一共有三種內置數據源類型:UNPOOLED、POOLED和JNDI;
5.準備代碼和PersonMapper.xml文件
準備代碼,參見mybatis模塊
編寫PersonMapper.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="com.kestiny.mybatis.mapper.PersonMapper">
<resultMap id="BaseResultMap" type="Person">
<id column="nid" jdbcType="INTEGER" property="id"/>
</resultMap>
<select id="selectAll" resultMap="BaseResultMap">
select * from person
</select>
</mapper>
6.執行測試
@Test
public void testPerson() {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = build.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> personList = mapper.selectAll();
logger.info("查找數據:" + personList.size());
for (Person person : personList) {
logger.info(person.toString());
}
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
注意:
- 需要從前面的配置文件中,獲取MyBatis的連接;
- 從已有連接中獲取一次SqlSession,每次使用完成後,需要把SqlSession釋放;
- 使用前,需要先從session中獲取mapper。
7. 獲取SqlSession的優化
每次都從頭創建SqlSessionFactory,在獲取SqlSession,十分不便,並且會導致SqlSessionFactory多次創建,一次啓動SqlSessionFactory只需要一個就可以了。
編寫一個MyBatis工具類
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
測試代碼簡化爲
@Test
public void testPerson() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> personList = mapper.selectAll();
logger.info("查找數據:" + personList.size());
for (Person person : personList) {
logger.info(person.toString());
}
sqlSession.close();
}
r.info("查找數據:" + personList.size());
for (Person person : personList) {
logger.info(person.toString());
}
sqlSession.close();
}