上篇博文介紹了MyBatis的一個入門示例,今天介紹如何實現數據庫的增長、刪除和修改記錄的操做。爲簡潔起見,與上個示例重複的註釋將被刪除(少數重要的除外)。若影響了您的理解,可參考上篇博文。 html
本示例的任務是增長、刪除和修改學生信息。筆者在本身機器上的E:\DemoPrograms目錄下創建目錄MyBatis02,來保存本示例的工程。工程的lib目錄和上個示例同樣,保存着MyBatis-3.0.6.jar和MySQL的JDBC驅動包mysql-connector-java-5.1.20-bin.jar;與此同時,也一樣是在src目錄下的resources目錄中保存MyBatis的配置文件:configuration.xml和StudentMapper.xml;另外,與之前同樣,JAVA源代碼文件的組織,也是按照其包的層次結構,之後再也不贅述。configuration.xml在本例中不須要修改,所以再也不介紹。 java
爲了方便地獲取SqlSessionFactory實例,先寫一個工具類SqlSessionFactoryGen,用以生成SqlSessionFactory實例,代碼以下: mysql
package com.util; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.session.SqlSession; public class SqlSessionFactoryGen { private static SqlSessionFactory factory; //靜態代碼塊。在類初始化時被執行,如第一次 //引用類的靜態變量,建立類的第一個實例 static { String resource = "resources/configuration.xml"; Reader reader = null; try{ reader = Resources.getResourceAsReader(resource); }catch(IOException e) { e.printStackTrace(); } factory = new SqlSessionFactoryBuilder().build(reader); } public static SqlSessionFactory getSqlSessionFactory() { return factory; } }
因爲整個程序只須要一個SqlSessionFactory實例,所以經過調用SqlSessionFactoryGen的getSqlSessionFactory()方法獲取的是同一個SqlSessionFactory實例。 sql
此次要執行的類是AddUpdDelDemo,其初始代碼以下: 數據庫
package com.demo; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSession; import com.abc.mapper.StudentMapper; import com.abc.domain.Student; import com.util.SqlSessionFactoryGen; public class AddUpdDelDemo { //獲取SqlSessionFactory實例 private static SqlSessionFactory factory =SqlSessionFactoryGen.getSqlSessionFactory(); public static void main(String[] args) { } }
下面分別介紹如何在上個示例的基礎上,實現學生信息的增長、刪除和修改操做。 apache
1、增長 api
首先在接口StudentMapper中聲明執行增長操做的方法,代碼以下所示: session
package com.abc.mapper; import com.abc.domain.Student; public interface StudentMapper { public Student getById(int id); //增長一名學生 public void add(Student student); }
接着在StudentMapper.xml中編寫相應的insert語句。代碼以下(24行): mybatis
<?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.abc.mapper.StudentMapper"> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> </resultMap> <select id="getById" parameterType="int" resultMap="studentResultMap"> SELECT * FROM student WHERE id = #{id} </select> <!--執行增長操做的SQL語句。id和parameterType 分別與StudentMapper接口中的add方法的名字和 參數類型一致。以#{name}的形式引用Student參數 的name屬性,MyBatis將使用反射讀取Student參數 的此屬性。#{name}中name大小寫敏感。引用其餘 的gender等屬性與此一致。seGeneratedKeys設置 爲"true"代表要MyBatis獲取由數據庫自動生成的主 鍵;keyProperty="id"指定把獲取到的主鍵值注入 到Student的id屬性--> <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into student(name,gender,major,grade) values(#{name},#{gender},#{major},#{grade}) </insert> </mapper>
(注:因爲上述配置文件有中文註釋,爲預防出現「Invalid byte 1 of 1-byte UTF-8 sequence.」的錯誤,讀者不要複製本文的配置文件。點擊文章下方的「附件下載」,可下載本示例的完整代碼。) app
而後在AddUpdDelDemo類中編寫add方法,調用上述的insert語句,執行插入操做。代碼以下:
public static void add() { SqlSession sqlSession = factory.openSession(); Student student = new Student(); student.setName("陳一斌"); student.setGender("男"); student.setMajor("計算機科學與技術"); student.setGrade("2011"); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.add(student); //提交事務,不然不會實際添加到數據庫中 sqlSession.commit(); System.out.println("數據庫生成的ID: " + student.getId()); sqlSession.close(); }
2、修改
照樣是首先在接口StudentMapper中聲明執行修改操做的方法,代碼以下所示:
package com.abc.mapper; import com.abc.domain.Student; public interface StudentMapper { public Student getById(int id); public void add(Student student); //修改學生信息 public void update(Student student); }
接着在StudentMapper.xml中編寫相應的update語句。代碼以下(23行):
<?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.abc.mapper.StudentMapper"> <resultMapid="studentResultMap"type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> </resultMap> <select id="getById" parameterType="int" resultMap="studentResultMap"> SELECT * FROM student WHERE id = #{id} </select> <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into student(name,gender,major,grade) values(#{name},#{gender},#{major},#{grade}) </insert> <!--執行修改操做的SQL語句。id和parameterType 屬性以及「#{}」的形式的含義與上述insert語句一致。--> <update id="update" parameterType="Student"> update student set name=#{name}, gender=#{gender}, major=#{major}, grade=#{grade} where id=#{id} </update> </mapper>
而後在AddUpdDelDemo類中編寫update方法,調用上述的update語句,執行插入操做。代碼以下:
public static void update() { SqlSession sqlSession = factory.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); //獲取id爲1的學生 Student student = mapper.getById(1); System.out.println("修改前的專業:" + student.getMajor()); //修改其專業 student.setMajor("電子信息工程"); mapper.update(student); //提交事務,不然不會實際修改到數據庫中 sqlSession.commit(); student = mapper.getById(1); System.out.println("修改後的專業:" + student.getMajor()); sqlSession.close(); }
3、刪除
仍是先在接口StudentMapper中聲明執行刪除操做的方法,代碼以下所示:
package com.abc.mapper; import com.abc.domain.Student; public interface StudentMapper { public Student getById(int id); public void add(Student student); public void update(Student student); //刪除學生信息 public void delete(int id); }
接着在StudentMapper.xml中編寫相應的delete語句。代碼以下(29行):
<?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.abc.mapper.StudentMapper"> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> </resultMap> <select id="getById" parameterType="int" resultMap="studentResultMap"> SELECT * FROM student WHERE id = #{id} </select> <insert id="add" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into student(name,gender,major,grade) values(#{name},#{gender},#{major},#{grade}) </insert> <update id="update" parameterType="Student"> update student set name=#{name}, gender=#{gender}, major=#{major}, grade=#{grade} where id=#{id} </update> <!--#{id}引用參數id的值--> <delete id="delete" parameterType="int"> delete from student where id=#{id} </delete> </mapper>
而後在AddUpdDelDemo類中編寫delete方法,調用上述的delete語句,執行刪除操做。代碼以下:
public static void delete() { SqlSession sqlSession = factory.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); mapper.delete(1); //提交事務,不然不會實際刪除數據庫中的記錄 sqlSession.commit(); sqlSession.close(); }
如今來運行上述的方法。爲此應先修改ant的生成文件build.xml,在「run」這個target的「java」task中,將其classname屬性值改成"com.demo.AddUpdDelDemo",代表運行此類;併爲此task增長元素<arg value="${para}"/>。這代表將讀取屬性para的值做爲參數,傳遞給AddUpdDelDemo的main方法(稍後將演示如何指定屬性para的值)。並而main方法將根據傳遞來的值,決定執行哪一個方法。main方法以下所示:
public static void main(String[] args) { if(args[0].equals("add")) { add(); } else if(args[0].equals("update")) { update(); } else if(args[0].equals("delete")) { delete(); } else { System.out.println("參數錯誤!"); } }
在命令窗口下,進入到目錄E:\DemoPrograms\ MyBatis02下。若想要執行增長操做,則運行命令:ant run –Dpara=add。在-D選項後面定義屬性para並指定值,ant將把此值傳遞給AddUpdDelDemo的main方法。運行結果以下:
運行命令:ant run –Dpara=update,執行修改操做。結果以下:
運行命令:ant run –Dpara=delete,執行刪除操做。結果以下:
進入數據庫查詢,數據已被刪除。
MyBatis技術交流羣:188972810,或掃描二維碼:
【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝
【MyBatis學習筆記】系列之二:MyBatis增刪改示例
【MyBatis學習筆記】系列之三:MyBatis的association示例
【MyBatis學習筆記】系列之四:MyBatis association的兩種形式
【MyBatis學習筆記】系列之五:MyBatis與Spring集成示例
【MyBatis學習筆記】系列之六:MyBatis與Spring集成示例續
【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯
【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式
【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j示例
【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式示例
【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之默認命名方式示例
【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式示例
【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題
【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式
【MyBatis學習筆記】系列之十六:Spring聲明式事務管理示例
【MyBatis學習筆記】系列之十七:MyBatis多對多保存示例
【MyBatis學習筆記】系列之十八:MyBatis多對多關聯查詢示例
【MyBatis學習筆記】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2