MyBatis增刪改示例——MyBatis學習筆記之二

      上篇博文介紹了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方法。運行結果以下: 

205054509.png

       運行命令:ant run –Dpara=update,執行修改操做。結果以下: 

205111995.png

       運行命令:ant run –Dpara=delete,執行刪除操做。結果以下: 

205156522.png

       進入數據庫查詢,數據已被刪除。

        猛戳這裏全面系統地學習MyBatis 3

        MyBatis技術交流羣:188972810,或掃描二維碼:

wKioL1SaztmBchKiAADsv4YAWBY259.jpg


【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝

【MyBatis學習筆記】系列之預備篇二:ant入門示例

【MyBatis學習筆記】系列之一:MyBatis入門示例

【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

MyBatis中如何經過繼承SqlSessionDaoSupport來編寫DAO(一)

MyBatis中如何經過繼承SqlSessionDaoSupport來編寫DAO(二)

相關文章
相關標籤/搜索