ava框架-mybatis框架CRUD操作
阿新 • • 發佈:2018-11-01
1. Mybatis框架的CRUD操作
1.1 實現新增操作
- 以對使用者表進行DRUD操作為例
1.1.1 構建環境
1.1.1.1 新增依賴(pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion>4.0.0</modelVersion>
<groupId>com.azure</groupId>
<artifactId>day48projects</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
< artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency >
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
1.1.1.2 主配置檔案(SqlMapConfig.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>
<!--資料庫環境配置-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="pooled">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!--在此處新增對映檔案-->
</configuration>
1.1.1.3 建立實體類
package com.azure.entity;
import java.util.Date;
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public User() {
}
public User(int id, String username, Date birthday, String sex, String address) {
this.id = id;
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
/*此處省略getter&setter*/
}
1.1.2 建立dao層介面及對映
介面
public interface IUserDao {
/*
新增使用者
*/
void save(User user);
}
對映檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namesppace名稱空間,用於定義是哪個類的對映檔案,這裡需要寫對映介面的類全名-->
<mapper namespace="com.azure.dao.IUserDao">
<!--
mapper的子標籤有insert、update、delete、select等,分別對應CRUD
id:介面中的方法名字
parameterType:設定介面方法引數型別
OGNL表示式:
格式:#{物件的屬性名}
用途:獲取引數型別物件的資料
要求:表示式裡面的屬性名與物件屬性名必須完全一致
-->
<insert id="save" parameterType="com.azure.entity.User">
insert into user(username, birthday, sex, address) values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
- 注意事項:
- 對映檔案是mybatis的mapper,而不是mybatis的config。留意引入的檔案型別;
- mapper標籤的子標籤可以有多個;
- 此處sql語句寫法與jdbcTemplate不同,不能用"?"佔位,需要用OGNL表示式傳入資料。
載入對映檔案
- 在主配置檔案中新增載入資訊
<!--新增對映檔案-->
<mappers>
<mapper resource="com/azure/dao/IUserDao.xml"></mapper>
</mappers>
1.1.3 提交事務
- 提交事務有三種方式
- 手動提交事務,在事務程式碼最後增加提交事務程式碼;
- 設定自動提交事務:在用工廠類建立SqlSession物件時傳入引數true;
- 除去上述兩種情況,預設不自動提交,執行完事務程式碼後馬上回滾。
1.1.3.1 手動提交事務(推薦)
- 測試類程式碼
public class UserdaoTest {
@Test
public void save() throws IOException, ParseException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//SqlSession工廠構造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//建立SqlSession工廠
SqlSessionFactory factory = builder.build(is);
//建立SqlSession
SqlSession sqlSession = factory.openSession();
//建立Dao例項
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
/*
先以靜態資料模擬,後面會實際操作資料庫
*/
User user = new User();
user.setUsername("大黃");
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2010-10-20"));
user.setSex("男");
user.setAddress("北京");
//執行方法
System.out.println("儲存前:" + user);
userDao.save(user);
System.out.println("儲存後:" + user);
//手動提交事務
sqlSession.commit();
//關閉資源
sqlSession.close();
is.close();
}
}
1.1.3.2 自動提交事務(不建議)
- 測試類程式碼
public class UserdaoTest {
@Test
public void save() throws IOException, ParseException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//SqlSession工廠構造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//建立SqlSession工廠
SqlSessionFactory factory = builder.build(is);
//建立SqlSession
//openSession(false)預設值,表示需要手動提交
//openSession(true),設定自動提交
SqlSession sqlSession = factory.openSession(true);
//建立Dao例項
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
/*
先以靜態資料模擬,後面會實際操作資料庫
*/
User user = new User();
user.setUsername("大黃");
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2010-10-20"));
user.setSex("男");
user.setAddress("北京");
//執行方法
System.out.println("儲存前:" + user);
userDao.save(user);
System.out.println("儲存後:" + user);
//關閉資源
sqlSession.close();
is.close();
}
}
1.1.4 獲取資料庫自增長主鍵
- 主鍵需要通過設定dao介面對映檔案來獲取,上節的測試程式碼是無法獲取主鍵值
1.1.4.1 調整dao介面對映獲取主鍵
- 方法1(推薦):使用子標籤selectKey
調整後的IUserDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namesppace名稱空間,用於定義是哪個類的對映檔案,這裡需要寫對映介面的類全名-->
<mapper namespace="com.azure.dao.IUserDao">
<!--
mapper的子標籤有insert、update、delete、select等,分別對應CRUD
id:介面中的方法名字
parameterType:設定介面方法引數型別
OGNL表示式:
格式:#{物件的屬性名}
用途:獲取引數型別物件的資料
要求:表示式裡面的屬性名與物件屬性名必須完全一致
-->
<!--
插入後獲取主鍵自增長值,常用方法:使用selectKey標籤
resultType 查詢返回的主鍵的型別
keyColumn 資料庫表中主鍵列名稱
keyProperty對應User物件的屬性。把查詢的主鍵值設定到物件哪個屬性中。
order 獲取主鍵的時間
AFTER 在執行插入之後獲取主鍵值(mysql中適用,主鍵自增長)
BEFORE 在執行插入之前獲取主鍵值 (oracle中適用,因為oracle自增長通過序列實現)
標籤體:查詢最後插入的id值,固定為SELECT LAST_INSERT_ID();
-->
<insert id="save" parameterType="com.azure.entity.User">
<selectKey resultType="int" keyColumn="id" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey>
insert into user(username, birthday, sex, address) values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
- 方法二:使用屬性值userGeneratedKeys,僅適用於支援主鍵自增長的資料庫,不推薦
<!--
插入後獲取主鍵自增長,方式2:只適合支援主鍵自增長的資料庫。
useGeneratedKeys="true" true表示插入後獲取主鍵值
keyProperty="id" 物件的哪個屬性儲存主鍵值
keyColumn="id" 表的主鍵列名稱
-->
<insert id="save2" parameterType="com.azure.entity.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into user(username, birthday, sex, address) values(#{username},#{birthday},#{sex},#{address})
</insert>
1.2 實現修改操作
1.2.1 dao介面
public interface IUserDao {
/**
* 修改
*/
void update(User user);// 省略其他方法
}
1.2.2 dao介面對映
- 在主配置檔案中新增修改的對映
<!--修改
因為引數型別不是基本型別,所以使用OGNL表示式時屬性名與User物件屬性要完全一致
-->
<update id="update" parameterType="com.azure.entity.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
1.2.3 測試類
- 在測試類增加update方法
@Test
public void update() throws IOException, ParseException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//SqlSession工廠構造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//建立SqlSession工廠
SqlSessionFactory factory = builder.build(is);
//建立SqlSession
SqlSession sqlSession = factory.openSession();
//建立Dao例項
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
/*
先以靜態資料模擬,後面會實際操作資料庫
*/
User user = new User();
user.setId(49); //用以指明要修改的User的id值
user.setUsername("狗蛋");
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2000-10-20"));
user.setSex("男");
user.setAddress("北京");
//執行方法
userDao.update(user);
//手動提交事務
sqlSession.commit();
//關閉資源
sqlSession.close();
is.close();
}
1.3 實現刪除操作
1.3.1 dao介面
public interface IUserDao {
/*
刪除使用者資訊
*/
void delete(int id);// 省略其他方法
}
1.3.2 dao介面對映
- 在主配置檔案中新增修改的對映
<!--刪除
當介面的引數只有一個基本型別的時候,引數屬性名可以隨便寫
-->
<delete id="delete" parameterType="int">
delete from user where id=#{id}
</delete>
1.3.3 測試類
- 在測試類增加delete方法
@Test
public void delete() throws IOException, ParseException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//SqlSession工廠構造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//建立SqlSession工廠
SqlSessionFactory factory = builder.build(is);
//建立SqlSession
SqlSession sqlSession = factory.openSession();
//建立Dao例項
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//執行方法
userDao.delete(48);
//手動提交事務
sqlSession.commit();
//關閉資源
sqlSession.close();
is.close();
}
1.4 實現查詢操作
1.4.1 dao介面
public interface IUserDao {
/*
實現主鍵查詢
*/
User findById(int id);// 省略其他方法
}
1.4.2 dao介面對映
- 在主配置檔案中新增修改的對映
<!--主鍵查詢
parameterType 方法的形參(輸入引數)
int 表示方法引數是int型別
_int 也可以表示int型別
integer 也可以表示int型別
java.lang.Integer 也可以表示int型別
resultType 方法返回值(輸出引數)
-->
<select id="findById" resultType="com.azure.entity.User">
select * from user where id=#{id}
</select>
1.4.3 測試類
- 在測試類增加findById方法
@Test
public void findById() throws IOException, ParseException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//SqlSession工廠構造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//建立SqlSession工廠
SqlSessionFactory factory = builder.build(is);
//建立SqlSession
SqlSession sqlSession = factory.openSession();
//建立Dao例項
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//執行方法
System.out.println(userDao.findById(49));
//手動提交事務
sqlSession.commit();
//關閉資源
sqlSession.close();
is.close();
}
1.5 實現模糊查詢操作
1.5.1 dao介面
public interface IUserDao {
/*
實現模糊查詢
*/
List<User> findByName(String name);// 省略其他方法
}
1.5.2 dao介面對映
- 在主配置檔案中新增修改的對映
<!--模糊查詢
模糊查詢有兩種方式
1.使用OGNL表示式(推薦)
2.使用字串拼接(強烈不推薦,會出現sql語句注入問題):select * from user where username like %${value}%
-->
<select id="findByName" parameterType="String" resultType="com.azure.entity.User">
select * from user where username like #{username}
</select>
1.5.3 測試類
- 在測試類增加findByName方法
@Test
public void findByName() throws IOException, ParseException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//SqlSession工廠構造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//建立SqlSession工廠
SqlSessionFactory factory = builder.build(is);
//建立SqlSession
SqlSession sqlSession = factory.openSession();
//建立Dao例項
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//執行方法
List<User> userList = userDao.findByName