看视频学的记一下笔。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
如下:
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.18version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.6version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
dependencies>
如果要其他版本、依赖,可去这里找: Maven存储库
mybatis依赖:传送门
mysql依赖:传送门
junit依赖: 传送门
以mybatis为例,打开网站,选择一个版本点进去
直接把这段复制到pom.xml配置文档中的
如下
官网教程:传送门
<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/mybatis?useSSL=true&useUnicode=true&charsetEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
dataSource>
environment>
environments>
configuration>
以下内容来源于官网: 传送门
从 XML 中构建 SqlSessionFactory
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory
的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从
XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new >SqlSessionFactoryBuilder().build(inputStream);
从 SqlSessionFactory 中获取 SqlSession
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
try (SqlSession session = sqlSessionFactory.openSession()) { BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); }
每次在使用mybatis都要用的配置,所以直接写为一个工具类
package com.learn.utils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.io.Resources;
import java.io.IOException;
import java.io.InputStream;
/** 从sqlSessionFactory (get)--> sqlSession*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
// 使用mybatis必要配置:获取sqlSessionFactory对象、获取sqlSession
static{ // 写在static中,在加载类的时候一起加载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(){
return sqlSessionFactory.openSession();
}
}
package com.learn.pojo;
public class User {
private int id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
mapper就等价于dao
探究已映射的 SQL 语句
在上面提到的例子中,一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用
<select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} select> mapper>
package com.learn.mapper;
import com.learn.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> getUserList();
}
<mapper namespace="com.learn.mapper.UserMapper">
<select id="getUserList" resultType="com.learn.pojo.User">
select * from mybatis.user;
select>
mapper>
在test目录下构建与main中相同的目录结构
如:com.learn.mapper
package com.learn.mapper;
import com.learn.pojo.User;
import com.learn.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void test(){
// 获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 执行sql 面向接口编程,这里只需要拿到UserMapper接口即可,UserMapper.xml可看作其实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//获得结果
List<User> userList = userMapper.getUserList();
//输出结果
for (User user : userList ) {
System.out.println(user);
}
//关闭SqlSession流
sqlSession.close()
}
}
org.apache.ibatis.binding.BindingException: Type interface com.learn.mapper.UserMapper is not known to the MapperRegistry
出现这个错误的原因是这里的UserMapper.xml还没有在核心配置文件中注册。
在之前创建项目时第二步的核心配置文件中进行注册,将以下代码添加进去即可(注意路径及名字)
<mappers>
<mapper resource="com/learn/mapper/UserMapper.xml"/>
mappers>
初始化异常,UserMapper.xml这个文件可能不存在
因为资源过滤的问题,导致UserMapper.xml没有被导出,在targe文件夹下现在是没有这个文件的,所以才会找不到
注:target文件夹是用来存放项目构建后的文件和目录、jar包、war包、编译的class文件,都是maven构建时生成的。
maven是约定大于配置的
最直接的方式是直接把上面的UserMapper.xml复制下来,但是这个方法太笨了,不可能每次的要自己拷贝
两种方法:
1.把xml文件写到resources下,这样就不会被过滤了
2.把下面的代码写入pom.xml中,基础工程与当前项目可以两个都写上
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>
directory:指定资源所在的目录,目录的路径是相对于pom.xml文件的
includes:指定要包含哪些文件
filtering标签中:false表示不过滤,true表示过滤
如果需要单独导出一个项目,就需要更改一下配置,因为有些配置是在基础工程里写的,还需要复制一下
容易出问题的地方:
步骤: