2、第一个Mybatis程序


思路:

  1. 搭建环境
  2. 导入mybatis
  3. 编写代码
  4. 测试

2.1、搭建环境

1.搭建数据库

sql要求很高

-- 创建数据库
create database `mybatis`

use `mybatis`

-- 创建表

create table `user`(
	`id` varchar(20) not null primary key, -- 主键
	`name` varchar(30) default null,
	`pwd` varchar(30) default null
	
)engine = innodb default CHARSET = utf8;  -- 引擎

-- engine = innodb 底层 面试题

-- 插入数据
insert into `user`(`id`,`name`,`pwd`) values
(1,'张三','123'),
(2,'李四','123123'),
(3,'王五','456')

2.新建项目

  1. 普通的maven项目

  2. 删除src目录,可以当做父工程来用

  3. 导入maven依赖

    1. <!--导入依赖-->
          <dependencies>
              <!--MySQL驱动-->
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>8.0.24</version>
              </dependency>
              <!--mybatis-->
              <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
              <dependency>
                  <groupId>org.mybatis</groupId>
                  <artifactId>mybatis</artifactId>
                  <version>3.5.6</version>
              </dependency>
              <!--junit-->
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      

2.2、创建一个模块

编写mybatis的核心配置文件

  • 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">
    <!--configuration:核心配置文件-->
    <configuration>
        <!--environments:配置多个环境-->
        <environments default="development">
            <environment id="development">
                <!--transactionManager:事务管理器-->
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <!--useSSL=false:安全的连接
                        &amp;:等同于,&
                        useUnicode=true:使用Unicode,统一字符编码
                        characterEncoding:字符编码
                        serverTimezone=GMT :服务器时区,世界时
                    -->
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT "/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <!--每一个Mapper.XML都需要在mybatis核心配置文件中注册!-->
        <mappers>
            <mapper resource="com/yin/dao/UserMapper.xml"/>
        </mappers>
    </configuration>
    

编写mybatis工具类

  • // SqlSessionFactory (工厂模式,生成产品的) ---> 生成的产品:sqlSession
    public class MybatisUtils {
    
        private static SqlSessionFactory sqlSessionFactory;
    
        static {//初始就加载
            try {
                /*使用Mybatis第一步:获取sqlSessionFactory对象*/
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                //通过 Builder 把流加载进来
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /*既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
        SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
        创建一个能执行sql的对象。*/
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    
    }
    

2.3、编写代码

实体类

//实体类
public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

Dao接口

操作数据库对象的实体类

Dao 等价于:mapper(制图员)

  //Dao 等价于:mapper(制图员)
  public interface UserDao {
      List<User> getUserList();
  
  }

接口实现类

操作数据库的实现类

由原来的UserDaoImpl转变为一个Mapper配置文件

  <?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">
  <!--namespace:绑定一个对应的Dao/Mapper接口(实现了这个接口)-->
  <mapper namespace="com.yin.dao.UserDao">
  
      <!--select:查询语句 ,
      重写getUserList()方法
      resultType:返回类型,返回一个,一般常用 (所有的集合,都写泛型里的,不写集合)
      resultMap:返回集合,返回多个
      -->
      <select id="getUserList" resultType="com.yin.pojo.User">
          select * from user
      </select>
  </mapper>

2.4、测试

在maven中测试的包和开发的包一一对应(规范)

注意点:

  • org.apache.ibatis.binding.BindingException: Type interface com.yin.dao.UserDao is not known to the MapperRegistry.
  • 类型接口 Dao是未知的,在MapperRegistry注册中心里

MapperRegistry是什么?

核心配置文件中注册 mappers

junit测试

public class UserDaoTest {

    @Test
    public void test(){

        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //第二步:执行SQL,获得Dao对象(两种方式)
        // 方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.getUserList();
      
      	//方式二:
        //List<User> userList = sqlSession.selectList("com.yin.dao.UserDao.getUserList");
      
        for (User user : userList) {
            System.out.println(user);
        }
        //关闭连接
        sqlSession.close();
    }
}
--------------------------------
User{id=1, name='张三', pwd='123'}
User{id=2, name='李四', pwd='123123'}
User{id=3, name='王五', pwd='456'}

遇到的问题

配置文件没有注册

mybatis的核心配置文件

resources文件下mybatis-config.xml

在这里插入图片描述

绑定接口错误

在这里插入图片描述

方法名不对,返回类型不对

关于sql的改造,从写java代码到现在写xml配置文件
在这里插入图片描述

字符错误

把xml中的文件UTF-8改为UTF8,或者不写中文注释
在这里插入图片描述

maven导出资源问题

maven由于他的约定大于配置,

我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,

解决方案:

  • maven默认资源配置文件在resources目录下,现在放在了java目录下,java目录下导出不了,

  • 所有我们手动配置资源过滤,让他下面的src/main/java里面的resources或xml文件能够被导出,过滤开启。

  • 在这里插入图片描述

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

思路

步骤:

  1. 写MybatisUtils工具类,工具类需要配置文件
  2. 在resources下写配置文件mybatis-config.xml
  3. 写实体类
  4. 写接口
  5. 写UserMapper.xml
  6. maven导出资源问题,手动配置资源过滤
  7. 写测试类UserDaoTest

准备工作

1.连接数据库,导入MySQL jar包、mybatis jar包为了做准备工作,需要一个: SqlSessionFactory对象,(官网要求的)

所有建造了一个工具类,工具类对应官网入门里的这三行代码,(固定代码)

三行代码:为了获取工厂。先把三行代码提取成公共类,每次都用

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2.编写mybatis的核心配置文件

配置文件中,连接数据库,(死代码)只需修改参数

代码实现

3.实体类、接口、UserMapper.xml文件(代替原来的实现类)

怎么代替的实现类?

在UserMapper.xml中

  • namespace绑定接口

  • 里边的标签:id绑定方法

  • 标签体:写sql

  • 返回值类型:专注于返回值,不需要和原来一样写结果集去遍历了。

  • 返回User,最终测试的时候,直接调用方法即可

mybatis三个核心接口

SqlSessionFactoryBuilder

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//加载流,返回 sqlSessionFactory

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式(默认单例模式)。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}

在所有代码中都遵循这种使用模式,可以保证所有数据库资源都能被正确地关闭。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小尹^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值