1. 程式人生 > 其它 >2021強網杯 [強網先鋒]賭徒

2021強網杯 [強網先鋒]賭徒

Mybtis中文官方文件:https://mybatis.org/mybatis-3/zh/index.html

一、什麼是Mybatis

Mybatis是一款優秀的持久層框架,支援自定義 SQL、儲存過程以及高階對映,MyBatis 免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。

持久層:持久層,可以理解成資料儲存在資料庫或者硬碟一類可以儲存很長時間的裝置裡面,不像放在記憶體中那樣斷電就消失了,也就是把資料存在持久化裝置上。

二、Mybatis與傳統JDBC的比較

JDBC(Java Data Base Connection,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成.JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式。

JDBC,MyBatis的區別:

  1. 從層次上看,JDBC是較底層的持久層操作方式,而MyBatis都是在JDBC的基礎上進行了封裝,使其更加方便程式設計師對持久層的操作。
  2. 從功能上看,JDBC就是簡單的建立資料庫連線,然後建立statement,將sql語句傳給statement去執行,如果是有返回結果的查詢語句,會將查詢結果放到ResultSet物件中,通過對ResultSet物件的遍歷操作來獲取資料;MyBatis是將sql語句中的輸入引數和輸出引數對映為java物件,sql修改和優化比較方便。
  3. 從使用上看,如果進行底層程式設計,而且對效能要求極高的話,應該採用JDBC的方式;如果要靈活使用sql語句的話建議採用MyBatis框架。

MyBatis相比JDBC的優勢:

  1. MyBatis使用已有的連線池管理,避免浪費資源,提高程式可靠性。
  2. MyBatis提供了一級和二級快取(需要配置開啟),提高了程式效能。
  3. MyBatis使用動態SQL語句,提高了SQL維護。(此優勢是基於XML配置)
  4. MyBatis可使用配置檔案管理sql語句:使用JDBC對資料庫進行操作時,SQL查詢語句分佈在各個Java類中,這樣可讀性差,不利於維護,當我們修改Java類中的SQL語句時要重新進行編譯;Mybatis可以把SQL語句放在配置檔案中統一進行管理,以後修改配置檔案就行,也不需要重新編譯部署。
  5. MyBatis對資料庫操作結果進行自動對映:在使用JDBC進行查詢時,返回一個結果集ResultSet,我們要從結果集中取出結果封裝為需要的型別;在Mybatis中可以設定將結果直接對映為自己需要的型別,比如:JavaBean物件、一個Map、一個List等等。
  6. 一致的編碼風格大大減少了程式碼的溝通交流成本。

三、第一個Mybatis程式

1.搭建資料庫環境

CREATE DATABASE `mybatis`;
USE `mybatis`;
CREATE TABLE `user` (
                        `id` int(20) NOT NULL,
                        `name` varchar(30) DEFAULT NULL,
                        `pwd` varchar(30) DEFAULT NULL,
                        PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'Autumn27','123456'),(2,'法外狂徒張三','333333'),(3,'西裝暴徒李四','444444')

建立好資料庫後,重新整理資料庫

2.匯入Mybatis相關jar包,推薦用Maven進行專案管理

  Maven倉庫:https://mvnrepository.com/

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.8.0-M1</version>
      <scope>test</scope>
    </dependency>

</dependencies>

  相關jar包: 

mybatis需要jar包:mybatis-3.5.7.jar(必備)

mysql驅動jar包:mysql-connector-java-8.0.25.jar(必備)

JUnit jar包:junit-jupiter-api-5.8.0-M1.jar(推薦,用於測試程式碼)

3.編寫mybatis核心配置檔案

MyBatis 的xml配置檔案(configuration XML)中包含了對 MyBatis 系統的核心設定,包含獲取資料庫連線例項的資料來源(DataSource)和決定事務作用域和控制方式的事務管理器(TransactionManager)

編寫配置檔案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>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/autumn/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

4.編寫工具類檔案MybatisUtils.java

package com.autumn.utils;

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 java.io.IOException;
import java.io.InputStream;

//工具類 sqlSessionFactory 生產 sqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static{
        try {
            //獲取SqlSessionFactory 物件
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //獲取sqlSessionFactory生產的 sqlSession物件
    //sqlSession包含了面向資料庫執行的 所有SQL語句 所需的方法
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();

    }
}
     

5.建立實體類及其對應Mapper介面

實體類User.java

package com.autumn.pojo;

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 + '\'' +
                '}';
    }
}

UserMapper.java

package com.autumn.mapper;

import com.autumn.pojo.User;

import java.util.List;

public interface UserMapper {
    //查詢所有使用者
    List<User> getUserList();

    //通過Id查詢使用者
    User getUserById(int id);

    //模糊查詢使用者
    List<User> getUserLike(String value);

    //insert使用者
    int addUser(User user);

    //update使用者
    int updateUser(User user);

    //delete使用者
    int deleteUser(int id);
}

6.編寫UserMapper.xml,xml檔案中存放對應的Sql語句

<?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.autumn.mapper.UserMapper">

    <!-- id 等價於 重寫介面的方法名 -->
    <!-- select標籤 內寫 sql語句 -->
    <!-- 查詢所有使用者 -->
    <select id="getUserList" resultType="com.autumn.pojo.User">
        select *
        from mybatis.user;
    </select>

    <!-- 通過Id查詢使用者 -->
    <select id="getUserById" parameterType="int" resultType="com.autumn.pojo.User">
        select *
        from mybatis.user where id = #{id};
    </select>

    <!-- like查詢使用者 -->
    <select id="getUserLike" resultType="com.autumn.pojo.User">
        select *
        from mybatis.user where name like #{value};
    </select>

    <!-- insert使用者 -->
    <insert id="addUser" parameterType="com.autumn.pojo.User">
        insert into mybatis.user(id, name, pwd)
        values (#{id} , #{name} , #{pwd});
    </insert>

    <!-- update使用者   -->
    <update id="updateUser" parameterType="com.autumn.pojo.User">
        update mybatis.user
            set name = #{name} , pwd = #{pwd}
        where id = #{id};
    </update>

    <!-- delete使用者   -->
    <delete id="deleteUser" parameterType="int">
        delete
        from mybatis.user
                 where id = #{id};
    </delete>
</mapper>

其中<mapper namespace="com.autumn.mapper.UserMapper"> 用來繫結xml對應的Mapper介面

有關select、insert, update 和 delete的相關語句在Mybatis中文文件下的XML 對映器檔案有說明。

7.編寫測試檔案UserMapperTest.java

查詢所有使用者

@Test
    public void testGetUserList(){

        //獲取sqlSession物件
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try{
            //執行
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.getUserList();

            for (User user : userList) {
                System.out.println(user);
            }

        }finally {
            //關閉sqlSession
            sqlSession.close();
        }
    }

通過Id查詢使用者

@Test
    public void testGetUserById(){
        //獲取sqlSession物件
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try{
            //執行
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User userById = userMapper.getUserById(1);
            System.out.println(userById);
        }finally {
            //關閉sqlSession
            sqlSession.close();
        }
    }

模糊查詢使用者

@Test
    public void testGetUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);

            List<User> userList = mapper.getUserLike("%張%");
            for (User user : userList) {
                System.out.println(user);
            }
        }finally {
            sqlSession.close();
        }
    }

新增使用者資訊

@Test
    public void testAddUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);

            mapper.addUser(new User(6,"民風淳樸洛聖都","6666666"));
        }finally {
            sqlSession.commit();
            sqlSession.close();
        }
    }

修改使用者資訊

@Test
    public void testUpdateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);

            mapper.updateUser(new User(6, "開局核平冬木市" , "10086"));
        }finally {
            sqlSession.commit();
            sqlSession.close();
        }
    }

刪除使用者資訊

@Test
    public void testDeleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.deleteUser(6);
        }finally {
            sqlSession.commit();
            sqlSession.close();
        }
    }

注意 Sql語句中,增刪改操作後需要提交事務,即sqlSession.commit();,否則資料庫不會改變