【MyBatis01】MyBatis框架入门和简单使用

概述

mybatis框架是一个持久层框架,何为持久层,其实就是操作数据库的框架,将数据从内存持久化进数据库硬盘,即为持久层框架。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

即mybatis大部分工作在于配置配置文件(这一工作据说将会在springboot中被简化)

MyBatis与spring和springmvc并称为ssm,其关系是这样的:

三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。

springMVC在三层架构中扮演的是视图层的角色
spring是业务逻辑层
mybatis则是数据访问层(持久层)

springboot 好像是简化了他们的操作或者是spring的配置操作,作者刚开始学框架所以了解不多,仅供参考。
我计划的学习路线是:mybatis-spring-springmvc-springboot

入门

0、创建数据库

javabean实体类的属性需要和创建的数据库中的字段保持一致

1、加入依赖

首先,创建项目并在maven中加入mybatis mysql的依赖

在这里插入图片描述

项目目录结构如上

在pom.xml中加入配置文件插件,不然编译的时候不会把配置文件编译进去

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <!--filtering不启用过滤器,*.properties已经起到过滤作用了-->
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

2、SQL映射配置文件

UserDao.xml是sql映射配置文件,作用是配置要执行的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">
<mapper namespace="org.example.dao.UserDao">
    <select id="selectUsers" resultType="org.example.domain.User">
        select * from user order by `id`
    </select>
</mapper>
<!--
mapper:根标签
    namespace="org.example.dao.UserDao"、
        要求是dao接口的全限定名称 包名.类名
select:表示查询
    id="selectUsers"
        要求使用接口中的方法名称
    resultType="User"
        表示结果类型的,sql执行结束得到的ResultSet,遍历时得到的java对象的类型
        要求是bean类的全限定名称 包名.类名
update:更新
insert:添加
delete:删除
-->

UserDao需要是接口形式的

package org.example.dao;

import org.example.domain.User;

import java.util.List;

public interface UserDao {
    public List<User> selectUsers();
}

3、主配置文件

Javabean就是正常的实体类,其中的属性与数据库中的列相对应即可

resources.mybatis.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>
    <!--
    环境配置:数据库的连接信息
    default="development"
        告诉mybatis使用哪个数据库的连接信息
    -->
    <environments default="mydev">
        <!--
            environment id="development"
            一个数据库信息的配置、环境
            id:一个唯一值,自定义,表示环境名称
         -->
        <environment id="mydev">
            <!--
                transactionManager type="JDBC"
                mybatis的事务类型
                type:jdbc(表示使用jdbc中的connection对象的commit,rollback做事务处理)
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource type="POOLED"
                表示数据源,连接数据库的
                type:表示数据源类型
                POOLED:表示使用数据库连接池
            -->
            <dataSource type="POOLED">
                <!--
                    配置数据库的各种信息
                -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--
        sql mapper的位置(UserDao.xml)
    -->
    <mappers>
        <!--
            需要时编译后从类路径开始的信息(target\classes之后的
        -->
        <mapper resource="org\example\dao\UserDao.xml"/>
    </mappers>
</configuration>

4、主程序(执行sql)

MyApp是主程序

package org.example;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.domain.User;

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

public class MyApp {
    public static void main(String[] args) {
        //定义主配置文件名
        String config = "mybatis.xml";
        //获取输入流,将主配置文件输入程序
        InputStream in = null;
        try {
             in = Resources.getResourceAsStream(config);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //*获取SqlSession对象,从SqlSessionFactory中获取sqlSession
        SqlSession sqlSession = factory.openSession();
        //<mapper namespace="org.example.dao.UserDao">
        //    <select id="selectUsers" resultType="org.example.domain.User">
        //        select * from user order by `id`
        //    </select>
        //</mapper>
        //指定要执行的sql语句的标识。sql映射文件中的,namespace+.+标签id
        String sqlId = "org.example.dao.UserDao" + "." + "selectUsers";
        //执行sql语句,通过sqlId找到配置文件中的语句
        //通过sqlSession.selectList方法查询封装查询出的数据
        List<User> userList = sqlSession.selectList(sqlId);
        for (User user : userList) {
            System.out.println(user);
        }
        //关闭资源
        sqlSession.close();
    }
}

遇到的问题

1、 找不到依赖的jar包

手动删除项目目录下的 iml文件,然后在idea的命令行中执行

mvn idea:moudle

重新生成iml文件即可

2、 &符号在mybatis配置文件的url中报错

解决方法:用 &amp; 代替 & 符号

3、数据库不能插入中文,和插入中文乱码

前者需要修改数据库、表、还有表中列的编码格式为utf8

后者需要在url中指定编码utf8 characterEncoding=utf-8

4、 运行时出现警告

WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

"jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&amp;useSSL=false"

如上所示:在url中加入useSSL=false即可

插入操作

首先在对应接口中加入插入方法:

package org.example.dao;

import org.example.domain.User;

import java.util.List;

public interface UserDao {
    public List<User> selectUsers();
     /**
     * 
     * @param user 要添加的对象
     * @return  在数据库中影响的几行数据
     */
    public int insertUser(User user);
}

然后在对应的sql映射配置文件mapper中加入对应标签

<!-- 其中#{id}, #{name}, #{pwd} 是mybatis中对实体类对应数据的表示方法 -->
<insert id="insertUser" >
    insert into user values (#{id}, #{name}, #{pwd})
</insert>

然后,在主方法中执行sql语句即可

重点是sqlSession.commit(); 因为在mybatis中是不自动提交事务的,所以需要手动提交。

@Test
public void testInsertUser(){
    //定义主配置文件名
    String config = "mybatis.xml";
    //获取输入流,将主配置文件输入程序
    InputStream in = null;
    try {
        in = Resources.getResourceAsStream(config);
    } catch (IOException e) {
        e.printStackTrace();
    }
    //创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //创建SqlSessionFactory对象
    SqlSessionFactory factory = builder.build(in);
    //*获取SqlSession对象,从SqlSessionFactory中获取sqlSession
    SqlSession sqlSession = factory.openSession();
    //指定要执行的sql语句的标识。sql映射文件中的,namespace+.+标签id
    String sqlId = "org.example.dao.UserDao" + "." + "insertUser";
    User user = new User();
    user.setName("赵六");
    user.setPwd("123");
    //执行sql语句,通过sqlId找到配置文件中的语句
    //通过sqlSession.selectList方法查询封装查询出的数据
    int insert = sqlSession.insert(sqlId, user);
    sqlSession.commit();
    System.out.println(insert);
    //关闭资源
    sqlSession.close();
}

日志

在mybatis配置文件的根标签中加入:

<!-- 设置mybatis全局行为 -->
<settings>
    <!-- 设置mybatis输出日志 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

此后再执行数据库操作就会在控制台中打印日志信息,如下

使用适配器初始化日志。
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
数据库连接池源 强制关闭/删除了所有连接。
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
打开JDBC连接
Opening JDBC Connection
创建连接1815546035。
Created connection 1815546035.
在JDBC连接上设置autocommit(自动提交)为false
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6c3708b3]
准备:select * from user order by ' id '
==>  Preparing: select * from user order by `id` 
参数
==> Parameters: 
<==    Columns: id, name, pwd
<==        Row: 1, zs, 123
<==        Row: 2, ls, 123
<==        Row: 3, 王五, 123
<==        Row: 4, ??, 123
<==        Row: 5, 赵六, 123
<==      Total: 5

程序执行输出的信息
User{id=1, name='zs', pwd='123'}
User{id=2, name='ls', pwd='123'}
User{id=3, name='王五', pwd='123'}
User{id=4, name='??', pwd='123'}
User{id=5, name='赵六', pwd='123'}

在JDBC连接上将autocommit(自动提交事务)设置为true
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6c3708b3]
关闭JDBC连接
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@6c3708b3]	
将数据库连接对象返回数据库连接池
Returned connection 1815546035 to pool.		

如果执行的是添加操作,日志信息如下

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 439904756.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1a3869f4]
发现这里其实mybatis用 ? 帮你填充好了值
==>  Preparing: insert into user values (?, ?, ?) 
这里是要添加的参数
==> Parameters: 0(Integer), 赵六(String), 123(String)
数据库更新行数:1
<==    Updates: 1
提交JDBC连接
Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1a3869f4]
这里是程序执行打印的值
1
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1a3869f4]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1a3869f4]
Returned connection 439904756 to pool.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值