1. 程式人生 > 程式設計 >基於Mybatis實現CRUD操作過程解析(xml方式)

基於Mybatis實現CRUD操作過程解析(xml方式)

1、環境搭建

1.1 表結構

create table user (
 id int primary key auto_increment,username varchar(20) not null,birthday date,sex char(1) default '男',address varchar(50)
);

insert into user values (null,'孫悟空','1980-10-24','男','花果山水簾洞');
insert into user values (null,'白骨精','1992-11-12','女','白虎嶺白骨洞');
insert into user values (null,'豬八戒','1983-05-20','福臨山雲棧洞');
insert into user values (null,'蜘蛛精','1995-03-22','盤絲洞');

1.2 建立專案

匯入如下jar

  • mybatis框架包
  • 資料庫驅動包
  • log4j日誌包
  • junit單元測試包

1.3 準備配置檔案

在src下準備配置檔案: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>
  <!--配置資料庫連線引數-->
  <environments default="mybatis">
    <environment id="mybatis">
      <!--事務管理器-->
      <transactionManager type="JDBC"></transactionManager>
      <!--配置資料來源-->
      <dataSource type="pooled">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///test"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
</configuration>

在 src 下準備配置檔案:log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG,stdout

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2-增刪改查原始碼


1.1 執行結果

1.2 User類程式碼

import java.sql.Date;

/**
 使用者實體類物件 */
public class User {

  private Integer id;  
  private String username;
  private Date birthday;
  private String sex;
  private String address;

  public User() {
  }

  public User(Integer id,String username,Date birthday,String sex,String address) {
    this.id = id;
    this.username = username;
    this.birthday = birthday;
    this.sex = sex;
    this.address = address;
  }

  public Integer getId() {
    return id;
  }

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

  public String getUsername() {
    return username;
  }

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

  public Date getBirthday() {
    return birthday;
  }

  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  @Override
  public String toString() {
    return "User{" +
        "id=" + id +
        ",username='" + username + '\'' +
        ",birthday=" + birthday +
        ",sex='" + sex + '\'' +
        ",address='" + address + '\'' +
        '}';
  }
}

1.3 UserMapper介面程式碼

package com.vg.dao;

import com.vg.entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
/**
 * 資料訪問層介面:對使用者進行增刪改查操作
 */
public interface UserMapper {
	/**
	 * 新增使用者
	 */
	int addUser(User user);
	/**
	 * 根據id刪除使用者
	 */
	void deleteUser(Integer id);
	/**
	 * 通過id修改使用者資訊
	 */
	/**
	 * 修改使用者資訊
	 */
	void updateUser(User user);
	/**
	 * 查詢所有使用者
	 */
	List<User> findAllUsers();
	/**
	 * 根據id查詢使用者
	 */
	User findUserById(int id);

	/**
	 * 根據使用者名稱模糊查詢使用者
	 */
	List<User> findUsersByName(String username);
	/**
	 * 根據姓名和性別查詢使用者資料(姓名使用模糊查詢)
	 */

	/**
	 * 根據使用者名稱稱模糊查詢使用者
	 */
}
}

1.4 UserMapper.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屬性的作用:關聯介面,需要配置對應介面的類全名字串
-->
<mapper namespace="com.vg.dao.UserMapper">
  <!-- 完成介面對映配置檔案UserMapper.xml的編寫:這個對映檔案就相當於UserMapper介面實現類配置 -->

  <!--select標籤的作用:用來配置查詢要執行的SQL語句
    id屬性:關聯介面中的方法名
    resultType屬性:設定方法返回的資料型別,如果是集合則配置集合元素的型別
  -->
  <select id="findAllUsers" resultType="User">
    select * from user
  </select>

  <select id="findUserById" parameterType="int" resultType="User">
    select * from user where id = #{id};
  </select>

  <select id="findUsersByName" parameterType="string" resultType="User">
    select *from user where username like #{username}
  </select>

  <insert id="addUser" parameterType="user" >
    insert into user values(null,#{username},#{birthday},#{sex},#{address});
  </insert>

  <update id="updateUser" parameterType="user">
    update user set username = #{username},birthday = #{birthday},sex = #{sex},address = #{address}
  where id = #{id}
  </update>

  <delete id="deleteUser" parameterType="integer">
    delete from user where id = #{id}
  </delete>
</mapper>

1.5 在主配置檔案中載入介面對映檔案

<mappers>
   <!--mapper標籤:一個該標籤就配置一個介面對映檔案
      resource屬性:配置對映檔案的路徑,路徑分隔符使用 / : com/vg/dao/UserMapper.xml
      url:用於配置網際網路上的對映檔案的路徑,比如:http://www.baidu.com/xxx.xml
    -->
    <!--<mapper resource="com/vg/dao/UserMapper.xml"></mapper>-->
    <package name="com.vg.dao"/>
</mappers>

1.6 測試類程式碼

package com.vg.test;

import com.vg.dao.UserMapper;
import com.vg.entity.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.BeforeClass;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Date;
import java.util.List;

/**
 * 測試類
 */
public class TestUserMapper {
	private static SqlSessionFactory sqlSessionFactory =null;
	private SqlSession sqlSession =null;
	private UserMapper userMapper =null;

	// 該方法在所有測試方法執行之前執行1次
	@BeforeClass
	public static void init() throws Exception {
		// 1. 通過Resources類,載入sqlMapConfig.xml,得到檔案輸入流對
		InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
		// 2. 例項化會話工廠建立類SqlSessionFactoryBuilder物件
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		// 3. 根據位元組輸入流獲取SqlSessionFactory物件
		sqlSessionFactory = builder.build(in);
	}
	// 該方法會在每個測試方法執行之前執行1次
	@Before
	public void before(){
		// 4. 獲取SqlSession物件,等價連線物件
		// true:事務自動提交,false:不自動提交,預設值
		sqlSession = sqlSessionFactory.openSession();
		// 5. 建立介面 實現類物件
		userMapper = sqlSession.getMapper(UserMapper.class);

	}
	/**
	 * 測試方法:通過使用者名稱模糊查詢使用者
	 */
	@Test
	public void testAddUser() throws Exception{
		// 1. 獲得介面代理物件
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		// 2. 建立User物件
		User u = new User();
		u.setUsername("如來佛祖111");
		u.setBirthday(Date.valueOf("1980-01-20"));
		u.setAddress("西天靈山");
		u.setSex("男");
		// 3. 儲存使用者資訊
		int row = userMapper.addUser(u);
		System.out.println("row = " + row);
		// 4. 手動提交事務
		sqlSession.commit();
	}
	/**
	 * 測試方法:通過使用者名稱模糊查詢使用者
	 */
	@Test
	public void testFindUserByName() throws Exception{
		List<User> userList = userMapper.findUsersByName("%精%");
		for (User user : userList) {
			System.out.println(user);
		}
	}

	/**
	 * 測試方法:查詢所有使用者
	 */
	@Test
	public void testFindAllUsers() throws Exception{
		List<User> userList = userMapper.findAllUsers();
		for (User user : userList) {
			System.out.println(user);
		}
	}

	/**
	 * 根據id查詢使用者
	 * @throws Exception
	 */
	@Test
	public void testFindUserById()throws Exception{
		// 6. 呼叫介面的方法根據id查詢使用者
		User user = userMapper.findUserById(1);
		System.out.println("user = " + user);

	}
	@Test
	public void testUpdateUser()throws Exception{
		// 建立使用者物件
		User user = new User(
				6,"牛魔王",Date.valueOf("1998-02-20"),"妖","牛魔洞");
		// 更新使用者
		userMapper.updateUser(user);

		// 提交事務
		sqlSession.commit();
	}
	@Test
	public void testDeleteUser()throws Exception{
		// 1. 獲得介面代理物件
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		// 2. 根據id刪除使用者
		userMapper.deleteUser(6);
		// 3. 提交事務
		sqlSession.commit();
	}
	@After
	public void after() {
		// 7. 關閉會話,釋放資源。

		sqlSession.close();
	}
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。