Mybati是一款持久层框架,避免了JDBC中的代码和手动设置参数以及获取结果集(即是JDBC的改进版)。它通过简单的XML或者注解来配置和映射原生类型、接口和Java的Pojo(实体类)在数据库中的记录。
一、第一个Mybatis(Maven)程序
【环境搭建】
- 创建一个Maven项目
- 导入依赖(等效于之前创建libs导入jar包),如下:
<!-- 导入依赖-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 解决maven中资源过滤问题配置,如下:
<!--maven的资源过滤问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>flase</filtering>
</resource>
</resources>
</build>
在右侧Maven栏中查看jar包导入结果,如图所示:
4. 编写mybatis的核心配置文件mybatis-config.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"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssmbuild?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="com/xxxx/dao/BooksMapper.xml"/>-->
<mapper class="com.xxxx.dao.BooksMapper"/>
</mappers>
</configuration>
如果使用class来指定映射路径,xml的名字和对应的接口名需完全相同且必须再同一个目录下
5. 编写工具类
package com.xxxx.utils;
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;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供面向数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
// SqlSession session = sqlSessionFactory.openSession();
// return session;
return sqlSessionFactory.openSession();
}
}
- 编写代码
【实体类】
package com.xxxx.pojo;
public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
public Books() {
}
public Books(int bookID, String bookName, int bookCounts, String detail) {
this.bookID = bookID;
this.bookName = bookName;
this.bookCounts = bookCounts;
this.detail = detail;
}
public int getBookID() {
return bookID;
}
public void setBookID(int bookID) {
this.bookID = bookID;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getBookCounts() {
return bookCounts;
}
public void setBookCounts(int bookCounts) {
this.bookCounts = bookCounts;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
@Override
public String toString() {
return "Books{" +
"bookID=" + bookID +
", bookName='" + bookName + '\'' +
", bookCounts=" + bookCounts +
", detail='" + detail + '\'' +
'}';
}
}
【Dao接口】
package com.xxxx.dao;
import com.xxxx.pojo.Books;
import java.util.List;
public interface BooksMapper {
List<Books> getAllBooks();
}
【实现类的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">
<!--mybatis就是把一个impl实现类变为一个xml的配置文件-->
<mapper namespace="com.xxxx.dao.BooksMapper">
<!-- id对应方法的名字,相当于impl实现类中重写接口中的方法,所以要和接口中的方法名一样-->
<select id="getAllBooks" resultType="com.xxxx.pojo.Books">
SELECT * FROM ssmbuild.books;
</select>
</mapper>
在实现不同的业务的时候可以根据需求使用Map集合来传参,这样在sql语句中参数不需要保持和数据库字段名一致,因为map集合传入参数时会指定。
二、Properties
将mybatis-config.xml的配置文件中关于数据库信息部分改为一个properties的配置文件,如下:
【db.propereties】
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssmbuild?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username=root
password=123456
【mybatis-config.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>
<properties resource="db.properties"/>
<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>
<!-- 每一个mapper.xml都需要在mybatis的核心配置文件中配置-->
<mappers>
<!-- <mapper resource="com/xxxx/dao/BooksMapper.xml"/>-->
<mapper class="com.xxxx.dao.BooksMapper"/>
</mappers>
</configuration>
【注】可以将db.properties中的username和password去掉,在mybatis-config.xml< properties >标签下的property属性中添加。如果都写了,优先使用外部配置文件的配置。
三、typeAliases
【作用】
- 减少完全限定名的冗余
<typeAliases>
<typeAlias type="com.xxxx.pojo.Books" alias="book"/>
</typeAliases>
- 扫描指定包下的javaBean,实体类上没有注解时默认采用首字母小写作为别名,如果有,则按照注解来写。
<typeAliases>
<package name="com.xxxx.pojo"/>
</typeAliases>
四、ResultMap结果集映射
如果在sql语句中出现数据库中没有的字段,查询结果为null,解决方法:
- 给对应的属性起别名,如:
select id,name,pwd as password where id=#{id};
- 使用ResultMap,自定义结果集,但是要将自定义的结果集和本来的结果类型映射,如下:
<resultMap id="bookresultMap" type="books">
<!-- column:数据库中的字段,property:实体类中的属性-->
<result property="id" column="bookid"/>
</resultMap>
<select id="getAllBooks" resultMap="bookresultMap">
SELECT * FROM ssmbuild.books;
</select>