入门demo---Mybatis学习笔记(三)
需求:
實(shí)現(xiàn)以下功能:
1. 根據(jù)用戶id查詢一個用戶信息
2. 根據(jù)用戶名稱模糊查詢用戶信息列表
3. 添加用戶
4. 更新用戶
5. 刪除用戶
第一步:創(chuàng)建java工程
使用eclipse創(chuàng)建java工程,jdk使用1.7.0_72。
第二步:加入jar包
加入mybatis核心包、依賴包、數(shù)據(jù)驅(qū)動包。
第三步:log4j.properties
mybatis默認(rèn)使用log4j作為輸出日志信息。
在classpath下創(chuàng)建log4j.properties如下:
第四步:SqlMapConfig.xml
在classpath下創(chuàng)建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事務(wù)管理--><transactionManager type="JDBC" /><!-- 數(shù)據(jù)庫連接池--><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核心配置文件,上邊文件的配置內(nèi)容為數(shù)據(jù)源、事務(wù)管理。
第五步:pojo類
Pojo類作為mybatis進(jìn)行sql映射使用,po類通常與數(shù)據(jù)庫表對應(yīng)(數(shù)據(jù)庫的字段名和屬性名對應(yīng)),User.java如下:
Public class User {private int id;private String address;// 地址private String username;// 用戶姓名private String sex;// 性別private Date birthday;// 生日 get/set……第六步:程序編寫
查詢:(需求1,2的實(shí)現(xiàn))
1.寫映射文件:
在classpath下的sqlmap目錄下創(chuàng)建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//根據(jù)id查詢用戶信息,得到一條記錄結(jié)果public void findUserByIdTest() throws IOException{String resource = "SqlMapConfig.xml";//mybatis配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//得到配置文件流//1.創(chuàng)建會話工廠,傳入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.通過工廠得到SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//3.通過SqlSession操作數(shù)據(jù)庫//第一個參數(shù):映射文件中的statement的id,等于=namespace+"."+statement的id//第二個參數(shù):指定和映射文件所匹配的parameterType類型的參數(shù)//sqlSession.selectOne的結(jié)果是與映射文件中resultType類型的對象所匹配的User user = sqlSession.selectOne("test.findUserById", 1);System.out.println(user);//4.釋放資源sqlSession.close();}@Test//根據(jù)用戶名模糊查詢用戶信息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();}}} }細(xì)節(jié)重點(diǎn)說明:
1.#{}和${}
#{}表示一個占位符號,通過#{}可以實(shí)現(xiàn)preparedStatement向占位符中設(shè)置值,自動進(jìn)行java類型和jdbc類型轉(zhuǎn)換,#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。如果#{}接收的類型是pojo類型時,是使用OGNL讀取對象中的屬性值,通過屬性.屬性.屬性….的方式獲取對象屬性值。
${}表示拼接sql串,通過${}可以將parameterType 傳入的內(nèi)容拼接在sql中且不進(jìn)行jdbc類型轉(zhuǎn)換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。如果${}接收的類型是pojo類型時,是使用OGNL讀取對象中的屬性值,通過屬性.屬性.屬性….的方式獲取對象屬性值。
2.parameterType和resultType
parameterType:指定輸入?yún)?shù)類型,mybatis通過ognl從輸入對象中獲取參數(shù)值拼接在sql中。
resultType:指定輸出結(jié)果類型,mybatis將sql查詢結(jié)果的一行記錄數(shù)據(jù)映射為resultType指定類型的對象。
3.selectOne和selectList
selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則拋出異常:
selectList可以查詢一條或多條記錄。
添加(需求3的實(shí)現(xiàn))
1.映射文件:
<!-- 添加用戶 --> <!-- parameterType:指定輸入?yún)?shù)類型為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);//提交事務(wù)ss.commit();} catch (Exception e) {e.printStackTrace();} finally{if(ss!=null){ss.close();}}}進(jìn)一步說明:
mysql自增主鍵返回:
上邊代碼說明:
- LAST_INSERT_ID():得到剛剛insert進(jìn)去記錄的主鍵值,只適用于自增主鍵
- keyProperty:將查詢到的主鍵值設(shè)置到parameterType指定的對象的那個屬性,這里就是將查詢到的主鍵值設(shè)置到了User對象的id屬性中
- order:表示的是select LAST_INSERT_ID()語句相對于insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})語句的執(zhí)行順序
mysql使用uuid實(shí)現(xiàn)主鍵和返回主鍵:
<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>上面代碼的說明:
執(zhí)行過程:首先通過uuid()得到主鍵,將主鍵設(shè)置到user對象的id屬性中,然后在insert執(zhí)行時,從user對象中取出id屬性值。因此order=”before”
oracle序列生成主鍵和返回主鍵:
首先自定義一個序列且用于生成主鍵,然后:
上面代碼的說明:
執(zhí)行過程與上面的mysql使用uuid()的執(zhí)行過程相同,因此也是order=”before”
刪除(需求5的實(shí)現(xiàn)):
1.映射文件:
<!-- 刪除用戶 --> <!-- 根據(jù)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的實(shí)現(xiàn)):
1.映射文件:
<!-- 更新用戶 --> <!-- 根據(jù)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();}}}總結(jié)
以上是生活随笔為你收集整理的入门demo---Mybatis学习笔记(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis框架总体说明---Myba
- 下一篇: mybatis和hibernate的区别