美文网首页
(一)初始mybatis

(一)初始mybatis

作者: 陈煦缘 | 来源:发表于2019-10-31 17:58 被阅读0次

1.mybatis介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

官方文档连接

2.mybatis的优点

1、MyBatis是最简单的持久化框架,小巧并且简单易学。
2、MyBatis灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
3、提供XML标签,支持编写动态SQL语句(XML中使用if, else)。
4、提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。

3.mybatis的缺点

对SQL语句依赖程度很高,导致数据库移植性差。比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。

4.myatis入门demo

  • 1.首先创建一个maven项目


    image.png
    image.png
    image.png
    1. 将下面的 dependency 代码置于 pom.xml 文件中
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.frank</groupId>
    <artifactId>mybatis-studying</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
   
    <dependencies>
        <!--配置mybatis需要的依赖包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <!--数据库 mysql 驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
            <scope>test</scope>
        </dependency>

        <!--junit 测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

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

</project>

  • 3.创建数据库和表信息
database structure for mybatis_test
CREATE DATABASE IF NOT EXISTS `mybatis_test` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;
USE `mybatis_test`;

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;


INSERT INTO `user` (`id`, `username`, `birthday`, `sex`, `address`) VALUES
    (1, '王五', NULL, '2', NULL),
    (10, '张三', '2014-07-10', '1', '北京市'),
    (16, '张小明', NULL, '1', '河南郑州'),
    (22, '陈小明', NULL, '1', '河南郑州'),
    (24, '张三丰', NULL, '1', '河南郑州'),
    (25, '陈小明', NULL, '1', '河南郑州'),
    (26, '王五', NULL, NULL, NULL),
    (27, 'gyf05', '2019-08-15', '2', '广州');
  • 4.创建jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
  • 5.创建xml映射配置文件:sqlMapconfig.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>
    <properties resource="jdbc.properties"/>
    <!-- 别名 包以其子包下所有类   头字母大小都行-->
    <typeAliases>
        <!--        <typeAlias type="com.frank.dao.model" alias="User"/> -->
        <package name="com.frank.dao.model"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- Mapper的位置  Mapper.xml 写Sql语句的文件的位置 -->
    <mappers>


        <!-- 1.resource方式
         在UserMapper.xml,定义namespace为mapper接口的地址,映射文件通过namespace找到对应的mapper接口文件
          -->
        <mapper resource="com.frank.dao.mapper/UserMapper.xml"/>


        <!--2. class方式 class:指定 mapper接口的地址
          遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同-->
        <!--  <mapper class="com.com.frank.dao.mapper.UserMapper"/> -->

        <!--3. 批量mapper扫描
            遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同
        -->
        <!--<package name="com.com.frank.dao.mapper"/>-->


    </mappers>
</configuration>
  • 6.创建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">
<!-- 写Sql语句   -->
<mapper namespace="com.frank.dao.mapper.UserMapper">


    <!-- 通过ID查询一个用户 -->
    <select id="findUserById" parameterType="Integer" resultType="com.frank.dao.model.User">
        SELECT *
        FROM user
        WHERE id = #{id}
    </select>

    <!-- //根据用户名称模糊查询用户列表
    #{}    select * from user where id = ?    占位符  ? ==  '五'
    ${}    select * from user where username like '%五%'  字符串拼接
     -->
    <select id="findUserByUsername" parameterType="String" resultType="com.frank.dao.model.User">
        SELECT *
        FROM user
        WHERE username LIKE "%"#{haha}"%";
    </select>

    <!-- 添加用户 -->
    <insert id="insertUser" parameterType="User">

        <!--selectKey  会将 SELECT LAST_INSERT_ID()的结果放入到传入的model的主键里面,
        keyProperty 对应的model中的主键的属性名,这里是 user 中的id,因为它跟数据库的主键对应
        order AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,
        BEFORE 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,
        这种适合那种主键不是自增的类型
        resultType 主键类型 -->
        <selectKey keyProperty="id" resultType="Integer" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user (username,birthday,address,sex)
        values (#{username},#{birthday},#{address},#{sex})
    </insert>


    <!-- 更新 -->
    <update id="updateUserById" parameterType="User">
        UPDATE user
        SET username = #{username}, sex = #{sex}, birthday = #{birthday}, address = #{address}
        WHERE id = #{id}
    </update>

    <!-- 删除 -->
    <delete id="deleteUserById" parameterType="Integer">
        DELETE FROM user
        WHERE id = #{id}
    </delete>

</mapper>

    1. 开始测试
package com.frank.test;

import com.frank.dao.model.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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

import java.util.Date;
import java.util.List;

/**
 * @author :frank
 * @date :2019-08-13 16:57
 * @description : 测试
 */
public class MapperTest {


    private SqlSession session;

    @Before
    public void before() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //读取配置文件的配置信息,利用SqlSessionFactoryBuilder创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //通过SqlSessionFactory创建SqlSession。
        session = sessionFactory.openSession();
    }

    @After
    public void after() {
        System.out.println("after.....关闭session");
//        关闭SqlSession。
        session.close();
    }

    /**
     * 查询:一条记录和多条记录
     *
     * @throws IOException
     */
    @Test
    public void findUser() throws IOException {
        //查询一条结果
        User user = session.selectOne("findUserById", 10);
        System.out.println(user);

        //查询多条结果
        List<User> users = session.selectList("findUserByUsername", "小明");
        System.out.println(users);
    }


    //删除用户
    @Test
    public void deleteUserById() throws IOException {
        int affectRow = session.delete("deleteUserById", 27);
        session.commit();//事务
        System.out.println("受影响的行数:" + affectRow);
    }


    /**
     * 插入后,往模型里设置id
     */
    @Test
    public void insertUser() throws IOException {
        User user = new User("gyf05", "2", new Date(), "广州");
        int affectRow = session.insert("insertUser", user);
        session.commit();//事务
        System.out.println("受影响的行数:" + affectRow);
        System.out.println("用户的ID:" + user.getId());
    }
}
  

5.工程结构

image.png

代码全部测试通过!

相关文章

网友评论

      本文标题:(一)初始mybatis

      本文链接:https://www.haomeiwen.com/subject/kevtbctx.html