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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 入门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如下:

# Global logging configuration #在開發環境下日志級別設置為DEBUG,生產環境設置成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下創建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:

<?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"> <!-- 根據Id獲取用戶信息 ,返回一條數據--> <!-- 通過<select>進行數據庫查詢 id:標識映射文件中的sql 將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id parameterType:指定輸入參數的類型 #{}:表示一個占位符 #{id}:其中的id表示接收輸入的參數,參數的名稱就是id,如果輸入參數為簡單類型,#{}中的參數名可以任意,可以value也可以其它名稱。 resultType:指定sql輸出結果的所映射的java對象類型。select指定resultType表示將單條記錄映射成的java對象。--> <select id="findUserById" parameterType="int" resultType="com.huihui.pojo.User">select * from user where id=#{id} </select> <!-- 自定義條件查詢用戶列表,可能返回多條 --> <!-- ${}:表示拼接sql串,將接收到的參數的內容不加任何修飾拼接到sql中。 使用${}拼接sql,可能引起sql注入 ${value}:接收輸入參數的內容,如果傳入的類型是簡單類型,${}中只能使用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//根據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查詢多條記錄則拋出異常:

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的實現)

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

<!-- 添加用戶 --> <!-- parameterType:指定輸入參數類型為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進去記錄的主鍵值,只適用于自增主鍵
  • 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序列生成主鍵和返回主鍵:
首先自定義一個序列且用于生成主鍵,然后:

<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>

上面代碼的說明:
執行過程與上面的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学习笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。