1. 程式人生 > >Mybatis原始的dao開發

Mybatis原始的dao開發

首先給出直接通過傳統的JDBC訪問資料庫例項

import java.sql.*;

/**
 * Created by hsc on 16/8/27.
 */
public class JdbcTest {
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static String userName = "test"; //連線資料庫使用者名稱
    private static String password = "test123";//連線資料庫的密碼
    private static String connectionUrl = "jdbc:mysql://IP地址:埠/資料庫名";


    public static void queryTest(String sql, Object[] params){

        //資料庫的連線
        Connection connection = null;
        ResultSet resultSet = null;
        //預編譯的Statement 向資料庫傳送sql語句,資料庫那邊進行編譯,資料那邊將編譯結果存放在快取
        PreparedStatement preparedStatement = null;

        try {

            Class.forName(JdbcTest.DRIVER);
            connection = DriverManager.getConnection(connectionUrl, userName, password);
            preparedStatement = connection.prepareStatement(sql);
            // 引數賦值,向佔位符中填充資料
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    preparedStatement.setObject(i + 1, params[i]);
                }
            }

            resultSet = preparedStatement.executeQuery();

            //遍歷查詢結果集
            while (resultSet.next()) {
                System.out.println(resultSet.getString(1));
            }

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            //釋放資源
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {

                    System.out.println(e.getMessage());
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String args[]) {
        //問號表示佔位符
        String querySql = "select * from st_didinfo limit ?";
        Object[] objects = new Object[1];
        objects[0] = 5;
        queryTest(querySql, objects);

    }
}





從上面的程式不難發現有以下問題

1.使用時候建立,不使用的時候立即釋放,對資料庫進行頻繁的連線和開啟,造成了資料庫資源的浪費,影響資料庫的效能

2.將sql語句硬編碼()到java程式碼中,如果sql語句修改,需要重新編譯java程式碼,不利於系統的維護

設想:如果能將sql語句配置在檔案中,即使sql變化了,也不需要對java程式碼進行重新編譯。

3.向PreparedStatement設定引數,對佔位符把控設定和設定引數值,硬編碼在java中利於系統的維護

4.從resultSet中遍歷資料結果時候,存在硬編碼,將表字段進行硬編碼,不利於系統維護

Mybatis是持久層框架,是和資料庫打交道的框架,

讓程式設計師主要精力放在sql上,通過mybaits提供對映方式,自由靈活生成滿足需要的sql語句。

mybaits 可以將PreparedStatement中輸入引數自動進行輸入對映,將查詢結果集靈活的對映成java物件(輸出物件)

mybatis開發dao兩種方法

1.原始的dao開發(程式需要編寫dao介面和dao實現類)

2.mybatis的mapper介面(相當於到介面)代理開發方法

原始的dao開發:

流程圖


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="db.properties">

		<!--properties中還可以配置一些屬性名和屬性值  正常測試和異常測試
		 -->
		<!-- <property name="jdbc.driver" value=""/>  在元素體內首先讀取的,然後會讀取resource 或者url載入的屬性,他會覆蓋-->

	</properties>
	<!-- 全域性配置引數,需要時再設定 可能需要調整一些比如開啟二級快取,延遲載入  -->
	<!-- <settings>
	
	</settings> -->
	
	<!-- 別名定義 -->
	<typeAliases>
		
		<!-- 針對單個別名定義
		type:型別的路徑
		alias:別名
		方便後面sql輸入輸出對映的使用
		 -->
		<!-- <typeAlias type="com.mybatis.pojo.UserInfo" alias="userInfo"/> -->
		<!-- 批量別名定義 
		指定包名,mybatis自動掃描包中的po類,自動定義別名,別名就是類名(首字母大寫或小寫都可以)

		-->
		<package name="com.mybatis.pojo"/>
		
	</typeAliases>
	<!--TypeHandler 型別處理器 java型別到JDBC型別轉換-->
	
	<!-- 和spring整合後 environments配置將廢除-->
	<environments default="development">
		<environment id="development">
		<!-- 使用jdbc事務管理,事務控制由mybatis-->
			<transactionManager type="JDBC" />
		<!-- 資料庫連線池,由mybatis管理-->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 載入 對映檔案 -->
	<mappers>

		<mapper resource="sqlmap/UserInfo.xml"/>

	</mappers>
	
</configuration>

UserInfo.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進行分類化管理,理解sql隔離 
注意:使用mapper代理方法開發,namespace有特殊重要的作用
ORM java 物件和關係(資料庫的)進行對映

-->
<mapper namespace="test">


    <!--id是一個標識,用於開發程式使用  將sql語句封裝到mappedStatement物件中,所以將id稱為statement的id-->
    <!--#{}表示一個佔位符號-->
    <!--#{id}:其中的id表示接收輸入 的引數,引數名稱就是id,如果輸入 引數是簡單型別,#{}中的引數名可以任意,可以value或其它名稱-->

    <!--resultType:指定sql輸出結果 的所對映的java物件型別,select指定resultType表示將單條記錄對映成的java物件。-->
    <select id="findUserInfoById" parameterType="java.lang.Integer" resultType="com.mybatis.pojo.UserInfo">
		SELECT * FROM UserInfo WHERE id=#{value}
	</select>

    <!-- 根據使用者名稱稱模糊查詢使用者資訊,可能返回多條
    resultType:指定就是單條記錄所對映的java物件 型別
    ${}:表示拼接sql串,將接收到引數的內容不加任何修飾拼接在sql中。
    使用${}拼接sql,引起 sql注入
    ${value}:接收輸入 引數的內容,如果傳入型別是簡單型別,${}中只能使用value
     -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.mybatis.pojo.UserInfo">
		SELECT * FROM UserInfo WHERE userName LIKE '%${value}%'
	</select>

    <!-- 新增使用者
    parameterType:指定輸入 引數型別是pojo(包括 使用者資訊)
    #{}中指定pojo的屬性名,接收到pojo物件的屬性值,mybatis通過OGNL獲取物件的屬性值
    -->
    <insert id="insertUserInfo" parameterType="com.mybatis.pojo.UserInfo">
        <!--

        將插入資料的主鍵返回,返回到user物件中

        SELECT LAST_INSERT_ID():得到剛insert進去記錄的主鍵值,只適用與自增主鍵
        keyProperty:將查詢到主鍵值設定到parameterType指定的物件的哪個屬性
        order:SELECT LAST_INSERT_ID()執行順序,相對於insert語句來說它的執行順序
        resultType:指定SELECT LAST_INSERT_ID()的結果型別

         -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>

        insert into UserInfo(userName,age) value(#{userName},#{age})
        <!--
        使用mysql的uuid()生成主鍵
        執行過程:
        首先通過uuid()得到主鍵,將主鍵設定到user物件的id屬性中
        其次在insert執行時,從userInfo物件中取出id屬性值
         -->
        <!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        insert into UserInfo(userName,age) value(#{userName},#{age}) -->


    </insert>

    <!-- 刪除 使用者
    根據id刪除使用者,需要輸入 id值

     -->
    <delete id="deleteUserInfoById" parameterType="int">
		delete from UserInfo where id=#{id}
	</delete>

    <!-- 根據id更新使用者
    分析:
    需要傳入使用者的id
    需要傳入使用者的更新資訊
    parameterType指定userInfo物件,包括 id和更新資訊,注意:id必須存在
    #{id}:從輸入 user物件中獲取id屬性值
     -->
    <update id="updateUserInfo" parameterType="userInfo">
		update UserInfo set userName=#{userName},age=#{age}
		 where id=#{id}
	</update>
    

</mapper>



UserInfoDao 介面類
package com.mybatis.dao;

import com.mybatis.pojo.UserInfo;

import java.util.Map;

/**
 * Created by hsc on 16/9/4.
 */
public interface UserInfoDao {

    public UserInfo findUserInfoById(int id) throws Exception;
    public int inserUserInfo(UserInfo userInfo) throws Exception;
    public int deleteUserInfoById(int id);
    public int updateUserInfo(UserInfo userInfo);
}
UserInfoDao 介面實現類
package com.mybatis.dao.Impl;

import com.mybatis.dao.UserInfoDao;
import com.mybatis.pojo.UserInfo;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.Map;

/**
 * Created by hsc on 16/9/4.
 */
public class UserInfoDaoImpl implements UserInfoDao {

    private SqlSessionFactory sqlSessionFactory;


    public UserInfoDaoImpl(SqlSessionFactory sqlSessionFactory)
    {
        this.sqlSessionFactory=sqlSessionFactory;
    }
    public UserInfo findUserInfoById(int id) throws Exception {

        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserInfo userInfo=  sqlSession.selectOne("test.findUserInfoById",id);
        sqlSession.close();

        return userInfo;

    }

    public int inserUserInfo(UserInfo userInfo) throws Exception {

        SqlSession sqlSession=sqlSessionFactory.openSession();
        int size=  sqlSession.insert("test.insertUserInfo",userInfo);
        sqlSession.commit();//插入要做提交
        sqlSession.close();

        return  size;

    }

    public int deleteUserInfoById(int id) {

        SqlSession sqlSession=sqlSessionFactory.openSession();
        int size=  sqlSession.delete("test.deleteUserInfoById",id);
        sqlSession.commit();//刪除要做提交
        sqlSession.close();

        return  size;
    }

    public int updateUserInfo(UserInfo userInfo) {

        SqlSession sqlSession=sqlSessionFactory.openSession();
        int size=  sqlSession.delete("test.updateUserInfo",userInfo);
        sqlSession.commit();//更新要做提交
        sqlSession.close();

        return size;

    }
}

單元測試類
package com.mybatis.Test;

import com.mybatis.dao.Impl.UserInfoDaoImpl;
import com.mybatis.dao.UserInfoDao;
import com.mybatis.pojo.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;

/**
 * Created by hsc on 16/9/4.
 */
public class UserInfoDaoTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void  initSqlFactory() throws Exception
    {

        String res="SqlMapConfig.xml";
        InputStream in= Resources.getResourceAsStream(res);
        //建立會話工廠
         sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
    }
    @Test
    public void testFindUserInfoById() throws Exception
    {
        UserInfoDao userInfoDao=new UserInfoDaoImpl(sqlSessionFactory);

        UserInfo userInfo=userInfoDao.findUserInfoById(1);
        System.out.println(userInfo.getUserName());
    }

    @Test
    public void testDeleteUserInfoById() throws Exception
    {
        UserInfoDao userInfoDao=new UserInfoDaoImpl(sqlSessionFactory);
        int size=userInfoDao.deleteUserInfoById(1);
        System.out.println(size);

    }

    @Test
    public void testInsertUserInfo() throws Exception
    {
        UserInfoDao userInfoDao=new UserInfoDaoImpl(sqlSessionFactory);
        UserInfo userInfo=new UserInfo();
        userInfo.setAge(18);
        userInfo.setUserName("張大雷");

        int size=userInfoDao.inserUserInfo(userInfo);
        System.out.println(size);
        System.out.println(userInfo.getId());

    }

    @Test
    public void testUpateUserInfo() throws Exception
    {
        UserInfoDao userInfoDao=new UserInfoDaoImpl(sqlSessionFactory);
        UserInfo userInfo=new UserInfo();
        userInfo.setAge(14);
        userInfo.setUserName("陳大雷");
        userInfo.setId(6);
        int size=userInfoDao.updateUserInfo(userInfo);

        System.out.println(size);

    }


}
原始dao開發方法(程式設計師需要寫dao介面和實現類,需要向dao的實現類注入SqlSessionFactory,它是單例,是執行緒安全的
SqlSession 是執行緒不安全的,最佳應用場合是方法體內
總結原始dao開發的問題1.dao 介面實現類中存在大量模板或者重複的程式碼 2.依然存在硬編碼
參考資料:傳智燕青的課堂筆記





相關推薦

Spring+SpringMVC+MyBatis深入學習及搭建(二)——MyBatis原始Dao開發和mapper代理開發

oid 方法註入 內部 需要 com 配置文件信息 lec lang auth 前面有寫到Spring+SpringMVC+MyBatis深入學習及搭建(一)——MyBatis的基礎知識。MybatisFirst中存在大量重復的代碼。這次簡化下代碼: 使用MyBatis開發

【框架整合】spring 和mybatis整合&&整合後mybatis原始dao開發

整合思路 需要spring通過單例方式管理SqlSessionFactory。 spring和mybatis整合生成代理物件,使用SqlSessionFactory建立SqlSession。(spring和mybatis整合自動完成) 持久層的mapper都需要由spr

Mybatis 和Spring整合之原始dao開發

package settings 定義 int inter 實現 frame port tor F:\Aziliao\mybatis\代碼\31.mybatis與spring整合-開發原始dao 1.1. SqlMapConfig.xml <?xml version

【轉】Mybatis學習---MyBatis知識、原始Dao開發和mapper代理開發

結果集 檢索 cat 用戶 隔離 pst 定義 otl oom 【原文】https://www.toutiao.com/i6594610137560777223/ 一、什麽是MyBatis MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。

mybatis入門之原始dao開發與mapper代理開發

前言: 相信很多朋友和筆者一樣,在開始學習mybatis的時候,看完一遍mybatis相關知識,並沒有記住多少,理解深刻就更談不上,渴求一個簡單的demo來測試一下自己到底瞭解多少,掌握多少以及mybatis到底是怎麼玩的,那麼機會來了,筆者將自己之前學習過程中練習的demo重新整理了下,並記錄

MyBatis開發Dao原始Dao開發和Mapper動態代理開發

目錄 咳咳...初學者看文字(Mapper介面開發四個規範)屬實有點費勁,博主我就廢了點勁做了如下圖,方便理解: 原始Dao開發方式 1. 編寫對映檔案 3.編寫Dao實現類 4.編寫Dao測

java-mybaits-00202-DAO-原始DAO開發方法

click ring res ide print dao spa 變量 source 原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。 原本的ibatis的 需要在dao實現類中註入一個SqlSessionFactory工廠。 1.思路

MyBatisDao開發模式

獲取 創建 package exce bat name interface 1.0 構造 MyBatis的Dao開發模式,先來一個例子 1.User.java 實體類以及 SqlMapConfig.xml配置文件 ,見上一篇文章 2.UserDao.java接口 1 p

Mybatis入門---dao開發和mapper代理開發

不能 模糊查詢 stream 根據id獲取 java代碼 tid aps 維護 nal 在說mabatis之前,先說說單獨使用jdbc編程的缺陷。 jdbc編程的大概流程大家都很清楚,基本分為以下幾步: 加載數據驅動 創建並獲取數據庫連接 創建jdbc statement

使用mybatis開發原始Dao

  本文將介紹使用框架mybatis開發原始Dao層來對一個對資料庫進行增刪改查的案例。   本次使用的mybatis版本為mybatis-3.2.7,開發工具為eclipse,資料庫為mysql,jdk版本jdk1.8.0_151。   1、首先,使用eclipse新建一個java工程,在lib目錄下加

Mybatis原始dao開發

首先給出直接通過傳統的JDBC訪問資料庫例項 import java.sql.*; /** * Created by hsc on 16/8/27. */ public class JdbcTest { private static final String

mybatis開發原始dao的方式

1定義介面UserDao package cn.itcast.dao; import java.util.List; import cn.itcast.po.User; public interface UserDao { //根據使用者ID查詢使用者資訊

mybatis(7)--使用mapper代理開發代替原始dao開發

在原始的dao中我們發現了很多問題,而mapper代理開發則會幫我們解決這些問題。 具體思路: 1.需要編寫對映檔案mapper.xml 2.使用mapper介面來代替dao介面 3.mybatis會自動實現mapper介面的代理類物件 how? m

mybatis--開發Dao--原始dao方式和Mapper代理方式

它的作用只是通過配置檔案建立SqlSessionFactory,所以只要創建出SqlSessionFactory,它就可以銷燬了。 所以說,它的生命週期是在方法之內。  SqlSessionFactory 它的作用是建立SqlSession的工廠,工廠一旦建立,除非應用停掉,不要銷燬。 所以說它的生命週期是

02.MyBatisDAO開發使用的Mapper動態代理方式

.get div 技術 before nco mes session list http   在實際開發中,Mybatis作用於DAO層,那麽Service層該如何調用Mybatis   Mybatis鼓勵使用Mapper動態代理的方式   Mapper接口開發方法只需要程

基於MybatisDao開發

dtd row apc clas unit 打開 自己的 oid 1.0 轉自:https://www.cnblogs.com/rodge-run/p/6528398.html 基於Mybatis的Dao層開發   SqlSessionFactoryBuilder用於創建

mybatis---Dao開發模式

UserDao介面: package com.it.mybaties.dao; import com.it.mybaties.pojo.User; public interface UserDao { public User selectUser(Integer id); } Use

javaEE MybatisMybatis與Spring整合之傳統Dao開發(不推薦)。SqlSessionDaoSupport(Mybatis提供的Dao層基類)

src/applicationContext.xml(Spring核心配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or

Mybatis一之開發dao的方法詳述

mybatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀的持久層的框架,是apache下的頂級專案。mybatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。mybatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO對映成資料庫中的記錄。

mybatis傳統方式開發DAO

SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "ht