1. 程式人生 > >MyBatis對資料庫的增刪改查操作,簡單示例

MyBatis對資料庫的增刪改查操作,簡單示例

之前一直實用Hibernate進行開發,最近公司在使用Mybatis,根據網上的示例,做了一個簡單的Demo,以便日後複習

使用XMl方式對映sql語句

總體結構如下圖



首先是建立一個工程,然後匯入兩個jar包,然後編寫mybatis的jdbc配置檔案Configuration.xml

Configuration.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>
	<!-- 為sql對映檔案中的型別指定別名,如果不加alias,則整個包下的別名都是類名 -->
	<typeAliases>
		<typeAlias type="com.demo.bean.User" alias="User"/>
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
				<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
				<property name="username" value="scott" />
				<property name="password" value="scott" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="com/demo/bean/User.xml" />
	</mappers>
</configuration>

User類,文章中省略getter和setter方法

package com.demo.bean;

import java.util.Date;

public class User {
	private String id;
	private String name;
	private String password;
	private Date birthday;
	private String address;

}

然後是建立sql對映檔案User.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.demo.bean.User">
	<!-- 查詢所有使用者, resultType代表返回型別(一般寫全限定類名,也可以在mybatis配置檔案中指定別名),parameterType代表引數型別 -->
	<select id="selectAllUsers" resultType="User">
		select * from valid_user
	</select>

	<!-- 根據id查詢使用者 -->
	<select id="findUserById" parameterType="int" resultType="User">
		select * from valid_user where id=#{id}
	</select>

	<!-- 根據id更新使用者 -->
	<update id="updateUserById" parameterType="User">
		update valid_user set name=#{name},address=#{address} where id=#{id}
	</update>

	<!-- 新增新使用者 -->
	<insert id="addUser" parameterType="User">
		insert into valid_user(id,name,password,address) values(seq_valid_user.nextval,#{name},#{password},#{address})
	</insert>

	<!-- 根據id刪除使用者 -->
	<delete id="deleteUserById" parameterType="int">
		delete from valid_user where id=#{id}
	</delete>
</mapper>
然後就是編輯測試類
package com.demo.Test;

import java.io.Reader;
import java.util.List;

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 com.demo.bean.User;

public class TestConnection {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;

	static {
		try {
			reader = Resources.getResourceAsReader("Configuration.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 查詢所有User物件
	 * @param id
	 */
	public static void selectAllUsers() {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			List<User> listUsers = session.selectList("com.demo.bean.User.selectAllUsers");
			for (User user:listUsers) {
				System.out.println("ID:" + user.getId() + ",姓名:" + user.getName() + ",密碼:" + user.getPassword() + ",住址:" + user.getAddress());
			}
		} finally {
			session.close();
		}
	}
	
	/**
	 * 根據id查詢User物件
	 * @param id
	 */
	public static void findUserById(String id) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			User user = (User) session.selectOne("com.demo.bean.User.findUserById", id);
			System.out.println("ID:" + user.getId() + ",姓名:" + user.getName() + ",密碼:" + user.getPassword() + ",住址:" + user.getAddress());
		} finally {
			session.close();
		}
	}

	/**
	 * 根據id更新User物件
	 * @param id
	 */
	public static void updateUserById(String id,User user) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.update("com.demo.bean.User.updateUserById",user);
			session.commit(); 
		} finally {
			session.close();
		}
	}
	
	/**
	 * 新增一條User物件
	 */
	public static void addUser(User user) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.insert("com.demo.bean.User.addUser",user);
			session.commit(); 
		} finally {
			session.close();
		}
	}

	/**
	 * 刪除一條User物件
	 */
	public static void deleteUserById(String id) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			session.delete("com.demo.bean.User.deleteUserById",id);
			session.commit(); 
		} finally {
			session.close();
		}
	}
	
	public static void main(String[] args) {
	
		selectAllUsers();
		
//		findUserById("1"); // 根據id查詢User物件
		
//		User user=new User();
//		user.setId("2");
//		user.setName("Zams");
//		user.setAddress("河南、鄭州");
//		updateUserById("2",user);	// 根據id更新User物件
		
//		User add_user=new User();
//		add_user.setName("古力娜扎");
//		add_user.setPassword("3412312");
//		add_user.setAddress("河南、鄭州、開封");
//		addUser(add_user);	// 根據id更新User物件
		
//		deleteUserById("4");
	}
}

執行效果如下;
ID:1,姓名:X-rapido,密碼:rapido,住址:北京朝陽、海淀
ID:2,姓名:Zams,密碼:gril,住址:河南、鄭州
ID:3,姓名:蓋爾加朵,密碼:3412312,住址:河南、鄭州
ID:5,姓名:古力娜扎,密碼:3412312,住址:河南、鄭州、開封

其他內容:

  1. SqlSession session = sqlSessionFactory.openSession();   可以設定事務的自動提交。
  2. 配置檔案中的jdbc聯接可以寫在properties檔案中。
  3. Mybatis的sql對映可以使用xml的形式,如上面內容,也可以使用java註解方式。
  4. 對映檔案中可以配置多表連線方式。參考其他文件,未做示例
  5. 另外mybatis可以配置動態sql語句形式、呼叫儲存過程、為sql語句欄位指定別名(一般資料庫欄位與java類欄位不同時需要指定)
  6. Mybatis的sql列印並不像Hibernate那樣有設定sql列印的引數,它需要與log4j.jar包進行配合才能列印

使用Java註解方式對映sql語句

使用註解方式的示例結構如下

總體結構內容不變,主要修改java註解配置類(Service類)、配置檔案、測試類3個地方即可

UserMapper類

package com.demo.bean;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

/**
 * 使用註解對映,不需要寫實現類,但要在Mybatis配置檔案中將此類進行註冊
 */
public interface UserMapper {
	
	@Select("select * from valid_user")
	List<User> selectAllUsers(); 
	
	@Select("select * from valid_user where id=#{id}")
	User findUserById(String id);
	
	@Update("update valid_user set name=#{name},address=#{address} where id=#{id}")
	int updateUserById(User user);
	
	@Insert("insert into valid_user(id,name,password,address) values(seq_valid_user.nextval,#{name},#{password},#{address})")
	int addUser(User user);
	
	@Delete("delete from valid_user where id=#{id}")
	int deleteUserById(String id);
}
Mybatis配置檔案中 configuration.xml修改 mapper內容
	<mappers>
		<mapper class="com.demo.bean.UserMapper" />
	</mappers>
將測試類中的如查詢所有程式碼的com.demo.bean.User.selectAllUsers修改為com.demo.bean.UserMapper.selectAllUsers即可。

測試效果同xml的配置效果一樣。

在實際應用中,有時候需要對Mybatis進行多引數傳值,這時候可以使用Map物件進行查詢

比如在登入時,傳入賬戶名和密碼,在xml在將 parameterType設定為map引數型別, parameterType="map"

Map<String, String> map = new HashMap<String, String>();
map.put("name", userName);
map.put("password", password);
return sqlSession.selectOne("com.demo.bean.User.loginUser", map);

設定log4j,列印SQL執行語句

log4j的配置檔案可以是xml形式,也可以是.properties檔案形式

log4j.properties(方式一)

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
		</layout>
	</appender>
	<logger name="java.sql">
		<level value="debug" />
	</logger>
	<logger name="org.apache.ibatis">
		<level value="debug" />
	</logger>
	<root>
		<level value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>