天天看點

SSM架構複習

ssm架構複習第一天:Mybatis

架構:對重複代碼的封裝,對複雜問題的封裝

架構也是一個半成品的軟體

ssm架構

springMVC(web層的架構) Spring(業務層service層) mybatis(dao層與資料庫打交道)

javaEE三層結構 :web層 service層 dao層

MVC:将你的業務邏輯和前端視圖(view)代碼分離,業務邏輯是業務邏輯,前端視圖是前端視圖。通過控制層(controller)接收前端視圖頁面的請求,控制器幫你接收,然後調用後端(Model)業務邏輯層的代碼幫你處理請求。

以前傳統的JDBC:

1.加載驅動

Class.forname("com.jdbc.mysql.driver")

2.擷取連接配接

DriverManager.getConnection();

3.擷取sql的執行平台(執行sql的對象)通過statement去操作資料庫,執行sql語句

connection.getStatement();

4:定義sql語句

sql="';

5.執行sql語句(如果是查詢操作的話)

6.周遊結果集,封裝結果集

7.釋放連接配接

這些重複的代碼太多了,要把這些重複的代碼封裝起來。123,57是重複的,隻有sql語句的定義和結果集的封裝不一樣,所有隻需要我們去關注sql語句的定義和結果集的封裝了。

架構:對重複代碼的抽取,對複雜問題的封裝

優勢:能夠大大提高開發效率

缺點:使用任何架構都會一定程度上影響運作效率

1.mybatis:mybatis是一個優秀的基于 java 的持久層架構,它内部封裝了 jdbc,使開發者隻需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、建立連接配接、建立 statement 等繁雜的過程。

mybatis通過 xml 或注解的方式将要執行的各種statement配置起來,并通過java對象和statement 中sql 的動态參數進行映射生成最終執行的 sql 語句,最後由 mybatis 架構執行 sql 并将結果映射為 java 對象并傳回。

ORM思想:ORM(object  relation Mapping )對象關系映射,

采用 ORM 思想解決了實體和資料庫映射的問題,對 jdbc進行了封裝,屏蔽了 jdbc api 底層通路細節,使我們不用與 jdbc api 打交道,就可以完成對資料庫的持久化操作。

2.mybatis操作資料庫步驟

 環境搭建

1.導入相關依賴

在pom.xml中導入依賴

<!--    mysql連接配接依賴-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>
<!--    mybatis依賴-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.3</version>
    </dependency>      

2.建立資料庫表和實體類

package com.swlz.domain;

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String name, Integer age, String sex, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}      

3.建立Dao接口

package com.swlz.dao;

import com.swlz.domain.User;

import java.io.IOException;
import java.util.List;

public interface UserDao {
    public List<User> findAll() throws IOException;
    void addUser(User user);
    void updateUser(User user);
    void deleteUser(Integer id);
}      

4. 配置Dao的映射檔案和主配置檔案

<?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="com.swlz.dao.UserDao">
   <select id="findAll" resultType="com.swlz.domain.User">
       select * from user;
   </select>
    <insert id="addUser"  parameterType="com.swlz.domain.User">
        insert into user values(null,#{name},#{age},#{sex},#{address});
    </insert>
    <update id="updateUser" parameterType="com.swlz.domain.User">
        update user set name=#{name},age=#{age},sex=#{sex},address=#{address} where id=#{id};
    </update>
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id};
    </delete>
</mapper>      
<?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.properties jdbc的配置檔案  以後要修改jdbc的配置資訊就在jdbc.properties這個檔案修改就可以了-->
    <properties resource="jdbc.properties"></properties>
    <typeAliases>
        <!--<typeAlias type="com.swlz.domain.User" alias="user"/>-->
        <!--用package指定的包,預設都會起别名,别名就是類名-->
        <package name="com.swlz.domain"></package>
    </typeAliases>
    <!--環境資訊-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <!--資料庫連接配接池-->
            <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="UserDaoMapper.xml"></mapper>
<!--        <package name="com.swlz.dao"></package>-->
    </mappers>
</configuration>      
jdbc.url=jdbc:mysql://localhost:3306/資料庫名
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=資料庫密碼      

5,.基本使用

package com.swlz.dao.impl;

import com.swlz.dao.UserDao;
import com.swlz.domain.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserDaoImpl implements UserDao {
    public List<User> findAll() {
        try {
//            1.加載主配置檔案  這個底層是通過類加載器  getResource()   ClassLoader類加載器  把主配置檔案方法類路徑資源下面裡面
            //通過類加載器加載類路徑資源下的配置檔案 得到配置檔案中的資訊 讀出來
            InputStream is = Resources.getResourceAsStream("mybatis.xml");//裡面放的是主配置檔案
            // Statement對象主要是将SQL語句發送到資料庫中  幫我們執行sql語句傳回結果集(封裝結果集對象的)
            //  2.建立SqlSessionFactory對象工廠對象connection
            //  根據主配置檔案資訊建構SqlSessionFactory對象 這個對象在建立的時候需要去解析主配置檔案
            //  主配置檔案中配置了映射配置檔案,它也會幫我們去解析映射配置檔案 将映射配置檔案中的各種statement建立出來
            //是以sqlSessionFactory是一個重量級對象,因為它要幫我們建立連接配接池又要幫我們加載配置檔案 對象建立時候需要消耗系統資源
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠類建立sqlsession對象 這個對象才是用來真正操作資料庫的  相當于JDBC中connection,statement對象
            SqlSession sqlSession = sqlSessionFactory.openSession();//操作資料庫的
            //調用相應方法 通過sqlsession去執行配置的statement  namespace+id确定唯一statement
            List<User> list = sqlSession.selectList("com.swlz.dao.UserDao.findAll", User.class);//傳回User類型的資料
            //釋放資源
            sqlSession.close();
            is.close();
            return list;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void addUser(User user) {
        try {
            //       1.加載主配置檔案
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
              //2.擷取SqlSessionFactory工廠對象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
//            3.擷取操作資料庫的對對象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //4.調用方法
            int insert = sqlSession.insert("com.swlz.dao.UserDao.addUser", user);//參數傳進去
            sqlSession.commit();//手動送出  執行增删改操作的時候會自動開啟事務 需要手動送出執行sql語句才能通過

            is.close();
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void updateUser(User user) {
        try {
//            1.加載主配置檔案  這個底層是通過類加載器  getResource()   ClassLoader類加載器  把主配置檔案方法類路徑資源下面裡面
            //通過類加載器加載類路徑資源下的配置檔案 得到配置檔案中的資訊 讀出來
            InputStream is = Resources.getResourceAsStream("mybatis.xml");//裡面放的是主配置檔案
            // Statement對象主要是将SQL語句發送到資料庫中  幫我們執行sql語句傳回結果集(封裝結果集對象的)
            //  2.建立SqlSessionFactory對象工廠對象connection
            //  根據主配置檔案資訊建構SqlSessionFactory對象 這個對象在建立的時候需要去解析主配置檔案
            //  主配置檔案中配置了映射配置檔案,它也會幫我們去解析映射配置檔案 将映射配置檔案中的各種statement建立出來
            //是以sqlSessionFactory是一個重量級對象,因為它要幫我們建立連接配接池又要幫我們加載配置檔案 對象建立時候需要消耗系統資源
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠類建立sqlsession對象 這個對象才是用來真正操作資料庫的  相當于JDBC中connection,statement對象
            SqlSession sqlSession = sqlSessionFactory.openSession();//操作資料庫的
            //調用相應方法 通過sqlsession去執行配置的statement  namespace+id确定唯一statement
            int update = sqlSession.update("com.swlz.dao.UserDao.updateUser", user);
            sqlSession.commit();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void deleteUser(Integer id) {
        try {
//            1.加載主配置檔案  這個底層是通過類加載器  getResource()   ClassLoader類加載器  把主配置檔案方法類路徑資源下面裡面
            //通過類加載器加載類路徑資源下的配置檔案 得到配置檔案中的資訊 讀出來
            InputStream is = Resources.getResourceAsStream("mybatis.xml");//裡面放的是主配置檔案
            // Statement對象主要是将SQL語句發送到資料庫中  幫我們執行sql語句傳回結果集(封裝結果集對象的)
            //  2.建立SqlSessionFactory對象工廠對象connection
            //  根據主配置檔案資訊建構SqlSessionFactory對象 這個對象在建立的時候需要去解析主配置檔案
            //  主配置檔案中配置了映射配置檔案,它也會幫我們去解析映射配置檔案 将映射配置檔案中的各種statement建立出來
            //是以sqlSessionFactory是一個重量級對象,因為它要幫我們建立連接配接池又要幫我們加載配置檔案 對象建立時候需要消耗系統資源
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠類建立sqlsession對象 這個對象才是用來真正操作資料庫的  相當于JDBC中connection,statement對象
            SqlSession sqlSession = sqlSessionFactory.openSession();//操作資料庫的
            //調用相應方法 通過sqlsession去執行配置的statement  namespace+id确定唯一statement
            int update = sqlSession.update("com.swlz.dao.UserDao.deleteUser", id);//id:參數
            sqlSession.commit();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}      

注意:mybatis在執行增删改操作的時候,預設都會幫你開啟事物,但是事物不會自動送出

 mybatis的請求參數傳遞與結果集封裝

面試題:#{} 和 ${}的差別

1. ${}在綁定參數的時候是直接使用字元串拼接的方式   可能産生sql注入的問題

   #{}在綁定參數的時候會使用預編譯Statement  能夠防止sql注入

2. ${}在綁定參數的時候,如果參數是單值的情況 ${value}中的名字隻能是value

   #{}在綁定參數的時候,如果參數是單值的情況 #{aaa}中的名字隻能是能夠自定義

3. #{}還能自動将java類型轉換為jdbc類型

今日學習感受:之前欠的債,遲早到還的,學習中還是要一步一個腳印,走踏實了。一遍一遍加深自己的印象,查找自己的漏洞,并且努力補上。加油!最後一句話:勤能補拙,加油,堅持,努力!