mybatis快速入门

功能

用来简化jdbc开发的。

依赖

除了mybatis自己的jar包,还需要mysql驱动jar包

bash 复制代码
  <!--mysql驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
  </dependency>
  <!--mybatis的依赖-->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
  </dependency>

快速入门

步骤

1.创建maven工程,添加坐标

2.创建pojo

3.创建UserDao接口

4.创建UserDao.xml映射文件

  1. 创建mybatis核心配置文件SqlMapConfig.xml

  2. java代码测试

    核心配置文件:

主要配置数据库连接信息,以前写在java代码里,现在写在配置文件里,解决了硬编码问题。

后面会加载这个文件,会生成一个对象叫SqlSessionFactory,通过名字就可以看出来是工厂的设计模式,通过这个对象就可以获取到一个最为核心的对象SqlSession对象,这个对象就是用来执行sql语句的,和jdbc里的statement对象功能一样。执行完sql语句,把资源释放一下。
sql映射文件

把sql语句写到配置文件里,统一管理sql,解决硬编码问题。
pojo类:

对应数据库的表字段。

代码

2. 创建pojo

bash 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private Integer uid;            //用户id
    private String username;    //用户姓名
    private String sex;         //用户性别
    private Date birthday;      //用户生日
    private String address;     //用户地址
}

3. 创建UserDao接口

 UserDao接口就是我们持久层接口(也可以写成UserMapper)

bash 复制代码
public interface UserDao {

    /**
     * 执行一个查询所有用户的sql语句,并且将查询到的结果封装到List<User>
     * @return
     */
    public List<User> findAll();
}

4. 创建UserDao.xml映射文件

注意:

  1. 映射配置文件的路径在resources里面,要和对应的Dao接口的路径保持一致
  2. 映射配置文件的文件名必须和Dao接口名保持一致
  3. 一定要引入约束文件
  4. Sql语句不要有;号结尾。
    注意在rosource下用/,用.的话不会分隔,会全部成一个包名。
bash 复制代码
<?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,一个映射配置文件,对应一个dao接口
    根标签的namespace属性的值就对应dao接口的权限定名
-->
<mapper namespace="com.gavin.dao.UserDao">
    <!--
        根标签的每一个子标签就对应dao接口的每一个方法:
            select标签对应了查询方法
            标签的id值对应方法的名字
            标签的resultType的值就对应封装结果类型,如果封装结果类型是List就对应其泛型的类型
            标签体的内容就是要执行的SQL语句
    -->
    <select id="findAll" resultType="com.gavin.pojo.User">
        select * from t_user//!!不要有;了!
    </select>
</mapper>

5. 创建mybatis核心配置文件SqlMapConfig.xml

注意:

  1. 存放的路径必须是resources的根路径
  2. 配置文件的名字,随便写
  3. 一定要引入约束文件
bash 复制代码
<?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
-->
<configuration>
    <!--
        配置数据库的环境信息:
        environments:表示里面可以配置多个环境,default使用哪个环境
            environment:每一个environment表示一种环境
        为什么要配置多个环境:因为我们有多个环境(开发环境、生产环境(真正项目之后运行的环境)、测试环境)
    -->
    <environments default="dev">
        <!--开发环境-->
        <environment id="dev">
            <!--事务管理者,type为JDBC表示使用JDBC的事务管理者(了解)-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource表示数据源,1.POOLED表示使用自带的连接池,2.UNPOOLED表示不使用连接池,3.JNDI表示使用JNDI连接池-->
            <dataSource type="POOLED">
                <!--连接池的配置信息-->
                <property name="username" value="root"/>
                <property name="password" value="asd"/>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"/>
<!---两个斜杠后面localhost:3306/但是三个斜杠就可省略了这个,直接写数据库名。-->
            </dataSource>
        </environment>
        <!--生产环境-->
        <environment id="pro">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
        <!--测试环境-->
        <environment id="test">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>

    <!--
        指定加载哪些映射配置文件:mappers
            mapper标签:每一个mapper标签负责加载一个配置文件;resource指定要加载的映射配置文件的路径
    -->
    <mappers>
        <mapper resource="com/gavin/dao/UserDao.xml"></mapper>//注意是斜线!
    </mappers>
</configuration>

6. java代码测试

测试包里面绿色java包里面,建个和上面一样的包结构,com.gavin里面一个测试类名即可。

然后运行,点方法旁边的绿色箭头运行即可。

bash 复制代码
package com.gavin;

import com.gavin.dao.UserDao;
import com.gavin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.apache.ibatis.io.Resources;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


public class TestMybatis {
    @Test
    public void testFindAll() throws IOException {
        //1.让mybatis框架去加载主配置文件
        //1.1 将主配置文件SqlMapConfig.xml转换成字节输入流
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //1.2创建一个SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
        //1.3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);
        //1.4使用sqlSessionFactory对象创建处SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();//使用了工厂模式

最终目标://2.使用sqlSession对象创建出UserDao接口的代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);//使用了动态代理

        //3.调用userDao代理对象的findAll()方法进行查询
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);
        }

        //4.关闭资源
        sqlSession.close();
        is.close();
    }
}

Mapper动态代理方式开发

入门案例回顾

Mapper.xml(映射文件)

  1. 映射配置文件存储的路径在resources里面,要和对应的Dao接口的路径保持一致
  2. 映射配置文件的文件名必须和Dao接口名保持一致
  3. 一定要引入约束文件
  4. namespace属性的值和对应Dao接口的全限定名一致
  5. 每一个子标签,就对应Dao接口中的一个方法
    查询方法就对应select标签
    添加方法就对应insert标签
    删除方法就对应delete标签
    修改方法就对应update标签

标签的id就对应方法的名字

标签的parameterType就对应方法的参数类型

标签的resultType(只有select标签才有)就对应方法的返回值类型,如果返回值类型是List,那么resultType就是List的泛型类型

标签体中的内容就是要执行的sql语句

bash 复制代码
<?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.gavin.dao.UserDao"> 
    <select id="findAll" resultType="com.gavin.pojo.User">
        select * from t_user
    </select>
</mapper>

Mapper.java(dao接口)

bash 复制代码
public interface UserDao {

    /**
     * 执行一个查询所有用户的sql语句,并且将查询到的结果封装到List<User>
     * @return
     */
    public List<User> findAll();

}

规范

Mapper接口开发需要遵循一下规范:

  1. 存储路径建议和对应的Dao接口保持一致
  2. 文件名建议和对应的Dao接口的名字保持一致
  3. 配置文件的根标签的namespace属性必须和对应的Dao接口的全限定名保持一致
  4. 接口中的每一个方法,就对应映射配置文件中的一个标签
    a) 查询方法,对应select标签
    b) 添加方法,对应insert标签
    c) 删除方法,对应delete标签
    d) 修改方法,对应update标签
  5. 映射配置文件中的标签的id属性,就必须和对应的方法的方法名保持一致
  6. 映射配置文件中的标签的parameterType属性,就必须和对应的方法的参数类型(全限定名)保持一致
  7. 映射配置文件中的标签的resultType属性,就必须和对应的方法的返回值类型(全限定名)保持一致,但是如果返回值是list则和其泛型保持一致

核心配置文件详解

核心配置文件的顺序

标签顺序如上图

properties(引入外部的properties文件)

.properties文件同样放在在根目录下。

jdbc.properties配置文件

bash 复制代码
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.user=root
jdbc.password=asd

SqlMapConfig.xml核心配置文件

bash 复制代码
<?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标签引入外部的properties文件
        目的:也是为了配置文件解耦,专门的信息就放到专门的配置文件中
    -->
    <properties resource="jdbc.properties"></properties>

      <environments default="dev">
        <!--开发环境-->
        <environment id="dev">
            <!--事务管理者,type为JDBC表示使用JDBC的事务管理者(了解)-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource表示数据源,1.POOLED表示使用自带的连接池,2.UNPOOLED表示不使用连接池,3.JNDI表示使用JNDI连接池-->
            <dataSource type="POOLED">
                <!--连接池的配置信息-->
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
            </dataSource>
        </environment>
            </environments>
......
 </configuration>

typeAliases(类型别名)

定义单个别名

• 核心配置文件

bash 复制代码
<typeAliases>
    <typeAlias type="com.gavin.pojo.User"  alias="user"></typeAlias>
还可以写很多个。<typeAlias>,一个<typeAlias>代表一个。
</typeAliases>

• 修改UserDao.xml

bash 复制代码
<select id="findAll" resultType="user">//直接用自定义的别名
    select * from t_user
</select>
批量定义别名

因为有的时候pojo里面的类过多,一个一个写很麻烦。

因为所有要配置别名的类都写在一个包当中,所以我们可以使用包扫描去配置别名,通过package标签扫描整个包,就能给该包中所有类都配置别名,别名就是该类的类名,不区分大小写。

使用package定义的别名:就是pojo的类名,不区分大小写。

bash 复制代码
<typeAliases>
    <package name="com.gavin.pojo"/>//这里没有类名
</typeAliases>

修改UserDao.xml

bash 复制代码
<select id="findAll" resultType="User">//直接类名就可以
    select * from t_user
</select>

Mapper

方式一:引入映射文件路径
bash 复制代码
<mappers>
    <mapper resource="com/gavin/dao/UserDao.xml"></mapper>
</mappers>
方式二:扫描接口

• 配置单个接口

bash 复制代码
<mappers>
    <mapper resource="com.gavin.dao.UserDao "></mapper>
</mappers>

• 批量配置

当配置文件太多了,还有别的很多dao,还挨个配置很麻烦。

bash 复制代码
<mappers>
    <package name="com.gavin.dao"/>
</mappers>

注意

核心配置文件的顺序不能错

相关推荐
shuair1 小时前
idea 2023.3.7常用插件
java·ide·intellij-idea
小安同学iter1 小时前
使用Maven将Web应用打包并部署到Tomcat服务器运行
java·tomcat·maven
Yvonne9781 小时前
创建三个节点
java·大数据
不会飞的小龙人3 小时前
Kafka消息服务之Java工具类
java·kafka·消息队列·mq
是小崔啊3 小时前
java网络编程02 - HTTP、HTTPS详解
java·网络·http
brevity_souls4 小时前
Spring Boot 内置工具类
java·spring boot
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
shix .4 小时前
什么是tomcat
java·tomcat
java技术小馆4 小时前
Deepseek整合SpringAI
java·spring cloud
天荒地老笑话么4 小时前
Mac安装配置Tomcat 8
java·macos·tomcat