MyBatis入门实例

什么是MyBatis

MyBatis是一款优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

环境准备

下载依赖

从maven仓库下载mybatis依赖https://mvnrepository.com
进入maven仓库官网(官网有点慢,请耐心等待),点击我是人类。
在这里插入图片描述搜索mybatis
在这里插入图片描述
点击mybatis
在这里插入图片描述
选择版本
在这里插入图片描述
找到maven依赖
在这里插入图片描述

以同样的方法下载mysql数据库驱动依赖,单元测试依赖,log4j日志依赖

pom.xml文件导入依赖的jar包

创建一个maven项目

<dependencies>
          <!--  mysql数据库驱动依赖-->
         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.23</version>
         </dependency>
         
     <!--      mybatis依赖-->
         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.6</version>
         </dependency>
         
         <!--  单元测试依赖-->
         <!-- https://mvnrepository.com/artifact/junit/junit -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.13.2</version>
             <scope>test</scope>
         </dependency>
         
         <!--  log4j日志依赖-->
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
             <version>1.2.17</version>
         </dependency>
         
         <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <version>1.18.18</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>

注意下载依赖需要联网
在这里插入图片描述
注意:pom.xml文件还需要加上如下代码,不然放在src/main/java和src/main/resources路径下的xml和properties文件加载不到。

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

jdbc.properties配置文件

username=root
password=968426
url=jdbc:mysql://localhost:3306/mydate?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=true
driver=com.mysql.cj.jdbc.Driver

log4j.properties配置文件

# 全局日志配置
log4j.rootLogger=DEBUG,console

### 控制台输出的相关设置 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG 
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%c]-%m%n
        
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

全局配置文件(mybatis-config.xml)

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置文件信息 -->
    <properties resource="jdbc.properties"/>
    <!--    日志和缓存设置-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!--    指定包下的类起别名(类名首字母小写),配置后XXXMapper.xml中的参数和返回值类型可以使用别名,没有配置必须使用全类名-->
    <typeAliases>
        <package name="com.jie.pojo"/>
    </typeAliases>
    <!-- 环境,可以配置多个,default:指定采用哪个环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 事务管理器,JDBC类型的事务管理器 -->
            <transactionManager type="JDBC"/>
            <!-- 数据源,池类型的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

<!--注册XXXMapper.xml文件-->
    <mappers>
<!-- 必须保证接口名和xml名相同,还必须在同一个包中-->
<package name="com.jie.mapper"/>
    </mappers>
</configuration>

约定大于配置,mybatis配置文件必须按照指定顺序编写代码,否则编译期就会报错
顺序: properties --> settings --> typeAliases --> typeHandlers --> objectFactory --> plugins --> environments( environment --> transactionManager --> dataSource) --> mappers

创建数据库

CREATE TABLE `book` (
  `bookID` int NOT NULL AUTO_INCREMENT,
  `bookName` varchar(100) NOT NULL,
  `bookCounts` int NOT NULL,
  `detail` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`bookID`),
  KEY `bookID` (`bookID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中的数据

在这里插入图片描述
IDEA连接数据库
在这里插入图片描述
在这里插入图片描述
可能会出现时区错误
在这里插入图片描述
如果出现时区错误在数据库中执行SET GLOBAL time_zone = ‘+8:00’;语句
解决传送门:IDEA连接mysql又报错!
在这里插入图片描述
在这里插入图片描述

实操

在这里插入图片描述

Book类(这里用了Lombok注解,需要导入Lombok依赖,和下载Lombok插件。下载完需要重启才会生效,也可以不用只要提供对应的方法就行)

@NoArgsConstructor//无参构造
@AllArgsConstructor//有参构造
@Data//get set toString方法
public class Book {
    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;
}

实体类最好和数据库中的表字段保持一致,如果不一致sql语句中要使用别名,使它们保持一致。否则查询出的结果映射不到实体类的属性中,属性和字段不匹配的会出现null值

BookMapper类

public interface BookMapper {
    //增
    int addBook(Book book);

    //删
    int delBook(@Param("bookID") int id);

    //改
    int updateBook(Book book);

    //查
    List<Book> queryBook();
    List<Book> queryBookByLike(String bookName);
}

当形参名和和传入Sql的参数不一样时,使用@Param(“bookID”)变成一致

BookMapper.xml

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jie.mapper.BookMapper">
<!---->
    <insert id="addBook" parameterType="book">
        insert into mydate.book(bookName, bookCounts, detail) VALUES(#{bookName},#{ bookCounts},#{detail});
    </insert>
<!---->
    <delete id="delBook" parameterType="int">
        delete from mydate.book where bookID=#{bookID};
    </delete>
<!---->
    <update id="updateBook" parameterType="book">
        update mydate.book set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail} where bookID=#{bookID};
    </update>
<!---->
    <select id="queryBook"  resultType="book">
        select * from  mydate.book;
    </select>
    <!--模糊查询-->
 <select id="queryBookByLike"  resultType="book" parameterType="string">
        select * from  mydate.book where bookName like "%"#{bookName}"%" ;
    </select>
</mapper>

#{}有预编译,会对输入参数进行类型解析(如果入参是String类型,设置参数时会自动加上引号),可以防止SQL注入。(建议使用)
${}没有预编译,有SQL注入问题。(不建议使用)

补充:使用#{}实现模糊查询

select * from  mydate.book where bookID like "%"#{bookName}"%";

注意传入的参数必须为String类型,否则会出现如下错误
在这里插入图片描述

MybatisUtils工具类(获取sqlSession)

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        InputStream inputStream = null;
        try {
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
      return sqlSessionFactory.openSession();
    }
}

方法测试

public class BookMapperTest {

    @Test
    public void addBook() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
        bookMapper.addBook(new Book(0,"跑路",4,"toutu"));
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void delBook() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
        bookMapper.delBook(9);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void updateBook() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
        bookMapper.updateBook(new Book(11,"跑酷",4,"酷"));
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void queryBook() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
        List<Book> books = bookMapper.queryBook();
        for (Book book:books) {
            System.out.println(book);
        }
        sqlSession.commit();
        sqlSession.close();
    }
 @Test
    public void  queryBookByLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
        List<Book> books = bookMapper.queryBookByLike("跑");
        for (Book book:books) {
            System.out.println(book);
        }
        sqlSession.commit();
        sqlSession.close();
    }
}

注意运行时,可能会出现 2 字节的 UTF-8 序列的字节 2 无效的错误。
在这里插入图片描述
解决方法:将所有.xml文件的头部信息的UTF-8改为UTF8
在这里插入图片描述

想了解mybatis更多的知识请看大佬的博客mybatis看这一篇就够了,简单全面一发入魂

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值