MyBatis实战详解

前面使用了jdbc来连接数据库,有许多底层的连接和查询代码,参数设置需要我们自己去做。MyBatis是一个良好的框架帮助我们连接数据库

MyBatis

概念:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  • a) 程序员在使用框架的时候,通常以配置文件的方式告知框架需要的信息,多数会使用 xml 作为框架的配置文件.

  • b) 因此, 在使用框架开发代码时, 需要编写配置文件, 代码的编写反而会减少.

  • c) 框架都是第三方提供的, 提供的都是 jar 包. 因此, 使用框架前, 必须将框架涉及的 jar 包导入项目中.

MyBatis 环境搭建 jar 包详解

MyBatis 核心 jar
mybatis-3.2.7.jar
MyBatis 依赖的 jar
asm-3.3.1.jar 字节码解析包, 被 cglib 依赖
cglib-2.2.2.jar 动态代理的实现
commons-logging-1.1.1.jar 日志包 javassist-3.17.1-GA.jar 字节码解析包
log4j-1.2.17.jar 日志包
log4j-api-2.0-rc1.jar 日志
log4j-core-2.0-rc1.jar 日志
slf4j-api-1.7.5.jar 日志
slf4j-log4j12-1.7.5.jar 日志
驱动 jar
mysql-connector-java-5.1.48.jar

构建第一个MyBatis项目来连接数据库

先构建一个web项目,在web.WEB-INF下构建lib包,将需要的jar包导入
在这里插入图片描述

MyBatis 核心配置文件

要求
是一个 xml 文件 , 命名无要求 , 位置无要求 , 一般叫 mybatis.xml或applicationContext-dao.xml, 放在 src 目录下.

dtd:MyBatis 官方提供了applicationContext-dao的 dtd 约束, 方便 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">

applicationContext-dao.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>
    <environments default="development">   <!--默认使用的环境-->
        <environment id="development">
            <transactionManager type="JDBC"/>  <!--使用事务管理沿用JDBC的事务-->
            <dataSource type="POOLED">   <!--使用连接池-->
                <property name="driver" value="oracle.jdbc.OracleDriver"/> <!--驱动-->
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/><!--要连接的数据库-->
                <property name="username" value="servlet"/><!--用户名-->
                <property name="password" value="servlet"/><!--密码-->
            </dataSource>
        </environment>

    </environments>
Mapper 映射文件

在 MyBatis 中, 推荐使用 mapper 作为包名, 我们只需要写一个映射配置文件即可. UserMapper.xml, 用于定义要执行的 SQL 语句, 同时设定返回结果的类型.
dtd:MyBatis 官方提供了 mappar的dtd 约束, 方便 xml 的编写

<?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">

UserMapper.xml:

<?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.batis.mapper.UserMapper"> <!--这是名称空间的值写当前配置文件所在的包的包名-->
    <select id="selByName" resultType="com.batis.pojo.User">
        select * from t_user where uname = '李四'
    </select>
</mapper>
在核心配置文件中添加 mapper 扫描
<!--扫描mybatis的sql语句所在的文件-->
    <mappers>
        <mapper resource="com/batis/mapper/UserMapper.xml"></mapper>
    </mappers>

applicationContext-dao.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>
    <environments default="development">   <!--默认使用的环境-->
        <environment id="development">
            <transactionManager type="JDBC"/>  <!--使用事务管理沿用JDBC的事务-->
            <dataSource type="POOLED">   <!--使用连接池-->
                <property name="driver" value="oracle.jdbc.OracleDriver"/> <!--驱动-->
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/><!--要连接的数据库-->
                <property name="username" value="servlet"/><!--用户名-->
                <property name="password" value="servlet"/><!--密码-->
            </dataSource>
        </environment>

    </environments>
    <!--扫描mybatis的sql语句所在的文件-->
    <mappers>
        <mapper resource="com/batis/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>
编写测试代码

TestBatis:

package com.batis.test;

import com.batis.pojo.User;
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.junit.Test;

import java.io.IOException;
import java.io.Reader;

public class TestBatis {
    @Test
    public void test() throws IOException {
        //加载MyBatis的核心配置文件,通过流的方式读取,注意配置文件要放在src目录下
        Reader in = Resources.getResourceAsReader("applicationContext-dao.xml");//字符流
        //通过配置文件构建工厂类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //通过工厂类构建发送sql语句的session对象,事务是手动提交的
        SqlSession session = factory.openSession();
        Object user = session.selectOne("com.batis.mapper.UserMapper.selByName");//传入命名空间加sql的id,返回值为object
        //默认会封装成对象,类型在com.batis.mapper.UserMapper的resulttype中
        User u = (User)user;
        System.out.println(u);
    }
}

运行结果:

D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=58288:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.TestBatis,selectOne
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
User{tid=12, uname='李四', pwd='123456', sex=1}

Process finished with exit code 0

MyBatis 中常用的三个查询方法

1 selectList
用于查询多条数据的情况, 返回值是一个 list 集合. 如果没有查到任何数据, 返回没有元素的集合(空集合, 不是 null)
2 selectOne
用于查询单条数据的情况, 返回值是一个对象. 如果没有查到任何数据, 返回null
3 selectMap
用于查询多条数据的情况, 多条数据要形成一个 Map 集合. 需要指定哪个属性作为 key. 如果查不到, 返回一个空 map 集合(不是 null)
例子:
UserMapper.xml:

<?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.batis.mapper.UserMapper"> <!--这是名称空间的值写当前配置文件所在的包的包名-->
    <select id="selByName" resultType="com.batis.pojo.User">
        select * from t_user where uname = '李四'
    </select>
    <select id="selAll" resultType="com.batis.pojo.User"><!--返回值是集合,则返回集合的泛型即可-->
        select * from t_user
    </select>
</mapper>

TestBatis:

package com.batis.test;

import com.batis.pojo.User;
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.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Map;

public class TestBatis {
    private SqlSession session;
    public TestBatis()  throws IOException{
        //加载MyBatis的核心配置文件,通过流的方式读取,注意配置文件要放在src目录下
        Reader in = Resources.getResourceAsReader("applicationContext-dao.xml");//字符流
        //通过配置文件构建工厂类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //通过工厂类构建发送sql语句的session对象,事务是手动提交的
        session = factory.openSession();
    }
    @Test
    public void selectOne() {
        User user = session.selectOne("com.batis.mapper.UserMapper.selByName");//传入命名空间加sql的id,返回值为object
        //默认会封装成对象,类型在com.batis.mapper.UserMapper的resulttype中
        System.out.println(user);
    }
    @Test
    public void selectAll(){
        List<User> list = session.selectList("com.batis.mapper.UserMapper.selAll");
        System.out.println(list);
    }
    @Test
    public void selectAll2(){
        Map<User, Integer> tid = session.selectMap("com.batis.mapper.UserMapper.selAll", "tid");
        System.out.println(tid);
    }
}

运行结果:
selectAll():

D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=58273:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.TestBatis,selectAll
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[User{tid=12, uname='李四', pwd='123456', sex=1}, User{tid=10, uname='王五', pwd='123456', sex=1}, User{tid=11, uname='张三', pwd='123456', sex=1}, User{tid=5, uname='李超', pwd='123', sex=0}, User{tid=6, uname='赵飞燕', pwd='123456', sex=0}]

Process finished with exit code 0

selectAll2():

D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=58306:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.TestBatis,selectAll2
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
{5=User{tid=5, uname='李超', pwd='123', sex=0}, 6=User{tid=6, uname='赵飞燕', pwd='123456', sex=0}, 10=User{tid=10, uname='王五', pwd='123456', sex=1}, 11=User{tid=11, uname='张三', pwd='123456', sex=1}, 12=User{tid=12, uname='李四', pwd='123456', sex=1}}

Process finished with exit code 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值