第二章 Mybatis的基礎操作(增刪改查)
2.1 查詢資料
2.2.1查詢單條資料
新建實體類:
@Data
public class Student {
private Long id;
private String name;
private Integer age;
}
對映檔案:
Student.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.mybatis.dmomain.Student"> <select id="selectone" resultType="com.mybatis.dmomain.Student"> SELECT id,name,age FROM student WHERE id=#{id} </select> </mapper>
全域性配置檔案:
<?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="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="Student.xml"></mapper> </mappers> </configuration>
查詢方法:
//查詢單條資料
@Test void selectOne() { InputStream inputStream = null; try { //1.獲取去全域性配置檔案 inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //2.載入全域性配置檔案 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //3.建立SqlSession物件,傳遞true表示自動提交事務 SqlSession session = factory.openSession(true); //4.執行查詢方法 //引數1:對映檔案中namespace標籤名稱+id名稱 //引數2:需要傳遞的引數 Student student = session.selectOne("com.mybatis.dmomain.Student.selectone", 1L); //5.關閉資源 session.close(); System.out.println(student); } catch (IOException e) { e.printStackTrace(); } }
2.2.2查詢多條資料
@Test
void selectAll() {
InputStream inputStream = null;
try {
//1.獲取去全域性配置檔案
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.載入全域性配置檔案
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.建立SqlSession物件,傳遞true表示自動提交事務
SqlSession session = factory.openSession(true);
//4.執行查詢方法
//引數1:對映檔案中namespace標籤名稱+id名稱
List<Student> students = session.selectList("com.mybatis.dmomain.Student.selectAll");
//5.關閉資源
session.close();
for (Student s : students) {
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
對映檔案改動內容:
<select id="selectAll" resultType="com.mybatis.dmomain.Student">
SELECT id,name,age FROM student
</select>
補充:
1.返回一個map:
@Test
void geMap() {
SqlSession session = MyBatisUtil.getSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
Map map = mapper.getMap(2L);
System.out.println(map);
session.close();
}
<select id="getMap" resultType="map">
SELECT * FROM student WHERE id=#{id}
</select>
map 的key就是列名,value就是值。
2.將某個欄位作為key,整個物件作為value:
@Test
void getMap() {
SqlSession session = MyBatisUtil.getSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
Map map = mapper.getMap();
System.out.println(map);
session.close();
}
//返回的id作為key,Student就是一個物件
@MapKey("id")
Map<Integer , Student> getMap();
此處用了一個註解。
2.2 更新資料
@Test
void update() {
InputStream inputStream = null;
try {
//1.獲取去全域性配置檔案
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.載入全域性配置檔案
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.建立SqlSession物件,傳遞true表示自動提交事務
SqlSession session = factory.openSession(true);
//4.執行查詢方法
//引數1:對映檔案中namespace標籤名稱+id名稱
//引數2:需要傳遞的引數
Student student = new Student();
student.setId(1L);
student.setName("陸小鳳");
student.setAge(22);
session.update("com.mybatis.dmomain.Student.update", student);
//5.關閉資源
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
對映檔案:
<update id="update">
UPDATE student SET name=#{name},age=#{age} WHERE id=#{id}
</update>
2.3刪除資料
@Test
void delete() {
InputStream inputStream = null;
try {
//1.獲取去全域性配置檔案
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.載入全域性配置檔案
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.建立SqlSession物件,傳遞true表示自動提交事務
SqlSession session = factory.openSession(true);
//4.執行查詢方法
//引數1:對映檔案中namespace標籤名稱+id名稱
//引數2:需要傳遞的引數
session.delete("com.mybatis.dmomain.Student.delete", 1L);
//5.關閉資源
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
xml對映檔案:
<update id="delete">
DELETE FROM student WHERE id=#{id}
</update>
2.4增加資料
2.4.1:增加一條資料
@Test
void insert() {
InputStream inputStream = null;
try {
//1.獲取去全域性配置檔案
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.載入全域性配置檔案
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.建立SqlSession物件,傳遞true表示自動提交事務
SqlSession session = factory.openSession(true);
//4.執行查詢方法
//引數1:對映檔案中namespace標籤名稱+id名稱
//引數2:需要傳遞的引數
Student student = new Student();
student.setName("西門吹雪");
student.setAge(18);
session.insert("com.mybatis.dmomain.Student.insert", student);
//5.關閉資源
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
XML對映檔案:
<insert id="insert">
INSERT INTO student (name,age) VALUES (#{name},#{age})
</insert>
2.4.2儲存資料返回主鍵值
在實際的開發中,會有這樣的需求,再儲存一條資料之後,需要返回儲存該條資料的主鍵,用於下面操作。舉個例子:
你去一個網站註冊資訊,一般有個快速註冊按鈕,註冊完畢之後會讓你繼續完善個人資訊,此時就需要前一個頁面註冊時候生成的主鍵,此處作為條件更新資料(新註冊相當於插入資料,完善資訊相當於更新資料)。
useGeneratedKeys:表示設定為自動生成主鍵
keyProperty:表示生成的主鍵對映到你的哪一個欄位屬性上
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO student (name,age) VALUES (#{name},#{age})
</insert>
本章小結:
在本小節中,主要演示使用Mybatis進行基礎的增刪改查操作,其實沒有什麼難度,就是一一些基礎的SQL語句的書寫。
再者就是呼叫Mybatis中幾個方法。此處再來分析下:
查詢資料呼叫的是:
查詢單個數據:
selectOne(String url ,Objec object),返回一個查詢的實體物件,引數1是namespace+id名稱,引數2就是你傳遞的條件。
查詢多個數據:
selectList(String url),返回一個List集合,引數1就是namespace+id,
然後在對映檔案中進行編寫SQL語句即可
<select id=" " >
SQL 語句
</selerct>
其實也並不一定需要這麼寫,最後絕對執行的結果是裡面的SQL語句,但是這個就是規範好一點,這麼用就可以了。
更新資料:
update(String url,Object object),引數1依然是namespace+id,引數2則傳遞一個需要被更新的物件即可。
刪除資料:
delete(String url,Object object),引數1依然是namespace+id,引數2則傳遞一個需要被刪除的物件id即可。
增加一條資料:
insert(String url,Object object)引數1依然是namespace+id,引數2則傳遞一個需要增加資料的物件id即可。
最後還講解一個了在增加的時候可以獲取返回自動增長的主鍵:
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
這個以後也比較常用,就是配置兩個屬性,分別是開啟和對映到物件的哪個屬性上。
關於還有一個#{屬性名}和程式碼重複的問題,再下一個章節將會對這個進行講解。