SpringBoot整合Mybatis之xml


SpringBoot整合Mybatis

mybatis

ORM框架.幾個重要的概念:

  • Mapper配置 : 可以使用基於XML的Mapper配置文件來實現,也可以使用基於Java注解的Mybatis注解來實現,甚至可以直接使用Mybatis提供的API實現.
  • Mapper接口 : 自行定義的一個數據操作接口,也就是通常說的DAO接口.早期接口需要自己自定義實現,現在Mybatis會自動為Mpper接口創建動態代理對象. Mapper接口的方法通常與Mapper配置文件中的select,insert,update,delete等XML結點存在--對應關系
  • Executor : Mybatis中所有的Mapper語句都是通過Executor進行的,Executor是Mybatis的一個核心接口.
  • SqlSession : 是Mybatis的關鍵對象,是執行持久化操作的獨享.SqlSession對象完全包含以數據庫為背景的所有執行SQL操作的方法,它的底層封裝了JDBC連接,可以用SqlSession案例來直接執行被映射的SQL語句.
  • SqlSessionFactory : 是Mybatis的關鍵對象,是單個數據庫映射關系經過編譯后的內存鏡像. SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象獲得,而SqlSessionFactoryBuilder則可以從XML配置文件和一個預先定制的Configuration的實例構建出來.

mybatis

工作流程 :

  • 首先加載 Mapper 配置的 SQL 映射文件,或者是注解的相關 SQL 內容。
  • 創建會話工廠,MyBatis 通過讀取配置文件的信息來構造出會話工廠(SqlSessionFactory)。
  • 創建會話。根據會話工廠,MyBatis 就可以通過它來創建會話對象(SqlSession),會話對象是一個接口,該接口中包含了對數據庫操作的增、刪、改、查方法。
  • 創建執行器。因為會話對象本身不能直接操作數據庫,所以它使用了一個叫做數據庫執行器(Executor)的接口來幫它執行操作。
  • 封裝 SQL 對象。在這一步,執行器將待處理的 SQL 信息封裝到一個對象中(MappedStatement),該對象包括 SQL 語句、輸入參數映射信息(Java 簡單類型、HashMap 或 POJO)和輸出結果映射信息(Java 簡單類型、HashMap 或 POJO)。
  • 操作數據庫。擁有了執行器和 SQL 信息封裝對象就使用它們訪問數據庫了,最后再返回操作結果,結束流程。

加載接口,SqlSessionFactoryBuilder構建SqlSessionFactory,SqlSessionFactory創建愛你Sqsession,SqlSession創建Executor,Executor封裝SQL對象,最后再操作數據庫,返回操作結果,結束.

SpringBoot集成Mybatis
  1. 引入依賴
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
  1. 添加配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://39.105.167.131:3306/smile_boot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: Nrblwbb7$

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: con.mybatis.springboot_mybatis.model
  • mybatis.config-location,配置 mybatis-config.xml 路徑,mybatis-config.xml 中配置 MyBatis 基礎屬性;
  • mybatis.mapper-locations,配置 Mapper 對應的 XML 文件路徑;
  • mybatis.type-aliases-package,配置項目中實體類包路徑;
  • spring.datasource.*,數據源配置。

Spring Boot 啟動時數據源會自動注入到 SqlSessionFactory 中,使用 SqlSessionFactory 構建 SqlSession,再自動注入到 Mapper 中,最后我們直接使用 Mapper 即可。

  1. 啟動類添加注解
@SpringBootApplication
@MapperScan("com.mybatis.springboot_mybatis.mapper")
public class SpringbootMybatisApplication {
}
  1. mybatis-config.xml的配置

mybatis-config.xml 主要配置常用的 typeAliases,設置類型別名,為 Java 類型設置一個短的名字。它只和 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>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration>
  1. 編寫代碼進行測試

model類(也就是實體類,對性別進行了枚舉)


public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	private Long id;
	private String userName;
	private String passWord;
	private UserSexEnum userSex;
	private String nickName;

	public User() {
		super();
	}

	public User(String userName, String passWord, UserSexEnum userSex) {
		super();
		this.passWord = passWord;
		this.userName = userName;
		this.userSex = userSex;
	}

	public Long getId() {
		return id;
	}

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

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassWord() {
		return passWord;
	}

	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}

	public UserSexEnum getUserSex() {
		return userSex;
	}

	public void setUserSex(UserSexEnum userSex) {
		this.userSex = userSex;
	}

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}

	@Override
	public String toString() {
		return "UserEntity{" +
				"id=" + id +
				", userName='" + userName + '\'' +
				", passWord='" + passWord + '\'' +
				", userSex=" + userSex +
				", nickName='" + nickName + '\'' +
				'}';
	}
}

枚舉類:

public enum UserSexEnum {
	MAN, WOMAN
}

操作類(也就是實體的簡化類還有其他的分頁實體類,也就是平常所說的vm):

public class UserParam extends PageParam{

    private String userName;

    private String userSex;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }
}


public class PageParam {
    private int beginLine;       //起始行
    private Integer pageSize = 3;
    private Integer currentPage=0; 	   // 當前頁

    public int getBeginLine() {
        return pageSize*currentPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    @Override
    public String toString() {
        return "PageParam{" +
                "beginLine=" + beginLine +
                ", pageSize=" + pageSize +
                ", currentPage=" + currentPage +
                '}';
    }
}

0代表第一頁,1代表第2頁

mapper類 :

public interface UserMapper {

	List<User> getAll();

	List<User> getList(UserParam userParam);

	int getCount(UserParam userParam);

	User getOne(Long id);

	void insert(User user);

	int update(User user);

	int delete(Long id);

}

mapper的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.mybatis.springboot_mybatis.mapper.UserMapper" >

    <resultMap id="BaseResultMap" type="com.mybatis.springboot_mybatis.model.User" >
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="userName" property="userName" jdbcType="VARCHAR" />
        <result column="passWord" property="passWord" jdbcType="VARCHAR" />
        <result column="user_sex" property="userSex" javaType="com.mybatis.springboot_mybatis.enums.UserSexEnum"/>
        <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
    </resultMap>
    
    <sql id="Base_Column_List" >
        id, userName, passWord, user_sex, nick_name
    </sql>

    <sql id="Base_Where_List">
        <if test="userName != null  and userName != ''">
            and userName = #{userName}
        </if>
        <if test="userSex != null and userSex != ''">
            and user_sex = #{userSex}
        </if>
    </sql>

    <select id="getAll" resultMap="BaseResultMap"  >
       SELECT 
       <include refid="Base_Column_List" />
	   FROM users
    </select>

    <select id="getList" resultMap="BaseResultMap" parameterType="com.mybatis.springboot_mybatis.param.UserParam">
        select
        <include refid="Base_Column_List" />
        from users
        where 1=1
        <include refid="Base_Where_List" />
        order by id desc
        limit #{beginLine} , #{pageSize}
    </select>

    <select id="getCount" resultType="Integer" parameterType="com.mybatis.springboot_mybatis.param.UserParam">
        select
        count(1)
        from users
        where 1=1
        <include refid="Base_Where_List" />
    </select>

    <select id="getOne" parameterType="Long" resultMap="BaseResultMap" >
        SELECT 
       <include refid="Base_Column_List" />
	   FROM users
	   WHERE id = #{id}
    </select>

    <insert id="insert" parameterType="com.mybatis.springboot_mybatis.model.User" >
       INSERT INTO 
       		users
       		(userName,passWord,user_sex) 
       	VALUES
       		(#{userName}, #{passWord}, #{userSex})
    </insert>
    
    <update id="update" parameterType="com.mybatis.springboot_mybatis.model.User" >
       UPDATE 
       		users 
       SET 
       	<if test="userName != null">userName = #{userName},</if>
       	<if test="passWord != null">passWord = #{passWord},</if>
       	nick_name = #{nickName}
       WHERE 
       		id = #{id}
    </update>
    
    <delete id="delete" parameterType="Long" >
       DELETE FROM
       		 users 
       WHERE 
       		 id =#{id}
    </delete>

</mapper>

注意修改自己的包名和接口路徑等等,這里不考慮多數據源,多數據源看pdf

測試類

@SpringBootTest
@RunWith(SpringRunner.class)
public class MybatisXmlTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void testInsert()  {
        userMapper.insert(new User("aa", "a123456", UserSexEnum.MAN));
        userMapper.insert(new User("bb", "b123456", UserSexEnum.WOMAN));
        userMapper.insert(new User("cc", "b123456", UserSexEnum.WOMAN));

        Assert.assertEquals(3, userMapper.getAll().size());
    }

    @Test
    public void testUpdate() {
        long id=1l;
        User user = userMapper.getOne(id);
        if(user!=null){
            System.out.println(user.toString());
            user.setNickName("wzlove");
            userMapper.update(user);
            Assert.assertTrue(("wzlove".equals(userMapper.getOne(id).getNickName())));
        }else {
            System.out.println("not find user id="+id);
        }
    }


    @Test
    public void testDelete() {
        int count=userMapper.delete(3l);
        if(count>0){
            System.out.println("delete is sucess");
        }else {
            System.out.println("delete if failed");
        }
    }

    @Test
    public void findAll(){
        UserParam userParam = new UserParam();
        userParam.setCurrentPage(0);
        userParam.setPageSize(1);
        List<User> list = userMapper.getList(userParam);
        System.out.println(list.get(0));
        Assert.assertEquals(1,list.size());
    }

}

源碼請查看 : https://github.com/MissWangLove/SpringBoot


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM