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