目录
什么是MyBatis
MyBatis是一款优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
环境准备
下载依赖
从maven仓库下载mybatis依赖https://mvnrepository.com
进入maven仓库官网(官网有点慢,请耐心等待),点击我是人类。
搜索mybatis
点击mybatis
选择版本
找到maven依赖
以同样的方法下载mysql数据库驱动依赖,单元测试依赖,log4j日志依赖
pom.xml文件导入依赖的jar包
创建一个maven项目
<dependencies>
<!-- mysql数据库驱动依赖-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- mybatis依赖-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- 单元测试依赖-->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- log4j日志依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
注意下载依赖需要联网
注意:pom.xml文件还需要加上如下代码,不然放在src/main/java和src/main/resources路径下的xml和properties文件加载不到。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
jdbc.properties配置文件
username=root
password=968426
url=jdbc:mysql://localhost:3306/mydate?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=true
driver=com.mysql.cj.jdbc.Driver
log4j.properties配置文件
# 全局日志配置
log4j.rootLogger=DEBUG,console
### 控制台输出的相关设置 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%c]-%m%n
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
全局配置文件(mybatis-config.xml)
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置文件信息 -->
<properties resource="jdbc.properties"/>
<!-- 日志和缓存设置-->
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 指定包下的类起别名(类名首字母小写),配置后XXXMapper.xml中的参数和返回值类型可以使用别名,没有配置必须使用全类名-->
<typeAliases>
<package name="com.jie.pojo"/>
</typeAliases>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="development">
<environment id="development">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<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>
<!--注册XXXMapper.xml文件-->
<mappers>
<!-- 必须保证接口名和xml名相同,还必须在同一个包中-->
<package name="com.jie.mapper"/>
</mappers>
</configuration>
约定大于配置,mybatis配置文件必须按照指定顺序编写代码,否则编译期就会报错
顺序: properties --> settings --> typeAliases --> typeHandlers --> objectFactory --> plugins --> environments( environment --> transactionManager --> dataSource) --> mappers
创建数据库
CREATE TABLE `book` (
`bookID` int NOT NULL AUTO_INCREMENT,
`bookName` varchar(100) NOT NULL,
`bookCounts` int NOT NULL,
`detail` varchar(100) DEFAULT NULL,
PRIMARY KEY (`bookID`),
KEY `bookID` (`bookID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
表中的数据
IDEA连接数据库
可能会出现时区错误
如果出现时区错误在数据库中执行SET GLOBAL time_zone = ‘+8:00’;语句
解决传送门:IDEA连接mysql又报错!
实操
Book类(这里用了Lombok注解,需要导入Lombok依赖,和下载Lombok插件。下载完需要重启才会生效,也可以不用只要提供对应的方法就行)
@NoArgsConstructor//无参构造
@AllArgsConstructor//有参构造
@Data//get set toString方法
public class Book {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
}
实体类最好和数据库中的表字段保持一致,如果不一致sql语句中要使用别名,使它们保持一致。否则查询出的结果映射不到实体类的属性中,属性和字段不匹配的会出现null值
BookMapper类
public interface BookMapper {
//增
int addBook(Book book);
//删
int delBook(@Param("bookID") int id);
//改
int updateBook(Book book);
//查
List<Book> queryBook();
List<Book> queryBookByLike(String bookName);
}
当形参名和和传入Sql的参数不一样时,使用@Param(“bookID”)变成一致
BookMapper.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jie.mapper.BookMapper">
<!-- 增-->
<insert id="addBook" parameterType="book">
insert into mydate.book(bookName, bookCounts, detail) VALUES(#{bookName},#{ bookCounts},#{detail});
</insert>
<!-- 删-->
<delete id="delBook" parameterType="int">
delete from mydate.book where bookID=#{bookID};
</delete>
<!-- 改-->
<update id="updateBook" parameterType="book">
update mydate.book set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail} where bookID=#{bookID};
</update>
<!-- 查-->
<select id="queryBook" resultType="book">
select * from mydate.book;
</select>
<!--模糊查询-->
<select id="queryBookByLike" resultType="book" parameterType="string">
select * from mydate.book where bookName like "%"#{bookName}"%" ;
</select>
</mapper>
#{}有预编译,会对输入参数进行类型解析(如果入参是String类型,设置参数时会自动加上引号),可以防止SQL注入。(建议使用)
${}没有预编译,有SQL注入问题。(不建议使用)
补充:使用#{}实现模糊查询
select * from mydate.book where bookID like "%"#{bookName}"%";
注意传入的参数必须为String类型,否则会出现如下错误
MybatisUtils工具类(获取sqlSession)
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
InputStream inputStream = null;
try {
String resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
方法测试
public class BookMapperTest {
@Test
public void addBook() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
bookMapper.addBook(new Book(0,"跑路",4,"toutu"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void delBook() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
bookMapper.delBook(9);
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateBook() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
bookMapper.updateBook(new Book(11,"跑酷",4,"酷"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void queryBook() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
List<Book> books = bookMapper.queryBook();
for (Book book:books) {
System.out.println(book);
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void queryBookByLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
List<Book> books = bookMapper.queryBookByLike("跑");
for (Book book:books) {
System.out.println(book);
}
sqlSession.commit();
sqlSession.close();
}
}
注意运行时,可能会出现 2 字节的 UTF-8 序列的字节 2 无效的错误。
解决方法:将所有.xml文件的头部信息的UTF-8改为UTF8
想了解mybatis更多的知识请看大佬的博客mybatis看这一篇就够了,简单全面一发入魂