• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • mybatis框架入門

    1.mybatis框架入門

    1.1 mybatis框架的認識:

    Java的持久層框架
    ?
    它是ORM(對象關系映射)的框架

    Mybatis是一個支撐框架,它以映射sql語句orm方式來數據庫持久化操作.

    1.2 mybatis的特點(與jdbc相比)

    jdbc:

    重復性代碼比較多

    封裝對象 insert(User user) select 比較麻煩

    沒有性能控制 如果要提高效率 需要自己寫緩存 一級緩存 二級緩存 EntityManagerFactory(配置才能使用)

    mybatis 特點:

    沒有太多重復代碼

    封裝對象(不用手動處理參數) -->select User對象

    性能控制 緩存

    (把sql從代碼抽取出來)sql統一管理,維護比較方便

    企業90%都在使用mybatis – 大型項目在使用

    2.使用mybatis

    2.1 導包

    導入mybatis相關包和日志相關包
    在這里插入圖片描述

    2.2 配置MyBatis-Config.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>
        <!--引入jdbc.propeties文件-->
        <properties resource="jdbc.properties" />
        <!-- 環境們 (很多環境的意思)
            default:默認使用哪一個環境(必需對應一個環境的id)
         -->
        <environments default="development">
            <!--
                一個環境  id:為這個環境取唯一一個id名稱
            -->
             <environment id="development">
                <!--
                    事務管理   type:JDBC(支持事務)/MANAGED(什么都不做)
                -->
                <transactionManager type="JDBC" />
                <!-- 數據源, 連接池  type(POOLED):MyBatis自帶的連接池 -->
                <dataSource type="POOLED">
                    <!-- 連接數據庫的參數 -->
                    <property name="driver" value="${jdbc.driverClassName}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
        <!-- 這個mappers代表的是相應的ORM映射文件 -->
        <mappers>
            <mapper resource="cn/hr/domain/UserMapper.xml" />
        </mappers>
    </configuration>
    

    2.3 配置jdbc.properties文件

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///mybatis
    jdbc.username=root
    jdbc.password=****
    

    2.4 數據庫自行建表不要忘記!!!

    3.mybatis完成簡單的crud

    3.1 創建domain

    public class User {
    
        private Long id;
        private String name;
    
    

    3.2 在domain包下配置UserMapper.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">
    <!-- orm框架 sql的映射
    namespace:命名空間  namespace路徑+ id值
              namespace怎么配置 包名.接口名 + queryAll
              parameterType:參數類型
    -->
    <mapper namespace="cn.hr.dao.IUserDao">
        <!-- 查詢 queryAll()
            resultType 返回類型
        -->
        <select id="queryAll" resultType="cn.hr.domain.User">
            select * from t_user
        </select>
        <!-- java.lang.Long mybatis內置別名-->
        <select id="queryOne" parameterType="long" resultType="cn.hr.domain.User">
            select * from t_user where id=#{id}
        </select>
    
        <!-- 新增 name-->
        <insert id="save" parameterType="cn.hr.domain.User">
            insert into t_user(name) values(#{name})
        </insert>
    
        <!-- 修改-->
        <update id="update" parameterType="cn.hr.domain.User">
            update t_user set name=#{name} where id=#{id}
        </update>
    
        <!-- 刪除-->
        <delete id="delete" parameterType="long">
            delete from t_user where id=#{id}
        </delete>
    

    3.3 創建dao daoimpl

    public interface IUserDao {
        void save(User user) throws IOException;
        void update(User user) throws IOException;
        void delete(Long id) throws IOException;
        User queryOne(Long id) throws IOException;
        List<User> queryAll() throws IOException;
    }
    
     @Override
        public User queryOne(Long id) throws IOException {
            //調用mapper.xml的select方法
            Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
            //得到SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            //通過sqlSessionFactory得到sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //調用方法 namespace+id
            User user = sqlSession.selectOne("cn.hr.dao.IUserDao.queryOne", id);
            return user;
        }
        @Override
        public void save(User user) throws IOException {
            //調用mapper.xml的select方法
            Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
            //得到SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            //通過sqlSessionFactory得到sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //調用方法 namespace+id
           sqlSession.insert("cn.hr.dao.IUserDao.save", user);
           //提交
            sqlSession.commit();
        }
    
        @Override
        public void update(User user) throws IOException {
            //事務
            //調用mapper.xml的select方法
            Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
            //得到SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            //通過sqlSessionFactory得到sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //調用方法 namespace+id
            sqlSession.update("cn.hr.dao.IUserDao.update", user);
            sqlSession.commit();
        }
    
        @Override
        public void delete(Long id) throws IOException {
            //事務
            //調用mapper.xml的select方法
            Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
            //得到SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    
            //通過sqlSessionFactory得到sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //調用方法 namespace+id
            sqlSession.delete("cn.hr.dao.IUserDao.delete", id);
            sqlSession.commit();
        }
    

    3.4 由于重復代碼太多 抽取公共代碼

    public enum MyBatisUtils {
        INSTANCE;
        private static SqlSessionFactory sqlSessionFactory;
        static{
            Reader reader = null;
            try {
                //讀取配置文件
                reader = Resources.getResourceAsReader("MyBatis-Config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                //打印堆棧信息
                e.printStackTrace();
                throw new RuntimeException("解析配置文件出問題"+e.getMessage());
            }
        }
        //寫方法
        public SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    }
    

    3.4 調用工具類方法

     @Override
        public List<User> queryAll() throws IOException {
            SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession();
            //調用方法 namespace+id
            List<User> users = sqlSession.selectList("cn.hr.dao.IUserDao.queryAll");
            return users;
        }
    

    4.1 測試

    在這里就不測了~~~~

    5 mybatis細節點

    5.1 主鍵

    如何在能操作時拿到我們的主鍵,并打印在控制臺
    在UserMapper.xml中加入配置

        <!--  
        useGeneratedKeys:使用主鍵
        keyColumn:數據庫id列
        keyProperty:程序里面User類的屬性
        -->
    <insert id="save" parameterType="cn.hr.domain.User"
                useGeneratedKeys="true" keyColumn="id" keyProperty="id">
            insert into t_user(name) values(#{name})
        </insert>
    

    5.2 日志

    配置 log4j.properties

    參數可自行修改 不會請百度

    # 日志輸出級別 輸出到控制  
    log4j.rootLogger=ERROR, stdout
    #log4j.rootLogger=NONE
    log4j.logger.cn.hr=TRACE
    # 輸出到控制臺的配置信息
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    # 輸出到控制臺的 格式類
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    

    5.3 別名

    5.3.1 內置別名 (見圖)

    在這里插入圖片描述

    5.3.2 自定義別名(在MyBatis-Config.xml中配置)
    <typeAliases>
           <!-- 配置單獨類
             <typeAlias type="cn.hr.domain.User" alias="user"></typeAlias>
           -->
           <!--配置包 項目,添加了包之后,類名就是別名-->
           <package name="cn.hr.domain"></package>
        </typeAliases>
    

    測試使用別名

    //別名前的保存方法
     <insert id="save" parameterType="cn.hr.domain.User">
            insert into t_user(name) values(#{name})
        </insert>
    //別名后的保存方法
    <select id="queryOne" parameterType="long" resultType="User">
            select * from t_user where id=#{id}
        </select>
    
    5.3.3 #和$的區別

    (1) $ {id} 找的類參數類的里面 getId這個方法,如果有 就不會報錯,沒有就會報錯

    (2) # 占位符,$ 拼接字符串形式 – 比較重要點

    userMapper.xml
    update t_user set name=${name} where id=#{id}
    生成語句
    update t_user set name=小秋秋 where id=?

    $ 拼接字符串方式 --Statement --存在sql注入問題

    `# 占位符 – PreparedStatement

    (3) 平時使用比較多還是 #{id}

    (4) $一般使用在limit+orderby上面 其他情況下 就是使用#

    6 批量操作(修改UserMapper.xml)

    6.1 批量刪除(與批量修改差不多)

     <delete id="deleteBatch" parameterType="list">
            delete from t_user where id in
            <foreach collection="list" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </delete>
    

    6.2 批量新增

    <insert id="saveBatch" parameterType="list">
            insert into t_user(name) values
            <foreach collection="list" item="user"  separator="," >
                (#{user.name})
            </foreach>
    
        </insert>
    

    7 mybatis動態修改(修改UserMapper.xml)

    <sql id="whereSql">
                <if test="name!=null">
                    and name like #{name}
                </if>
                <if test="age!=null">
                    and age = #{age}
                </if>
        </sql>
        <!--高級查詢方法-->
        <select id="queryList" parameterType="userQuery" resultType="User">
            select * from t_user
            <where>
                <include refid="whereSql"></include>
            </where>
        </select>
    
    版權聲明:本文為qq_45642432原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_45642432/article/details/103260385

    智能推薦

    【SSM框架入門】mybatis環境搭建與入門案例

    1. Maven工程結構 2. mybatis環境搭建 2.1 新建數據庫和表 2.2 新建一個maven工程 2.3 pom.xml導入坐標 2.4 創建實體類和DAO接口 2.5 創建Mybatis的主配置文件——SqlMapConfig.xml 2.6 創建映射配置文件——IUserDao.xml 環境搭建的注意事項: ①在Mybatis中持久...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    猜你喜歡

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    精品国产乱码久久久久久蜜桃不卡