日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

利用Mybatis对数据库进行增删改查操作

發(fā)布時間:2024/8/23 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用Mybatis对数据库进行增删改查操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • mybatis模糊查找
    • 先來了解一下 #{}和${}的使用
    • parameterType和resultType的使用
    • selectOne和selectList的使用
    • mysql自增主鍵返回
      • 方法一:mysql的函數(shù)函數(shù)返回
    • 方法二:定義useGeneratedKeys為true返回
    • Mysql使用 uuid實(shí)現(xiàn)主鍵
    • 看到UUID和自增長的id想必大家想了解它們的區(qū)別?
      • 增刪改查操作
        • 目標(biāo)對象:
        • xml數(shù)據(jù)源配置
        • mybatis xml映射文件配置
        • 測試類

mybatis模糊查找

先來了解一下 #{}和${}的使用

#{}表示一個占位符號,通過#{}可以實(shí)現(xiàn)preparedStatement向占位符中設(shè)置值,自動進(jìn)行java類型和jdbc類型轉(zhuǎn)換。#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。#{}默認(rèn)加單引號

${}表示拼接sql串,通過${}可以將parameterType 傳入的內(nèi)容拼接在sql中且不進(jìn)行jdbc類型轉(zhuǎn)換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value**。${}默認(rèn)不加單引號

1.查詢sql:

SELECT * FROM `user` WHERE username LIKE '%王%'

2.在User.xml配置文件中添加如下內(nèi)容:

<!-- 如果傳入的參數(shù)是簡單數(shù)據(jù)類型,${}里面必須寫value --><select id="queryUserByUsername2" parameterType="string"resultType="cn.itcast.mybatis.pojo.User">SELECT * FROM `user` WHERE username LIKE '%${value}%'</select>
  • 測試程序
    MybatisTest中添加測試方法如下:
  • @Test public void testQueryUserByUsername2() throws Exception {// 4. 創(chuàng)建SqlSession對象SqlSession sqlSession = sqlSessionFactory.openSession();// 5. 執(zhí)行SqlSession對象執(zhí)行查詢,獲取結(jié)果User// 查詢多條數(shù)據(jù)使用selectList方法List<Object> list = sqlSession.selectList("queryUserByUsername2", "王");// 6. 打印結(jié)果for (Object user : list) {System.out.println(user);}// 7. 釋放資源sqlSession.close(); }

    parameterType和resultType的使用

    parameterType:

    指定輸入?yún)?shù)類型,mybatis通過ognl從輸入對象中獲取參數(shù)值拼接在sql中。

    resultType:

    指定輸出結(jié)果類型,mybatis將sql查詢結(jié)果的一行記錄數(shù)據(jù)映射為resultType指定類型的對象。如果有多條數(shù)據(jù),則分別進(jìn)行映射,并把對象放到容器List中

    selectOne和selectList的使用

    selectOne:查詢一條記錄

    User user = openSession.selectOne("queryUserById", 1);

    selectList可以查詢一條或多條記錄。

    List<User> user = openSession.selectList("queryUserByName", "hexiang");

    記住:查詢操作openSession不需要提交事務(wù),而如果是增刪改需要openSession.commit()來提交事務(wù)

    mysql自增主鍵返回

    方法一:mysql的函數(shù)函數(shù)返回

    LAST_INSERT_ID():是mysql的函數(shù),返回auto_increment自增列新記錄id值。

    <!-- 保存用戶 --> <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User"><!-- selectKey 標(biāo)簽實(shí)現(xiàn)主鍵返回 --><!-- keyColumn:主鍵對應(yīng)的表中的哪一列 --><!-- keyProperty:主鍵對應(yīng)的pojo中的哪一個屬性 --><!-- order:設(shè)置在執(zhí)行insert語句前執(zhí)行查詢id的sql,孩紙在執(zhí)行insert語句之后執(zhí)行查詢id的sql --><!-- resultType:設(shè)置返回的id的類型 --><selectKey keyColumn="id" keyProperty="id" order="AFTER"resultType="int">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO `user`(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>

    方法二:定義useGeneratedKeys為true返回

    <!-- 插入數(shù)據(jù):返回記錄主鍵id值 --> <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">insert into stu (name,age) values (#{name},#{age}) </insert>

    獲取新添加記錄主鍵字段值

    Integer rows = sqlSession.getMapper(StuMapper.class).insertOneTest(student); System.out.println("rows = " + rows); // 添加操作返回記錄數(shù) System.out.println("id = " + student.getId()); // 執(zhí)行添加操作之后通過Java對象獲取主鍵屬性值

    推薦用方式二

    Mysql使用 uuid實(shí)現(xiàn)主鍵

    需要增加通過select uuid()得到uuid值,注意這里使用的order是“BEFORE”

    <!-- 保存用戶 --> <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User"><!-- selectKey 標(biāo)簽實(shí)現(xiàn)主鍵返回 --><!-- keyColumn:主鍵對應(yīng)的表中的哪一列 --><!-- keyProperty:主鍵對應(yīng)的pojo中的哪一個屬性 --><!-- order:設(shè)置在執(zhí)行insert語句前執(zhí)行查詢id的sql,孩紙在執(zhí)行insert語句之后執(zhí)行查詢id的sql --><!-- resultType:設(shè)置返回的id的類型 --><selectKey keyColumn="id" keyProperty="id" order="BEFORE"resultType="string">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO `user`(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>

    看到UUID和自增長的id想必大家想了解它們的區(qū)別?

    uuid是按照字符型存儲(可以用string類型),正常自增長用的id是int類型占四個字節(jié),當(dāng)數(shù)據(jù)量非常大的時候就可以提現(xiàn)出id和uuid之間的區(qū)別,假設(shè)用500萬個數(shù)據(jù)來模擬的話,id可以相對uuid節(jié)省2.5G空間,詳細(xì)區(qū)別,可以問度娘.

    增刪改查操作

    新建的項目中的列表用到的文件是User.java(目標(biāo)對象)、TestDemo1.java(測試類)、SqlMapConfig.xml(數(shù)據(jù)庫連接池配置)、User.xml(數(shù)據(jù)庫增刪查改配置)、jdbc.properties(配置信息:賬戶密碼等)、log4j.properties(控制臺打印日志):

    目標(biāo)對象:

    User.java

    package com.firtDay.sqlMapconFig;import java.io.Serializable;public class User implements Serializable {@Overridepublic String toString() {return "User [_name=" + _name + ", _money=" + _money + "]";}private Integer id;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}private String _name;private int _money;public String get_name() {return _name;}public void set_name(String _name) {this._name = _name;}public int get_money() {return _money;}public void set_money(int _money) {this._money = _money;}}

    xml數(shù)據(jù)源配置

    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> <properties resource="jdbc.properties"></properties> <typeAliases> <!-- 給User類取別名 --><!-- <typeAlias type="com.firtDay.sqlMapconFig.User" alias="User"/> --><!-- 取別名以及其子包下所有類的別名,避免多個類都需要配置代碼太多,利用包默認(rèn)取包下類中所定義的名字 --><package name="com.firtDay.sqlMapconFig"/> </typeAliases><!-- 和spring整合后 environments配置將廢除 --><environments default="development"><environment id="development"><!-- 使用jdbc事務(wù)管理 --><transactionManager type="JDBC" /><!-- 數(shù)據(jù)庫連接池 --><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url"value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></dataSource></environment></environments><!-- 加載映射文件的時候用到 --><mappers><!-- <mapper class="com.mapper.mapper"/> 使用這種方式加載mapper.xml必須把該xml文件放在mapper包下才能并且與mapper類名相同加載出來 。<package name=""/>package同理,用分最多的是package避免配置多個麻煩--><mapper resource="User.xml"/><mapper resource="mapper.xml"/> <!-- <package name="com.mapper"/> package用法,只需要把xml文件放在該mapper包下就會被掃描到,名稱沒有要求--></mappers> </configuration>

    mybatis xml映射文件配置

    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,因?yàn)槎鄠€數(shù)據(jù)庫都會用到queryUserById方法因此為了區(qū)分我們所調(diào)用的是哪個數(shù)據(jù)庫中方法,因此設(shè)置名稱空間來區(qū)別開來,調(diào)用方式:test.queryUserById。 --> <mapper namespace="test"><!-- id="方法名" parameterType="參數(shù)類型" --><select id="queryUserById" parameterType="Integer"resultType="com.firtDay.sqlMapconFig.User">SELECT * FROM `t_user` WHERE id = #{id}</select><!-- like "%"#{v}"%"防SQL注入、默認(rèn)不會自動添加單引號 '${value}'相反 --><select id="queryUserByName" parameterType="String"resultType="com.firtDay.sqlMapconFig.User">SELECT * FROM `t_user` WHERE _name like '%${value}%'</select><!-- 添加用戶 --><insert id="addUser" parameterType="com.firtDay.sqlMapconFig.User"><!-- 獲取主鍵 keyProperty="對應(yīng)的主鍵的對象",resultType="主鍵數(shù)據(jù)類型",order="after:表示在下面insert語句后面執(zhí)行,在mysql中是先插入再生成主鍵而Oracle中是先出主鍵在插入值因此用before"--><selectKey keyProperty="id" resultType="Integer" order="AFTER">select LAST_INSERT_ID()</selectKey>INSERT INTO t_user(_name,_money) values (#{_name},#{_money})</insert><update id="updateUser" parameterType="com.firtDay.sqlMapconFig.User">UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}</update><delete id="deleteUserById" parameterType="Integer">delete from t_user where id = #{id} </delete> </mapper>

    測試類

    TestDemo1.java

    package com.test;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.Before; import org.junit.Test;import com.firtDay.sqlMapconFig.User;public class TestDemo1 {private SqlSessionFactory sqlSessionFactory=null;@Beforepublic void testDemo() throws Exception{// 1. 創(chuàng)建SqlSessionFactoryBuilder對象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();String url="SqlMapConfig.xml";InputStream resource = Resources.getResourceAsStream(url);this.sqlSessionFactory = sqlSessionFactoryBuilder.build(resource);}@Testpublic void testDemo2(){SqlSession openSession = sqlSessionFactory.openSession();User user = openSession.selectOne("queryUserById", 1);System.out.println(user);openSession.close();}@Testpublic void testDemo3(){SqlSession openSession = sqlSessionFactory.openSession();List<User> user = openSession.selectList("queryUserByName", "hexiang");for (User user2 : user) {System.out.println(user2);}openSession.close();} @Testpublic void testDemo4(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();user.set_name("hha");user.set_money(1000);int insert = openSession.insert("addUser", user);//返回值為影響的行數(shù)System.out.println(insert);openSession.commit();//需要提交事務(wù)System.out.println("id:"+user.getId());openSession.close();}//更新數(shù)據(jù)@Testpublic void testDemo5(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();user.setId(9);user.set_name("111xxxoooo");user.set_money(1000);int update = openSession.update("updateUser", user);openSession.commit();openSession.close();}//刪除數(shù)據(jù) @Testpublic void testDemo6(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();openSession.update("deleteUserById", 9);openSession.commit();openSession.close();} }

    總結(jié)

    以上是生活随笔為你收集整理的利用Mybatis对数据库进行增删改查操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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