入门demo---Mybatis学习笔记(三)
需求:
實現以下功能:
1. 根據用戶id查詢一個用戶信息
2. 根據用戶名稱模糊查詢用戶信息列表
3. 添加用戶
4. 更新用戶
5. 刪除用戶
第一步:創建java工程
使用eclipse創建java工程,jdk使用1.7.0_72。
第二步:加入jar包
加入mybatis核心包、依賴包、數據驅動包。
第三步:log4j.properties
mybatis默認使用log4j作為輸出日志信息。
在classpath下創建log4j.properties如下:
第四步:SqlMapConfig.xml
在classpath下創建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><!-- 和spring整合后 environments配置將廢除--><environments default="development"><environment id="development"><!-- 使用jdbc事務管理--><transactionManager type="JDBC" /><!-- 數據庫連接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /><property name="username" value="root" /><property name="password" value="123" /></dataSource></environment></environments> </configuration>SqlMapConfig.xml是mybatis核心配置文件,上邊文件的配置內容為數據源、事務管理。
第五步:pojo類
Pojo類作為mybatis進行sql映射使用,po類通常與數據庫表對應(數據庫的字段名和屬性名對應),User.java如下:
Public class User {private int id;private String address;// 地址private String username;// 用戶姓名private String sex;// 性別private Date birthday;// 生日 get/set……第六步:程序編寫
查詢:(需求1,2的實現)
1.寫映射文件:
在classpath下的sqlmap目錄下創建sql映射文件User.xml:
2.加載映射文件
mybatis框架需要加載映射文件,將User.xml添加在SqlMapConfig.xml,如下:
3.測試程序
package com.huihui.first; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.huihui.pojo.User; public class MyBatisFirst {@Test//根據id查詢用戶信息,得到一條記錄結果public void findUserByIdTest() throws IOException{String resource = "SqlMapConfig.xml";//mybatis配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//得到配置文件流//1.創建會話工廠,傳入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.通過工廠得到SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//3.通過SqlSession操作數據庫//第一個參數:映射文件中的statement的id,等于=namespace+"."+statement的id//第二個參數:指定和映射文件所匹配的parameterType類型的參數//sqlSession.selectOne的結果是與映射文件中resultType類型的對象所匹配的User user = sqlSession.selectOne("test.findUserById", 1);System.out.println(user);//4.釋放資源sqlSession.close();}@Test//根據用戶名模糊查詢用戶信息public void findUserByUsername(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();List<User> list = ss.selectList("test.findUserByUsername", "小明");System.out.println(list.size());} catch (Exception e) {e.printStackTrace();} finally{if(ss!=null){ss.close();}}} }細節重點說明:
1.#{}和${}
#{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。如果#{}接收的類型是pojo類型時,是使用OGNL讀取對象中的屬性值,通過屬性.屬性.屬性….的方式獲取對象屬性值。
${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。如果${}接收的類型是pojo類型時,是使用OGNL讀取對象中的屬性值,通過屬性.屬性.屬性….的方式獲取對象屬性值。
2.parameterType和resultType
parameterType:指定輸入參數類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。
resultType:指定輸出結果類型,mybatis將sql查詢結果的一行記錄數據映射為resultType指定類型的對象。
3.selectOne和selectList
selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則拋出異常:
selectList可以查詢一條或多條記錄。
添加(需求3的實現)
1.映射文件:
<!-- 添加用戶 --> <!-- parameterType:指定輸入參數類型為pojo #{}中指定pojo的屬性名,接收到pojo對象的屬性值--> <insert id="insertUser" parameterType="com.huihui.pojo.User" >insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}) </insert>2.測試代碼:
@Test//添加用戶信息public void insertUser(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();User user = new User();user.setUsername("小灰灰");user.setBirthday(new Date());user.setSex("1");user.setAddress("山東東營");ss.insert("test.insertUser", user);//提交事務ss.commit();} catch (Exception e) {e.printStackTrace();} finally{if(ss!=null){ss.close();}}}進一步說明:
mysql自增主鍵返回:
上邊代碼說明:
- LAST_INSERT_ID():得到剛剛insert進去記錄的主鍵值,只適用于自增主鍵
- keyProperty:將查詢到的主鍵值設置到parameterType指定的對象的那個屬性,這里就是將查詢到的主鍵值設置到了User對象的id屬性中
- order:表示的是select LAST_INSERT_ID()語句相對于insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})語句的執行順序
mysql使用uuid實現主鍵和返回主鍵:
<insert id="insertUser" parameterType="com.huihui.pojo.User" > <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">select uuid() </selectKey>insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address}) </insert>上面代碼的說明:
執行過程:首先通過uuid()得到主鍵,將主鍵設置到user對象的id屬性中,然后在insert執行時,從user對象中取出id屬性值。因此order=”before”
oracle序列生成主鍵和返回主鍵:
首先自定義一個序列且用于生成主鍵,然后:
上面代碼的說明:
執行過程與上面的mysql使用uuid()的執行過程相同,因此也是order=”before”
刪除(需求5的實現):
1.映射文件:
<!-- 刪除用戶 --> <!-- 根據id刪除用戶,需要輸入id值 --> <delete id="deleteUser" parameterType="java.lang.Integer">delete from user where id = #{id} </delete>2.測試代碼:
public void deleteUser(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();ss.delete("test.deleteUser", 27);//刪除id為27的用戶ss.commit();} catch (Exception e) {e.printStackTrace();} finally {if(ss!=null){ss.close();}}}更新(需求4的實現):
1.映射文件:
<!-- 更新用戶 --> <!-- 根據id更新用戶,需要傳入用戶的id和用戶的更新信息(也就是傳入User對象,但是user對象中的id必須存在) --> <update id="updateUser" parameterType="com.huihui.pojo.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update>2.測試代碼:
public void updateUser(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();//要更新用戶的信息對象User user = new User();user.setId(30);user.setUsername("小芳芳");user.setSex("2");user.setBirthday(new Date());user.setAddress("山東臨沂");ss.update("test.updateUser", user);ss.commit();} catch (Exception e) {e.printStackTrace();} finally {if(ss!=null){ss.close();}}}總結
以上是生活随笔為你收集整理的入门demo---Mybatis学习笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis框架总体说明---Myba
- 下一篇: mybatis和hibernate的区别