JAVAWEB-NOTE06-MyBatis
简介
官网:https://mybatis.org/mybatis-3/zh/index.html
什么是MyBatis?
它是一款优秀的持久层框架,用于简化JDBC开发
那什么是持久层?
JAVAEE有三层架构:表现层、业务层、持久层;而持久层就是复制将数据保存到数据库的那一层代码
那什么又是框架呢?
框架就是一套半成品的软件,它是一套可重复、通用的软件基础代码模型
在框架的基础之上构建软件编写更加地高效、规范、通用、可扩展
MyBatis历史发展简介?
MyBatis本是Apache的一个开源项目iBatis, 2010年这个项目由apache software
foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
快速入门
需求:
查询user_info表中的所有数据

第一步:创建木块,导入坐标
mybatis坐标
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
junit单元测试坐标
<!--junit 坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
logback日志坐标
<!--logback 坐标-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
第二步:编写mybatis核心配置文件
这一步就是替换数据库连接的信息(JDBC连接数据库的那段代码)解决硬编码问题
在resources下创建一个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">
<!--5.mybatis核心配置,加载配置数据库驱动,同时需要加载userMapper的映射文件-->
<configuration>
<!-- 配置数据源环境-->
<properties resource="jdbc.properties"/>
<!-- 自定义别名,接下去在UserMapper核心配置文件的resultType就不用写全限定名,直接换user-->
<typeAliases>
<typeAlias type="ex1.domain.User" alias="user"/>
</typeAliases>
<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:///db1?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="ex1\mapper\UserMapper.xml"/>
</mappers>
</configuration>
第三步:编写SQL映射文件并加载
<?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">
<!--4.编写核心配置文件UserMapper.xml,即对数据库进行操作的配置文件-->
<mapper namespace="userMapper">
<!-- 使用命名空间namespace加上id就可以调用sql语句进行数据库操作即userMapper.findAll-->
<!-- resultType 查询是结果集合往user实体进行封装-->
<select id="findAll" resultType="user" >
select * from user_info
</select>
</mapper>
在mybatis-config.xml下配置UserMapper的路径

第四步:编码
mybatisdemo.java
public class MyBatisDemo {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
sqlSession.close();
}
}
User.java
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
运行结果:

IDEA配置连接数据库
由于用的是社区版没有database,在插件中下载Database Navigator重启idea后:

随后点击+号,选择对应的数据库类型:


配置成功后可以看到:

Mapper代理开发
为什么需要用到Mapper代理开发?
我们看刚刚执行SQL的代码语句:
List<User> users = sqlSession.selectList("test.selectAll");
后面传入的参数也是一个写死的字符串,属于硬编码。
我们通过Mapper代理开发,就是为了解决上述这种方式的硬编码问题,以及简化后期执行SQL
Mapper代理开发规则
1.第一步:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
public interface UserMapper {
}
将Mapper接口和SQL映射文件放置在同一目录下
为了不让JAVA文件和配置文件不混在一起,方便管理,我们通过在resources下new一个dir的方式来创建一个包结构,这样让我们的配置文件在编译之后也能和我们的JAVA文件在同一个包结构下(dir中不能用.来区分包结构,而是需要用/)

效果:

通过compile后到生成的class文件中验证,发现确实class文件和xml文件在同一路径下

2.第二步:设置SQL映射文件的namespace为Mapper接口的名字

3.第三步:在Mapper接口中定义方法,方法名称就是SQL映射文件中SQL语句的ID,并且保证参数类型和返回值类型一致
比如我现在要查询所有,在接口中定义的方法为
public interface UserMapper {
List<User> selectAll();
}
这里的selectAll就对应了SQL语句中的ID
4.第四步:编码
- 通过
SqlSession的getMapper方法获取Mapper接口的代理对象 - 通过调用对应方法完成sql的执行
public class MyBatisDemo2 {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println(users);
sqlSession.close();
}
}
细节

为什么?
因为我们的mybatis-config的文件中可能要去加载很多的mapper,不太方便

那么我们可以通过包扫描的方式加载映射文件:
<package nem = "com.demo.Mapper"/>
通过这种方式可以以后无论多少的Mapper配置文件,我一行代码就可以搞定。
浙公网安备 33010602011771号