文章目錄
- Mybatis是什么?
- 一、快速入門(基于Mybatis3方式)
- 二、MyBatis基本使用
- 2.1 向SQL語句傳參
- 2.1.1 mybatis日志輸出配置
- 2.1.2 #{}形式
- 2.1.3 ${}形式
- 2.2 數據輸入
- 2.2.1 Mybatis總體機制概括
- 2.2.2 概念說明
- 2.2.3 單個簡單類型參數
- 2.2.4 實體類類型參數
- 2.2.5 多個簡單類型數據
- 2.2.6 Map類型參數
- 2.3 數據輸出
- 2.3.1 返回單個簡單類型
- 2.3.2 返回實體類對象
- 2.3.3 返回Map類型
- 2.3.4 返回List類型
- 2.3.5 返回主鍵值
- 2.3.6 實體類屬性和數據庫字段對應關系
- 2.4 CRUD強化練習
- 2.5 mapperXML標簽總結
- 總結
Mybatis是什么?
官網 文檔
MyBatis 是一款優秀的持久層框架,MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
開發效率:Hibernate>Mybatis>JDBC
運行效率:JDBC>Mybatis>Hibernate
一、快速入門(基于Mybatis3方式)
- 數據庫
CREATE DATABASE `mybatis-example`;USE `mybatis-example`;CREATE TABLE `t_emp`(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id)
);INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);
- 項目的搭建 準備
- 項目搭建
- 依賴導入
<dependencies><!-- mybatis依賴 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><!-- MySQL驅動 mybatis底層依賴jdbc驅動實現,本次不需要導入連接池,mybatis自帶! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><!--junit5測試--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version></dependency>
</dependencies>
- 實體類
public class Employee {private Integer empId;private String empName;private Double empSalary;......set/get
- Mapper接口與MapperXML文件
- 定義Mapper接口
/*** @Description: dao層接口*/
public interface EmployeeMapper {/*** 根據ID查找員工信息* @param id* @return*/Employee queryById(Integer id);/*** 根據ID刪除對應員工* @param id* @return*/int deleteById(Integer id);
}
- 定義Mapper xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口類的全限定名,這樣實現對應 -->
<mapper namespace="com.wake.mapper.EmployeeMapper"><!-- 查詢使用 select標簽id = 方法名resultType = 返回值類型標簽內編寫SQL語句--><select id="queryById" resultType="com.wake.pojo.Employee"><!-- #{id}代表動態傳入的參數,并且進行賦值!... -->select emp_id empId,emp_name empName, emp_salary empSalary fromt_emp where emp_id = #{id}</select><delete id="deleteById">delete from t_emp where emp_id = #{id}</delete>
</mapper>
- 準備Mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- environments表示配置Mybatis的開發環境,可以配置多個環境,在眾多具體環境中,使用default屬性指定實際運行時使用的環境。default屬性的取值是environment標簽的id屬性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一個具體的環境 --><environment id="development"><!-- Mybatis的內置的事務管理器 --><transactionManager type="JDBC"/><!-- 配置數據源 --><dataSource type="POOLED"><!-- 建立數據庫連接的具體信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!-- Mapper注冊:指定Mybatis映射文件的具體位置 --><!-- mapper標簽:配置一個具體的Mapper映射文件 --><!-- resource屬性:指定Mapper映射文件的實際存儲位置,這里需要使用一個以類路徑根目錄為基準的相對路徑 --><!-- 對Maven工程的目錄結構來說,resources目錄下的內容會直接放入類路徑,所以這里我們可以以resources目錄為基準 --><mapper resource="mappers/EmployeeMapper.xml"/></mappers></configuration>
- 運行 測試
public class MybatisTest {@Testpublic void test_01() throws IOException {// 1. 讀取外部配置文件(mybatis-config.xml)InputStream ips = Resources.getResourceAsStream("mybatis-config.xml");// 2. 創建 SqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(ips);// 3. 根據sqlSessionFactory 創建 sqlSession (每次業務創建一個,用完就釋放SqlSession session = sessionFactory.openSession();// 4. 獲取接口的代理對象(代理技術) 調用代理對象的方法,就會查找Mapper接口的方法//jdk動態代理技術生成的mapper代理對象EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);// 內部拼接接口的全限定符號.方法名 去查找sql語句標簽// 拼接 類的全限定符號.方法名 整合參數 -> ibatis對應的方法傳入參數// mybatis底層依賴調用ibatis只不過有固定的模式!Employee employee = mapper.queryById(1);System.out.println(employee);// 4.提交事務(非DQL)和釋放資源session.commit(); //提交事務 [DQL不需要,其他需要]session.close(); //關閉會話}
}
說明:
SqlSession
:代表Java程序和數據庫之間的會話。- (HttpSession是Java程序和瀏覽器之間的會話)
SqlSessionFactory
:是“生產”SqlSession的“工廠”。- 工廠模式:如果創建某一個對象,使用的過程基本固定,那么我們就可以把創建這個對象的相關代碼封裝到一個“工廠類”中,以后都使用這個工廠類來“生產”我們需要的對象。
SqlSession和HttpSession區別:
- HttpSession:工作在Web服務器上,屬于表述層。
- 代表瀏覽器和Web服務器之間的會話。
- SqlSession:不依賴Web服務器,屬于持久化層。
- 代表Java程序和數據庫之間的會話。
二、MyBatis基本使用
2.1 向SQL語句傳參
2.1.1 mybatis日志輸出配置
Mybatis 3 配置
我們可以在mybatis的配置文件使用settings標簽設置,輸出運過程SQL日志!
通過查看日志,我們可以判定#{} 和 ${}的輸出效果!
settings設置項:
logImpl | 指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 | SLF4J | LOG4J(3.5.9 起廢棄) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未設置 |
---|
日志配置:
<settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings>
開啟日志后 測試:
2.1.2 #{}形式
Mybatis會將SQL語句中的#{}轉換為問號占位符。
使用這個防止【注入式攻擊】
2.1.3 ${}形式
${}形式傳參,底層Mybatis做的是字符串拼接操作。
結論:實際開發中,能用#{}實現的,肯定不用${}。
特殊情況: 動態的不是值,是列名或者關鍵字,需要使用${}拼接
//注解方式傳入參數!!
@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
一個特定的適用場景是:通過Java程序動態生成數據庫表,表名部分需要Java程序通過參數傳入;而JDBC對于表名部分是不能使用問號占位符的,此時只能使用
2.2 數據輸入
Mapper接口中 不允許 重載方法
2.2.1 Mybatis總體機制概括
2.2.2 概念說明
這里數據輸入具體是指上層方法(例如Service方法)調用Mapper接口時,數據傳入的形式。
- 簡單類型:只包含一個值的數據類型
- 基本數據類型:int、byte、short、double、……
- 基本數據類型的包裝類型:Integer、Character、Double、……
- 字符串類型:String
- 復雜類型:包含多個值的數據類型
- 實體類類型:Employee、Department、……
- 集合類型:List、Set、Map、……
- 數組類型:int[]、String[]、……
- 復合類型:List<Employee>、實體類中包含集合……
2.2.3 單個簡單類型參數
Mapper接口中抽象方法的聲明:
/*** 根據ID 查詢對應員工信息* @param id* @return*/Employee selectEmpById(Integer id);/*** 根據薪資查找員工信息* @param salary* @return*/List<Employee> selectEmpBySalary(Double salary);/*** 根據ID 刪除員工對象* @param id* @return*/int deleteEmpById(Integer id);
SQL語句:
<select id="selectEmpById" resultType="com.wake.pojo.Employee">select emp_id empId , emp_name empName , emp_Salary empSalary fromt_emp where emp_id = #{id};</select><select id="selectEmpBySalary" resultType="com.wake.pojo.Employee">select emp_id empId , emp_name empName , emp_Salary empSalary fromt_emp where emp_salary = #{salary};</select><!-- 傳入簡單類型 key值 隨便寫 因為只有一個,一般情況寫參數名 --><delete id="deleteEmpById">delete from t_emp where emp_id = #{id};</delete>
2.2.4 實體類類型參數
Mapper接口中抽象方法的聲明:
/*** 插入一條員工信息* @param employee* @return*/int insertEmp(Employee employee);
SQL語句:
<!-- 傳入實體類 key 等于 屬性名 --><insert id="insertEmp">insert into t_emp (emp_name,emp_salary) values(#{empName},#{empSalary})</insert>
2.2.5 多個簡單類型數據
Mapper接口中抽象方法的聲明:
/*** 根據名字與薪資 查找員工* @param name* @param salary* @return*/Employee selectEmpByNameAndSalary(@Param("empName") String name, @Param("salary") Double salary);/*** 根據ID 修改名字* @param id* @return*/int updateNameById(String name,Integer id);
SQL語句:
<!-- 多個簡單參數接口中使用注解@Paramormapper.xml中 用[arg1, arg0, param1, param2]指代 (arg要查找的值 , param是要修改的值)--><select id="selectEmpByNameAndSalary" resultType="com.wake.pojo.Employee">select emp_id empId , emp_name empName , emp_Salary empSalary fromt_emp where emp_name = #{empName} and emp_salary = #{salary};</select><update id="updateNameById">update t_emp set emp_name = #{param1} where emp_id = #{arg1};</update>
2.2.6 Map類型參數
Mapper接口中抽象方法的聲明:
/*** 傳入map員工對象數據* @param data* @return*/int insertEmpMap(Map data);
SQL語句:
<!-- 傳入map的數據 使用的是map的key值 key = map key --><insert id="insertEmpMap">insert into t_emp (emp_name,emp_salary) values(#{name},#{salary})</insert>
2.3 數據輸出
數據輸出總體上有兩種形式:
- 增刪改操作返回的受影響行數:直接使用 int 或 long 類型接收即可
- 查詢操作的查詢結果
2.3.1 返回單個簡單類型
返回單個簡單類型如何指定 : resultType的寫法,用返回值類型。
resultType的語法:
-
- 類的全限定符號
-
- 別名簡稱
- 指定查詢的輸出數據類型即可!并且插入場景下,實現主鍵數據回顯示!
- 類型別名(typeAliases)
-
- 自定義類型名字
- 在 mybatis-config.xml 中全局設置:
<!-- 單個類單獨定義別名 , 之后resultType 使用“自己設置的名字” --><typeAliases><typeAlias type="com.wake.pojo.Employee" alias="自己設置名字"/></typeAliases><!-- 批量修改 --><typeAliases><!-- 批量將包下的類 設置別名都為首字母小寫 --><package name="com.wake.pojo"/></typeAliases><!-- 批量后 想單獨設置單個類 使用注解單個類 --><!-- @Alias("666") -->
2.3.2 返回實體類對象
resultType: 返回值類型
<select id="queryEmpById" resultType="employee">select *from t_empwhere emp_Id = #{empId};</select>
要求:
查詢,返回單個實體類型,要求 列名 和 屬性名 要一致 !
這樣才可以進行實體類的屬性映射。
mybatis 可以開啟屬性列名的自動映射:
在 mybatis-config.xml中設置:
<!-- true開啟駝峰命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn。--><setting name="mapUnderscoreToCamelCase" value="true"/>
2.3.3 返回Map類型
- 接口:
Map<String,Object> selectEmpNameAndMaxSalary();
- sql xml
<!-- Map<String,Object> selectEmpNameAndMaxSalary(); -->
<!-- 返回工資最高的員工的姓名和他的工資 -->
<select id="selectEmpNameAndMaxSalary" resultType="map">SELECTemp_name 員工姓名,emp_salary 員工工資,(SELECT AVG(emp_salary) FROM t_emp) 部門平均工資FROM t_emp WHERE emp_salary=(SELECT MAX(emp_salary) FROM t_emp)
</select>
- junit測試
@Testpublic void mybatisTest01() throws IOException {// 1.讀取配置文件InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");// 2. 創建sqlSession 數據庫連接工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);// 3. 開啟sqlSession 數據庫連接SqlSession sqlSession = sqlSessionFactory.openSession();// 4. 確定mapper對象EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);// 5. 執行mapper方法Map<String, Object> stringObjectMap =employeeMapper.selectEmpNameAndMaxSalary();Set<Map.Entry<String, Object>> entries =stringObjectMap.entrySet();for (Map.Entry<String, Object> entry : entries) {String key = entry.getKey();Object value = entry.getValue();System.out.println(key + "---" + value);}sqlSession.close();}
2.3.4 返回List類型
返回值是集合,resultType不需要指定集合類型,只需要指定泛型即可。
因為
mybatis -> ibatis -> selectOne 單個 | selectList 集合 -> selectOne 調用[selectList]
- 接口
/*** 查詢全部員工對象* @return*/List<Employee> selectAll();
- mapper.xml
<!-- List<Employee> selectAll(); --><select id="selectAll" resultType="employee">select emp_id empId,emp_name empName,emp_salary empSalaryfrom t_emp</select>
- 測試
@Testpublic void mybatisTest01() throws IOException {// 1.讀取配置文件InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");// 2. 創建sqlSession 數據庫連接工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);// 3. 開啟sqlSession 數據庫連接SqlSession sqlSession = sqlSessionFactory.openSession();// 4. 確定mapper對象EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);// 5. 執行mapper方法List<Employee> employees = employeeMapper.selectAll();for (Employee employee : employees) {System.out.println(employee);}sqlSession.close();}
2.3.5 返回主鍵值
1. 自增長類型主鍵
- 接口
/*** 插入一條員工信息* @param employee* @return*/int insertEmp(Employee employee);
- xml
<insert id="insertEmp">insert into t_emp(emp_Name,emp_salary)values(#{empName},#{empSalary});</insert>
- 測試
@Testpublic void mybatisTest01() throws IOException {// 1.讀取配置文件InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");// 2. 創建sqlSession 數據庫連接工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);// 3. 開啟sqlSession 數據庫連接【自動開啟JDBC】// 自動開啟事務SqlSession sqlSession = sqlSessionFactory.openSession();// 4. 執行代理對象EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);// 5. 執行mapper方法Employee e1 = new Employee();e1.setEmpName("亞倫");e1.setEmpSalary(147.6);int i = employeeMapper.insertEmp(e1);System.out.println(i);// 6. 釋放資源 和 提交事務sqlSession.commit();sqlSession.close();}
主鍵回顯:
- xml
<!--useGeneratedKeys="true" : 開啟獲取數據庫主鍵值keyColumn="emp_id" : 主鍵列的值keyProperty="empId" : 接收主鍵列值的屬性--><insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">insert into t_emp(emp_Name,emp_salary)values(#{empName},#{empSalary});</insert>
- 測試:
@Testpublic void mybatisTest01() throws IOException {// 1.讀取配置文件InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");// 2. 創建sqlSession 數據庫連接工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);// 3. 開啟sqlSession 數據庫連接【自動開啟JDBC】// 自動開啟事務SqlSession sqlSession = sqlSessionFactory.openSession(true);// 4. 執行代理對象EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);// 5. 執行mapper方法Employee e1 = new Employee();e1.setEmpName("內爾");e1.setEmpSalary(258.9);// 提交前 主鍵值System.out.println("前:"+e1.getEmpId());System.out.println("=============================");int i = employeeMapper.insertEmp(e1);System.out.println(i);// 提交后 主鍵值System.out.println("后:"+e1.getEmpId());// 6. 釋放資源 和 提交事務//sqlSession.commit();sqlSession.close();}
2. 非自增長類型主鍵
新創建一個 表(不添加自動更新索引)
手動添加UUID
create TABLE teacher(t_id VARCHAR(64) PRIMARY KEY,t_name VARCHAR(20)
)
- mapper接口
int insertTeacher(Teacher teacher);
- xml
<mapper namespace="com.wake.mapper.TeacherMapper"><insert id="insertTeacher"><!--order="BEFORE|AFTER" 確定是在插入語句執行前還是后執行resultType="" 返回值類型keyProperty="" 查詢結果是給哪個屬性--><selectKey order="BEFORE" resultType="string" keyProperty="tId">select replace(UUID(),"-","");</selectKey>insert into teacher(t_id,t_name) values(#{tId},#{tName});</insert>
</mapper>
- 測試
@Testpublic void mybatisTest02() throws IOException {// 1.讀取配置文件InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");// 2. 創建sqlSession 數據庫連接工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);// 3. 開啟sqlSession 數據庫連接【自動開啟JDBC】// 自動開啟事務SqlSession sqlSession = sqlSessionFactory.openSession(true);// 4. 執行代理對象TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);// 5. 執行mapper方法Teacher teacher = new Teacher();teacher.setTName("維克");// 使用mybatis 在xml中定義uuid//String uuid = UUID.randomUUID().toString().replace("-", "");//teacher.setTId(uuid);System.out.println("UUID BEFORE:"+teacher.getTId());int i = teacherMapper.insertTeacher(teacher);System.out.println("UUID AFTER:"+teacher.getTId());System.out.println(i);// 6. 釋放資源 和 提交事務//sqlSession.commit();sqlSession.close();}
- 結果:
2.3.6 實體類屬性和數據庫字段對應關系
- 別名對應
將字段的別名設置成和實體類屬性一致。
<!-- 編寫具體的SQL語句,使用id屬性唯一的標記一條SQL語句 -->
<!-- resultType屬性:指定封裝查詢結果的Java實體類的全類名 -->
<select id="selectEmployee" resultType="com.doug.mybatis.entity.Employee"><!-- Mybatis負責把SQL語句中的#{}部分替換成“?”占位符 --><!-- 給每一個字段設置一個別名,讓別名和Java實體類中屬性名一致 -->select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{maomi}</select>
- 全局配置自動識別駝峰式命名規則
在Mybatis全局配置文件加入如下配置:
<!-- 使用settings對Mybatis全局進行設置 -->
<settings><!-- 將xxx_xxx這樣的列名自動映射到xxXxx這樣駝峰式命名的屬性名 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
就可以不使用別名:
<!-- Employee selectEmployee(Integer empId); -->
<select id="selectEmployee" resultType="com.doug.mybatis.entity.Employee">select emp_id,emp_name,emp_salary from t_emp where emp_id=#{empId}</select>
- 使用resultMap
使用resultMap標簽定義對應關系,再在后面的SQL語句中引用這個對應關系
<!-- 專門聲明一個resultMap設定column到property之間的對應關系 -->
<resultMap id="selectEmployeeByRMResultMap" type="com.doug.mybatis.entity.Employee"><!-- 使用id標簽設置主鍵列和主鍵屬性之間的對應關系 --><!-- column屬性用于指定字段名;property屬性用于指定Java實體類屬性名 --><id column="emp_id" property="empId"/><!-- 使用result標簽設置普通字段和Java實體類屬性之間的關系 --><result column="emp_name" property="empName"/><result column="emp_salary" property="empSalary"/></resultMap><!-- Employee selectEmployeeByRM(Integer empId); -->
<select id="selectEmployeeByRM" resultMap="selectEmployeeByRMResultMap">select emp_id,emp_name,emp_salary from t_emp where emp_id=#{empId}</select>
2.4 CRUD強化練習
- 數據庫準備
CREATE TABLE `user` (`id` INT(11) NOT NULL AUTO_INCREMENT,`username` VARCHAR(50) NOT NULL,`password` VARCHAR(50) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- 實體類準備
public class User {private int id;private String username;private String password;
- 接口Mapper
public interface UserMapper {/*** 增加* @param user* @return*/int insert(User user);/*** 修改* @param user* @return*/int update(User user);/*** 刪除* @param id* @return*/int delete(Integer id);/*** 根據ID查詢一條User數據* @param id* @return*/User selectById(Integer id);/*** 查詢全部數據* @return*/List<User> selectAll();
}
- Mapper.xml
<mapper namespace="com.wake.mapper.UserMapper"><insert id="insert">insert into user(username,password) values(#{username},#{password});</insert><update id="update">update user set username = #{username},password = #{password} where id = #{id};</update><delete id="delete">delete from user where id = #{id};</delete><select id="selectById" resultType="user">select id,username,password from user where id = #{id};</select><select id="selectAll" resultType="user">select * from user;</select>
</mapper>
- 測試
@Testpublic void insert01() throws IOException {InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setUsername("knell");user.setPassword("999");int insert = userMapper.insert(user);System.out.println(insert);sqlSession.commit();sqlSession.close();}@Testpublic void delete02() throws IOException {InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);int delete = userMapper.delete(3);System.out.println(delete);sqlSession.commit();sqlSession.close();}@Testpublic void update03() throws IOException {InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectById(4);user.setUsername("測試");user.setPassword("123456");int update = userMapper.update(user);System.out.println(update);sqlSession.commit();sqlSession.close();}@Testpublic void selectById04() throws IOException {InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectById(1);System.out.println(user);sqlSession.commit();sqlSession.close();}@Testpublic void selectAll05() throws IOException {InputStream ips = Resources.getResourceAsStream("Mybatis-Config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.selectAll();System.out.println(users);sqlSession.commit();sqlSession.close();}
注意更新要先根據ID查找出對象數據
2.5 mapperXML標簽總結
insert
– 映射插入語句。update
– 映射更新語句。delete
– 映射刪除語句。select
– 映射查詢語句。
屬性 | 描述 |
---|---|
id | 在命名空間中唯一的標識符,可以被用來引用這條語句。 |
resultType | 期望從這條語句中返回結果的類全限定名或別名。 注意,如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。 |
resultMap | 對外部 resultMap 的命名引用。結果映射是 MyBatis 最強大的特性,如果你對其理解透徹,許多復雜的映射問題都能迎刃而解。 resultType 和 resultMap 之間只能同時使用一個。 |
timeout | 這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為未設置(unset)(依賴數據庫驅動)。 |
statementType | 可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。 |
總結
Mybatis操作流程:
ibatis 和 Mybatis :
Mybatis 文檔:
Mybatis 中文官網
類型的別名:
別名 | 映射的類型 |
---|---|
_byte | byte |
_char (since 3.5.10) | char |
_character (since 3.5.10) | char |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
char (since 3.5.10) | Character |
character (since 3.5.10) | Character |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
biginteger | BigInteger |
object | Object |
object[] | Object[] |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |