MyBatis——增刪改查(CRUD)

1 實驗環境

(1)導入 JAR 包

其中,前2個 jar 包下載地址見 → log4j-1.2.17.jar、 mybatis-3.4.1.jar,將 jar 包放入 lib 目錄下,並選中所有 jar 包,右鍵,選擇【Add to Build Path】。

(2)工作目錄

(3)配置文件

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">
		<param name="Encoding" value="UTF-8" />
		<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="info" />
	</logger>
 
	<root>
		<priority value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

注意:log4j.xml文件名不能隨意更改。  

mybatis-config.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>
	<!-- 設置或引入資源文件 -->
	<properties resource="jdbc.properties"></properties>
	
	<!-- 設置連接數據庫的環境,default用於設置默認使用的數據庫環境 -->
	<environments default="mysql">
		<!-- 設置某個具體的數據庫環境 -->
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 引入映射文件 -->
	<mappers>
		<mapper resource="StudentMapper.xml"/>
	</mappers>
</configuration>

注意:mybatis-config.xml 爲核心配置文件,其內配置了連接數據庫的環境,並加載一些映射文件。 

jdbc.properties

# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=0.

注意:characterEncoding 用於設置編碼格式,避免插入和更新數據有中文時,數據庫裏會顯示“?”

2 案例分析

首先在 MySQL 中創建數據庫:users,再在此數據庫中創建表:students,包含sid(int)、sname(varchar) 2個字段,其中,sid 設置了自增,students 表中數據如下:

 Student.java

package com.bean;

public class Student {
	private Integer sid;
	private String sname;
	
	public Student() {}
	
	public Student(Integer sid, String sname) {
		this.sid = sid;
		this.sname = sname;
	}

	public Integer getId() {
		return sid;
	}
	
	public void setId(Integer sid) {
		this.sid = sid;
	}
	
	public String getName() {
		return sname;
	}
	
	public void setName(String sname) {
		this.sname = sname;
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}
}

注意:儘量保持 Student 類中屬性名與數據庫中 students 表格的屬性名同名,如果不同名,在查詢時需要使用別名,使得別名與 Student 類中對應屬性名同名。 

StudentMapper.java

package com.mapper;

import java.util.List;
import com.bean.Student;

public interface StudentMapper {
	public Student getStudentById(Integer sid);
	
	public List<Student> getStudents();
	
	public void addStudent(Student student);
	
	public void updateStudent(Student student);
	
	public void deleteStudent(Integer sid);
}

注意:增刪改操作也可以設置返回值,但只能爲整型或布爾型。爲整型時,表示該操作影響數據庫中記錄的行數;爲布爾型時,表示該操作是否執行成功。

StudentMapper.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.mapper.StudentMapper">
	<!-- public Student getStudentById(Integer sid); -->
	<select id="getStudentById" resultType="com.bean.Student">
		select sid,sname from students where sid = #{id}
	</select>
	
	<!-- public List<Student> getStudents(); -->
	<select id="getStudents" resultType="com.bean.Student">
		select sid,sname from students
	</select>
	
	<!-- public void addStudent(Student student); -->
	<insert id="addStudent">
		insert into students values(null,#{sname})
	</insert>
	
	<!-- public void updateStudent(Student student); -->
	<update id="updateStudent">
		update students set sname=#{sname} where sid=#{sid}
	</update>
	
	<!-- public void deleteStudent(Integer sid); -->
	<delete id="deleteStudent">
		delete from students where sid=#{sid}
	</delete>
</mapper>

注意:namespace 需要指向 StudentMapper.java;<select>、<insert>、<update>、<delete> 標籤中 id 值需要與 StudentMapper.java 中相應方法名同名,resultType 爲該方法返回值的數據類型。 

Test.java

package com.test;

import java.io.IOException;
import java.io.InputStream;
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.bean.Student;
import com.mapper.StudentMapper;

public class Test {
	
	public static void main(String[] args) throws IOException {
		InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
		SqlSession sqlSession=sqlSessionFactory.openSession();
		//getMapper:會通過動態代理動態生成StudentMapper的代理實現類
		StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
		
		Student student=mapper.getStudentById(1001); //查詢一條記錄
		System.out.println(student);
		
		List<Student> students=mapper.getStudents(); //查詢所有記錄
		System.out.println(students);
		
		mapper.addStudent(new Student(null,"王五")); //插入一條記錄
		
		mapper.updateStudent(new Student(1002,"小明")); //修改記錄
		
		mapper.deleteStudent(1001); //刪除一條記錄
		
		sqlSession.commit(); //提交事務,增刪改都需要手動提交事務
	}
}

注意:增刪改需要手動提交事務,如需自動提交事務,需要將 openSession() 的入口參數設置爲 true,如下:

SqlSession sqlSession=sqlSessionFactory.openSession(true); //自動提交事務

控制檯輸出如下:

DEBUG 06-11 19:28:25,538 ==>  Preparing: select sid,sname from students where sid = ?  (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,567 ==> Parameters: 1001(Integer) (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,579 <==      Total: 1 (BaseJdbcLogger.java:145)
Student [sid=1001, sname=張三]
DEBUG 06-11 19:28:25,580 ==>  Preparing: select sid,sname from students  (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,580 ==> Parameters:  (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,581 <==      Total: 2 (BaseJdbcLogger.java:145)
[Student [sid=1001, sname=張三], Student [sid=1002, sname=李四]]
DEBUG 06-11 19:28:25,581 ==>  Preparing: insert into students values(null,?)  (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,582 ==> Parameters: 王五(String) (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,583 <==    Updates: 1 (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,583 ==>  Preparing: update students set sname=? where sid=?  (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,584 ==> Parameters: 小明(String), 1002(Integer) (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,584 <==    Updates: 1 (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,584 ==>  Preparing: delete from students where sid=?  (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,585 ==> Parameters: 1001(Integer) (BaseJdbcLogger.java:145)
DEBUG 06-11 19:28:25,585 <==    Updates: 1 (BaseJdbcLogger.java:145)

數據庫中 students 表數據如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章