当前位置:   article > 正文

Mybatis配置详解

mybatis配置

1、mybatis的作用

1、再MVC三层模式中mybatis作用于DAO层

2、进行与数据库连接。

3、事务管理:支持数据操作进行手动或自动事务管理,确保数据
提交的一致性和可靠性。

4、通过SQL语句执行对数据库的CRUD操作,提供数据持久化。

2、封装JDBC

MyBatis相较于JDBC简化了以下开发:

  1. 数据库连接管理:使用JDBC进行数据库操作时,需要手动获取数据库连接、释放数据库连接等操作,在高并发的情况下还需要面对连接池的问题。而在MyBatis中,数据源(DataSource)等连接管理工作都被封装好了,用户只需要关注执行SQL语句即可。

  2. 预处理和执行SQL语句:在JDBC中,需要通过Statement对象或PreparedStatement对象来进行预处理和执行SQL语句。MyBatis将执行SQL语句的相关操作都封装成接口方法,用户通过Mapper文件或注解来配置对应的SQL语句,消除了样板式代码,使得代码更加简洁易懂。

  3. 处理结果集:在JDBC中,需要使用ResultSet对象来处理查询结果集,通过访问ResultSet对象的列名或是序号来获取结果。而在MyBatis中,支持将查询结果自动封装为Java属性对象列表或者Map映射,可以避免重复的属性名称声明以及类型不匹配的异常。

  4. 事务管理:JDBC需要通过Spring框架或编写大量的代码来进行事务管理。而MyBatis提供了默认的SqlSession事务模式、支持Spring事务以及托管给全局事务管理器三种事务管理方式,并且对事务Rollback、Commit进行了封装,简化了事务处理流程。

MyBatis采用了不同的架构和设计理念,封装了JDBC底层操作,并提供了更方便、高效的CRUD编程接口以及自动参数映射和结果集处理,大大简化了数据库开发。

3、mybatis基于XML配置

1、创建Maven项目
2、在maven项目中下载mybatis和mysql的依赖

pom.xml
  • 1
 <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!-- MySQL Connector -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3、创建mybatis核心配置文件,在src\main\resources下创建mybatis-config.xml文件

src\main\resources\mybatis-config.xml
  • 1
<?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"/>
            <!-- 配置数据源,注意这里要配置自己的数据库驱动和连接参数 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器 -->
    <mappers>
        <!-- 引入映射文件,如果有多个文件,则在此处添加 -->
        <mapper resource="UserMapper.xml"/>
    </mappers>

</configuration>



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

注意在这些代码中修改自己的mysql配置


      <transactionManager type="JDBC"/>
      <!-- 配置数据源,注意这里要配置自己的数据库驱动和连接参数 -->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/exampleDB?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4、创建UserMapper.xml文件

src\main\resources\UserMapper.xml
  • 1
<?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="UserMapper">

    <!-- 定义查询所有用户的 SQL 语句-->
    <select id="findAllUsers" resultType="src.main.com.example.DAO.User">
        SELECT * FROM tb_user;
    </select>

    <!-- 定义根据用户 ID 查询用户的 SQL 语句-->
    <select id="findUserById" parameterType="int" resultType="src.main.com.example.DAO.User">
        SELECT * FROM tb_user WHERE id = #{id};
    </select>

    <!-- 定义新增用户的 SQL 语句-->
    <insert id="addUser" parameterType="src.main.com.example.DAO.User">
        INSERT INTO tb_user(username, password) VALUES (#{username}, #{password});
    </insert>

    <!-- 定义根据用户 ID 删除用户的 SQL 语句-->
    <delete id="deleteUserById" parameterType="int">
        DELETE FROM tb_user WHERE id = #{id};
    </delete>

    <!-- 定义根据用户 ID 更新用户密码的 SQL 语句-->
    <update id="updatePasswordById" parameterType="map">
        UPDATE tb_user SET password = #{newPassword} WHERE id = #{userId};
    </update>

</mapper>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

5、创建数据库的实体类,实体类要根据我们创建的mysql数据库相对应
实体类中的每一个属性,都有一个mysql属性与之相对应
在这里插入图片描述

src\main\java\com\example\pojo\User.java

  • 1
  • 2
package src.main.com.example.pojo;

public class User {
    private Integer id;
    private String username;
    private int password;
    private String gender;
    private String addr;


    public User() {
    }

    public User(int id, String username, int password, String gender, String addr) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.addr = addr;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getPassword() {
        return password;
    }

    public void setPassword(int password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password=" + password +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

6、创建测试类

src\main\java\com\example\text\Text.java
  • 1
package src.main.com.example.text;


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;
import java.util.List;

public class Text{
    public static void main(String[] args) throws IOException {
        // 加载核心配置文件路径
        String resource = "mybatis-config.xml";
        //通过SqlesSsionFactor实例化SqlSessionFactor
        //然后通过SqlSessionFactor的openSqlSession()方法获取SqlSession对象
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //使用SqlSession来执行SQL语句
        List<User> user = sqlSession.selectList("UserMapper.findAllUsers");
        System.out.println(user);
        sqlSession.close();


    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

4、Mapper代理开发

mapper代理开发,让我们在调用sql语句时会更加方便
我们在原来的配置上进行如下修改

1、创建一个与映射文件(UserMapper.xml)同名的接口文件,

2、接口文件中定义方法,方法名与映射文件中的id一致,返回
类型也要和resultType一致

3、注意返回是一个对象还是多个对象,多个对象要用list集合接收

下面我们创建与映射文件同名的接口,并且定义方法
src/main/com/example/mapper/UserMapper
  • 1
  • 2
ackage src.main.com.example.mapper;

public interface UserMapper {

   list<User> findAllUsers();

   User findUserById();

    User  addUser();

   User deleteUserById();

   User updatePasswordById();


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2、第二步要将我们的映射文件(UserMapper.xml)与接口文件(UserMapper)放在同一个包中

1、方法一:直接将映射文件拖入mapper包下
2、方法二:为了统一管理,我们直接在reserces下创建一个
com/example/mapper,再将映射文件拖入该文件下,可以达到同样的效果

  • 1
  • 2
  • 3
  • 4

3、修改映射文件的namespace,以前这个值是可以谁便取得,但现在要将它改为接口文件的路径

在UserMapper.xml中修改namespace
  • 1
<?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="src/main/com/example/mapper">

    <!-- 定义查询所有用户的 SQL 语句-->
    <select id="findAllUsers" resultType="src.main.com.example.DAO.User">
        SELECT * FROM tb_user;
    </select>

    <!-- 定义根据用户 ID 查询用户的 SQL 语句-->
    <select id="findUserById" parameterType="int" resultType="src.main.com.example.DAO.User">
        SELECT * FROM tb_user WHERE id = #{id};
    </select>

    <!-- 定义新增用户的 SQL 语句-->
    <insert id="addUser" parameterType="src.main.com.example.DAO.User">
        INSERT INTO tb_user(username, password) VALUES (#{username}, #{password});
    </insert>

    <!-- 定义根据用户 ID 删除用户的 SQL 语句-->
    <delete id="deleteUserById" parameterType="int">
        DELETE FROM tb_user WHERE id = #{id};
    </delete>

    <!-- 定义根据用户 ID 更新用户密码的 SQL 语句-->
    <update id="updatePasswordById" parameterType="map">
        UPDATE tb_user SET password = #{newPassword} WHERE id = #{userId};
    </update>

</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

4、由于映射文路径置改了,我们的配置文件要引入映射文件,
也要修改为相同路径

修改mybatis-config.xml中的<mapper resorces="">
  • 1
<?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"/>
            <!-- 配置数据源,注意这里要配置自己的数据库驱动和连接参数 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器 -->
    <mappers>
        <!-- 引入映射文件,如果有多个文件,则在此处添加 -->
        <mapper resource="src/main/com/example/mapper/UserMapper.xml"/>
    </mappers>

</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

5、测试时我们不在使用sqlSessioj的方法,而是使用sqlSession.getMapper()
获取UserMapper接口代理对象,在调用接口中的方法

src/main/java/com/example/text/Text.java
  • 1
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Text{
    public static void main(String[] args) throws IOException {
        // 加载核心配置文件路径
        String resource = "mybatis-config.xml";
        //通过SqlesSsionFactor实例化SqlSessionFactor
        //然后通过SqlSessionFactor的openSqlSession()方法获取SqlSession对象
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //使用SqlSession.getMapper()来获取UserMapper接口对象
       UserMapper mapper=sqlSession.getMapper(UserMapper.class);
       //调用接口方法
       List<User> user= mapper.findAllUsers();
       
       
        System.out.println(user);
        sqlSession.close();


    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/357050
推荐阅读
相关标签
  

闽ICP备14008679号