日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

入门demo---Mybatis学习笔记(三)

發(fā)布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 入门demo---Mybatis学习笔记(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

需求:

實(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如下:

# Global logging configuration #在開發(fā)環(huán)境下日志級別設(shè)置為DEBUG,生產(chǎn)環(huán)境設(shè)置成info或者error# log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

第四步: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:

<?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"> <!-- namespace :命名空間,用于隔離sql語句,后面會講另一層非常重要的作用。 --> <mapper namespace="test"> <!-- 根據(jù)Id獲取用戶信息 ,返回一條數(shù)據(jù)--> <!-- 通過<select>進(jìn)行數(shù)據(jù)庫查詢 id:標(biāo)識映射文件中的sql 將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id parameterType:指定輸入?yún)?shù)的類型 #{}:表示一個占位符 #{id}:其中的id表示接收輸入的參數(shù),參數(shù)的名稱就是id,如果輸入?yún)?shù)為簡單類型,#{}中的參數(shù)名可以任意,可以value也可以其它名稱。 resultType:指定sql輸出結(jié)果的所映射的java對象類型。select指定resultType表示將單條記錄映射成的java對象。--> <select id="findUserById" parameterType="int" resultType="com.huihui.pojo.User">select * from user where id=#{id} </select> <!-- 自定義條件查詢用戶列表,可能返回多條 --> <!-- ${}:表示拼接sql串,將接收到的參數(shù)的內(nèi)容不加任何修飾拼接到sql中。 使用${}拼接sql,可能引起sql注入 ${value}:接收輸入?yún)?shù)的內(nèi)容,如果傳入的類型是簡單類型,${}中只能使用value--> <select id="findUserByUsername" parameterType="java.lang.String" resultType="com.huihui.pojo.User">select * from user where username like '%${value}%' </select> </mapper>

2.加載映射文件
mybatis框架需要加載映射文件,將User.xml添加在SqlMapConfig.xml,如下:

<mappers><mapper resource="sqlmap/User.xml"/> </mappers>

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查詢多條記錄則拋出異常:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

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自增主鍵返回:

<!-- 添加用戶 --> <!-- 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})<!-- selectKey將主鍵返回,需要再返回 --><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select LAST_INSERT_ID()</selectKey> </insert>

上邊代碼說明:

  • 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序列生成主鍵和返回主鍵:
首先自定義一個序列且用于生成主鍵,然后:

<insert id="insertUser" parameterType="com.huihui.pojo.User" > <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">select 自定義序列的名字.Nextval from dual; </selectKey>insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address}) </insert>

上面代碼的說明:
執(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。