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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

大数据WEB阶段Mybatis(一)

發(fā)布時間:2024/4/30 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据WEB阶段Mybatis(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Mybatis(一)

零、目錄

  • Mybatis介紹
  • Mybatis入門案例
  • 增刪改查練習(xí)
  • 映射文件中取值問題
  • Mybatis中單值傳遞和多值傳遞問題
  • sql語句的復(fù)用
  • 別名標(biāo)簽
  • 動態(tài)更新
  • 動態(tài)查詢
  • 動態(tài)插入
  • 批量刪除

一、Mybatis介紹

  • Mybatis是一款優(yōu)秀的數(shù)據(jù)持久層框架
  • Mybatis內(nèi)部也是JDBC原理
  • 回顧JDBC缺點:
  • 需要頻繁的開關(guān)數(shù)據(jù)庫連接
  • 查詢的結(jié)果需要手動進(jìn)行封裝
  • JDBC中內(nèi)有緩存機(jī)制
  • SQL語句寫在java代碼中
  • mybatis優(yōu)點:
  • 內(nèi)置數(shù)據(jù)庫連接池
  • 會自動進(jìn)行結(jié)果集封裝
  • 自帶緩存機(jī)制
  • SQL語句寫在配置文件中
  • mybatis工作流程 :
  • 二、 Mybatis入門案例

  • 導(dǎo)入約束文件
  • 如果你的電腦有網(wǎng)就不用導(dǎo)入了 , 在使用時會自動下載
  • 如果你的機(jī)器沒網(wǎng) , 需要手動導(dǎo)入mybatis-3-mapper.dtd文件和mybatis-3-config.dtd文件
  • 注意導(dǎo)入時 , 需要約束文件在不含中文的路徑下 , keyType選擇URI , key填寫如:http://mybatis.org/dtd/mybatis-3-mapper.dtd 。
  • 導(dǎo)入響應(yīng)的jar包
  • 添加配置文件

  • 日志文件log4j.properties , 不需要改動直接復(fù)制即可

    log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
  • mybatis核心配置文件

    <?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> <!-- 為實體類配置別名 --> <typeAliases><typeAlias type="com.tj.pojo.User" alias="User"/> </typeAliases> <!-- 配置數(shù)據(jù)源 --><environments default="mysql"><!-- 設(shè)置默認(rèn)使用的數(shù)據(jù)庫配置 , 可以根據(jù)具體情境隨意切換 --><environment id="mysql"><!-- 配置事務(wù)管理 --><transactionManager type="JDBC" /><!-- 表示支持?jǐn)?shù)據(jù)庫連接池 --><dataSource type="POOLED"><!-- 配置數(shù)據(jù)源 --><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="root" /></dataSource></environment><environment id="oracle"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /><property name="username" value="ht1602" /><property name="password" value="htdb" /></dataSource></environment></environments><!-- 映射文件 --><mappers><!-- 注意配置的映射文件的路徑 , 而不是全類名 --><mapper resource="com/tj/pojo/UserMapper.xml" /></mappers></configuration>
  • 實體類對應(yīng)的映射文件(該文件一般由逆向工程通過數(shù)據(jù)庫配置自動生成實體類和對應(yīng)的映射文件 , 不需要手動寫)

    <?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"> <mapper namespace="UserMapper"><sql id="basefind"> select * from user</sql><select id="findAll" resultType="com.tj.pojo.User" >select * from user;</select><insert id="insert" parameterType="com.tj.pojo.User">insert into user(name , age) values( #{name} , #{age});</insert> <delete id="delete">delete from user where id=#{id};</delete><update id="updaet">update user set name=#{name} , age = #{age} where id=#{id}; </update><!-- 根據(jù)名字查詢 用戶 --><select id="findByName" resultType="User"><include refid="basefind"/>where name = #{name};</select> </mapper>
  • 測試代碼:

    private SqlSession session ; @Before public void init() throws IOException{//獲取一個數(shù)據(jù)流InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");//創(chuàng)建一個工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//創(chuàng)建一個會話session = factory.openSession(true);//true表示自動提交 , 默認(rèn)為false , 需要手動提交 }@Test public void testFindAll() throws IOException{//執(zhí)行sql語句List<User> users = session.selectList("UserMapper.findAll");System.out.println(users.get(0)); }
  • 三、增刪改查練習(xí)

  • 以下案例測試之前先創(chuàng)建會話

    private SqlSession session ;@Beforepublic void init() throws IOException{//獲取一個數(shù)據(jù)流InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");//創(chuàng)建一個工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//創(chuàng)建一個會話session = factory.openSession(true);//true表示自動提交 , 默認(rèn)為false , 需要手動提交}
  • 映射文件中添加:

    <insert id="insert" >insert into user(name , age) values( #{name} , #{age});</insert>
  • 測試:

    @Testpublic void insertUser() {User user = new User();user.setName("李四");user.setAge(20);//執(zhí)行sql語句session.insert("UserMapper.insert", user);//提交增刪改時都需要commit , 可以在opensession時添加參數(shù)為true設(shè)置文 自動提交session.commit();}
  • 映射文件中添加:

    <delete id="delete">delete from user where id=#{id};</delete>
  • 測試:

    @Testpublic void delete() throws IOException{//執(zhí)行sessionsession.delete("UserMapper.delete",3);}
  • 映射文件中添加:

    <update id="update">update user set name=#{name} , age = #{age} where id=#{id}; </update>
  • 測試:

    @Testpublic void updateUser(){//修改之前先獲取到原數(shù)據(jù)User user = new User();user.setId(1);user.setName("張三");user.setAge(19);//對數(shù)據(jù)進(jìn)行修改user.setName("王五");//執(zhí)行數(shù)據(jù)庫更新操作session.update("UserMapper.update", user);}
  • 映射文件中添加:

    <select id="findAll" resultType="com.tj.pojo.User" >select * from user;</select>
  • 測試:

    @Testpublic void testFindAll() throws IOException{//執(zhí)行sql語句List<User> users = session.selectList("UserMapper.findAll");System.out.println(users.get(0));}
  • 四、映射文件中的取值符號

  • #{變量名稱} : 會在與sql語句拼接時自動加上引號, 并且有預(yù)編譯的效果 , 可以防止sql注入攻擊
  • ${變量名稱} : 在于sql語句拼接時不會添加引號 , 直接拼接在sql語句中
  • 使用兩種取值方式的選擇:
  • 絕大多數(shù)情況下使用#{} , 在傳入的值為表的字段(如: order by 使{} , 否則會失效)或者是sql語句的一部分時(如: order by id |使{} , 否則會生效
  • 能使用#{}絕不使用{}?,?不能使用#{}時才使用{} .
  • 五、Mybatis映射文件的多值傳遞和單值傳遞

  • Mybatis中提供的增刪改查方法只支持傳遞一個參數(shù)代表傳入的值

  • 當(dāng)需要傳遞多個 值時, 可以將值放入map中 ;

  • Mapper文件中:

    <select id="finfAllByOrderDesc" resultType="User">select * from user order by ${type} ${paixu};</select>
  • 測試:

    //多值傳遞 查詢所有用戶并按照年齡 降序排列@Test public void findAllOrderByAgeDesc(){Map<String , String > map = new HashMap<String ,String >();map.put("type", "age");map.put("paixu", "desc");List<User> users = session.selectList("UserMapper.finfAllByOrderDesc" , map);for(User user : users){System.out.println(user);}}
  • 當(dāng)傳遞一個值的時候 ,映射文件中取值時可以以任意變量名取值 。

  • Mapper文件中:

    <select id="findByName" resultType="User"><include refid="basefind"/>where name = #{xxxxxx};</select>
  • 測試:

    //單值傳遞 @Test public void findByName(){User user = session.selectOne("UserMapper.findByName", "王五");System.out.println(user); }
  • 六、 sql語句的復(fù)用

  • 聲明一個基本的sql語句 , 以便在后續(xù)的使用時直接調(diào)用
  • 聲明:

    <sql id="basefind"> select * from user</sql>
  • 調(diào)用:

    <select id="finfAllByOrderDesc" resultType="User"><include refid="basefind"/>order by ${type} ${paixu};</select>
  • 七、別名標(biāo)簽

  • 在映射文件中寫resultType或者是paramType時需要寫的是全類名 , 一般xxx.xxx.xxx.xxx.xxx.類名 都會很長 , 很容易寫錯 , 可以指定類別名以簡化書寫
  • 在核心配置文件中配置別名

    <!-- 配置別名 --><typeAliases><typeAlias type="com.tj.pojo.User" alias="User"/></typeAliases>
  • 使用

    <select id="finfAllByOrderDesc" resultType="User"><include refid="basefind"/>order by ${type} ${paixu};</select>
  • 八、 動態(tài)更新

  • 當(dāng)進(jìn)行數(shù)據(jù)庫修改的時候 ,有時只需要修改表中的某幾個字段 , 其他字段保持不變 , 這是就需要用到動態(tài)更新 , 不然會出現(xiàn)其他值為null的問題 。
  • 映射文件中sql語句的修改

    <!-- 動態(tài) 更新 --><select id="dynamicUpdate">update user<set><if test="name != null">name = #{name} , </if><if test="age != null">age = #{age} , </if></set>where id=#{id}</select>
  • 注意: 字段后的“,” , 如果age為空 , set標(biāo)簽會自動把name屬性后的“,”去掉
  • 九、 動態(tài)查詢

  • 查詢需要多個條件 , 但是不一定每一個條件都用的上 , 在數(shù)據(jù)封裝時就會出現(xiàn)null值的情況 , 如果被sql指定勢必會影響到sql 的查詢結(jié)果 , 這是就需要用到動態(tài)查詢 , 不然會出現(xiàn)滿足條件為null的判斷。
  • 映射文件中sql語句的修改

    <!-- 動態(tài)查詢 --><select id="dyniaicselect"><include refid="basefind"/><where><if test="name != null">name = #{name} </if><if test="age != null"> and age = #{age} </if><if test="id != id"> and id = #{id}</if></where> </select>
  • 注意: and加在字段前 , 當(dāng)name字段為null時 , where標(biāo)簽會自動去掉age前的and 。
  • 十、 動態(tài)插入

  • 映射文件中sql語句的修改:

    <!-- 動態(tài)插入--><insert id="dyniamicInsert">insert into user <trim prefix="(" suffix=")" suffixOverrides=","><!-- 設(shè)置前綴后綴 , 并且設(shè)置將拼接后最后的逗號去掉 --><if test="name != null">name </if><if test="age != null"> age </if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><!-- 設(shè)置前綴后綴 , 并且設(shè)置將拼接后最后的逗號去掉 --><if test="name != null">name = #{name} , </if><if test="age != null"> age = #{age} </if></trim></insert>
  • 十一、批量刪除

  • 數(shù)組中存放要刪除元素的id

    <!-- 動態(tài)刪除 --><delete id="dynamicdelete">delete form user where id in<foreach collection="array" item="id" open="(" close=")"<!-- 參數(shù)類型是數(shù)組 設(shè)置前后綴為() , 并且元素之間用“,”拼接 --> separator=",">#{id}</foreach> </delete>
  • 列表中存放要刪除的元素

    <!-- 動態(tài)刪除 --><delete id="dynamicdelete">delete form user where id in<foreach collection="list" item="user" open="(" close=")" separator=",">#{user.id}</foreach> </delete>
  • 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的大数据WEB阶段Mybatis(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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