Java?SSM框架講解
介紹SSM框架<原理>
一、什么是SSM框架?
SSM框架是spring、spring MVC 、和mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式。標(biāo)準(zhǔn)的SSM框架有四層,分別是dao層(mapper),service層,controller層和View層。使用spring實(shí)現(xiàn)業(yè)務(wù)對(duì)象管理,使用spring MVC負(fù)責(zé)請(qǐng)求的轉(zhuǎn)發(fā)和視圖管理,mybatis作為數(shù)據(jù)對(duì)象的持久化引擎。
1)持久層:dao層(mapper)層
作用:主要是做數(shù)據(jù)持久層的工作,負(fù)責(zé)與數(shù)據(jù)庫(kù)進(jìn)行聯(lián)絡(luò)的一些任務(wù)都封裝在此。
- Dao層首先設(shè)計(jì)的是接口,然后再Spring的配置文件中定義接口的實(shí)現(xiàn)類。
- 然后可以在模塊中進(jìn)行接口的調(diào)用來(lái)進(jìn)行數(shù)據(jù)業(yè)務(wù)的處理。(不在關(guān)心接口的實(shí)現(xiàn)類是哪個(gè)類)
- 數(shù)據(jù)源的配置以及有關(guān)數(shù)據(jù)庫(kù)連接的參數(shù)都在Spring的配置文件中進(jìn)行配置。
2)業(yè)務(wù)層:Service層
作用:Service層主要負(fù)責(zé)業(yè)務(wù)模塊的邏輯應(yīng)用設(shè)計(jì)。
- 先設(shè)計(jì)接口然后再設(shè)計(jì)實(shí)類,然后再在Spring的配置文件中配置其實(shí)現(xiàn)的關(guān)聯(lián)。(業(yè)務(wù)邏輯層的實(shí)現(xiàn)具體要調(diào)用到自己已經(jīng)定義好的Dao的接口上)這樣就可以在應(yīng)用中調(diào)用Service接口來(lái)進(jìn)行業(yè)務(wù)處理。
- 建立好Dao之后再建立service層,service層又要在controller層之下,因?yàn)榧纫{(diào)用Dao層的接口又要提供接口給controller層。每個(gè)模型都有一個(gè)service接口,每個(gè)接口分別封裝各自的業(yè)務(wù)處理的方法。
3)表現(xiàn)層:Controller層(Handler層)
作用:負(fù)責(zé)具體的業(yè)務(wù)模塊流程的控制。
- 配置也同樣是在Spring的配置文件里面進(jìn)行,
- 調(diào)用Service層提供的接口來(lái)控制業(yè)務(wù)流程。
- 業(yè)務(wù)流程的不同會(huì)有不同的控制器,在具體的開發(fā)中可以將我們的流程進(jìn)行抽象的歸納,設(shè)計(jì)出可以重復(fù)利用的子單元流程模塊。
4)View層
作用:主要和控制層緊密結(jié)合,主要負(fù)責(zé)前臺(tái)jsp頁(yè)面的表示。
各層之間的聯(lián)系
這里是引用
DAO層,Service層這兩個(gè)層次都可以單獨(dú)開發(fā),互相的耦合度很低,完全可以獨(dú)立進(jìn)行,這樣的一種模式在開發(fā)大項(xiàng)目的過(guò)程中尤其有優(yōu)勢(shì),Controller,View層因?yàn)轳詈隙缺容^高,因而要結(jié)合在一起開發(fā),但是也可以看作一個(gè)整體獨(dú)立于前兩個(gè)層進(jìn)行開發(fā)。這樣,在層與層之前我們只需要知道接口的定義,調(diào)用接口即可完成所需要的邏輯單元應(yīng)用,一切顯得非常清晰簡(jiǎn)單。
1.Spring
Spring里面的IOC容器和AOP是我們平時(shí)使用最多的。
1)IOC(控制反轉(zhuǎn))
它可以裝載bean,也是一種降低對(duì)象之間耦合關(guān)系的設(shè)計(jì)思想。(比如租房子。以前租房子需要一個(gè)房子一個(gè)房子找,費(fèi)時(shí)費(fèi)力,然后現(xiàn)在加入一個(gè)房屋中介,把你需要的房型告訴中介,就可以直接選到需要的房子,中介就相當(dāng)于spring容器。)
2)AOP(面向切面)
是面向?qū)ο箝_發(fā)的一種補(bǔ)充,它允許開發(fā)人員在不改變?cè)瓉?lái)模型的基礎(chǔ)上動(dòng)態(tài)的修改模型以滿足新的需求,如:動(dòng)態(tài)的增加日志、安全或異常處理等。AOP使業(yè)務(wù)邏輯各部分間的耦合度降低,提高程序可重用性,提高開發(fā)效率。
1.橫切關(guān)注點(diǎn):從每個(gè)方法中抽取出來(lái)的同一類非核心業(yè)務(wù)代碼。
2.切面:封裝橫切信息點(diǎn)的類,每個(gè)關(guān)注點(diǎn)體現(xiàn)為一個(gè)通知方法。
3.通知:切面必須要完成的各個(gè)具體工作,也就是切面里的一個(gè)個(gè)方法。
4.目標(biāo):被通知的對(duì)象,也就是被通知方法所作用的對(duì)象。
5.代理:像目標(biāo)對(duì)象應(yīng)用通知之后所創(chuàng)建的代理對(duì)象。
6.連接點(diǎn):橫切關(guān)注點(diǎn)在程序代碼中的具體體現(xiàn),對(duì)應(yīng)用程序執(zhí)行的某個(gè)特定位置。(通俗來(lái)講就是一個(gè)個(gè)的方法)
7.切入點(diǎn):切入點(diǎn)就是定位連接點(diǎn)的方式。每個(gè)通知上的切入點(diǎn)表達(dá)式找到對(duì)應(yīng)的連接點(diǎn),執(zhí)行通知之后連接點(diǎn)也就變成了切入點(diǎn)。
2.Spring MVC
<復(fù)雜版>
1、 用戶發(fā)送請(qǐng)求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping處理器映射器。
3、 處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找),生成處理器對(duì)象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
4、 DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
5、 HandlerAdapter經(jīng)過(guò)適配調(diào)用具體的處理器(Controller,也叫后端控制器)。
6、 Controller執(zhí)行完成返回ModelAndView。
7、 HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet。
8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
9、 ViewReslover解析后返回具體View。
10、DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
11、 DispatcherServlet響應(yīng)用戶。
<簡(jiǎn)單版>
1.客戶端發(fā)送請(qǐng)求到DispacherServlet(分發(fā)器)
2.由DispacherServlet控制器查詢HanderMapping,找到處理請(qǐng)求的Controller
3.Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView
4.DispacherSerclet查詢視圖解析器,找到ModelAndView指定的視圖
5.視圖負(fù)責(zé)將結(jié)果顯示到客戶端
3.Mybatis (核心是SqlSession)
mybatis是對(duì)jdbc的封裝,它讓數(shù)據(jù)庫(kù)底層操作變的透明。mybatis的操作都是圍繞一個(gè)sqlSessionFactory實(shí)例展開的。mybatis通過(guò)配置文件關(guān)聯(lián)到各實(shí)體類的Mapper文件,Mapper文件中配置了每個(gè)類對(duì)數(shù)據(jù)庫(kù)所需進(jìn)行的sql語(yǔ)句映射。在每次與數(shù)據(jù)庫(kù)交互時(shí),通過(guò)sqlSessionFactory拿到一個(gè)sqlSession,再執(zhí)行sql命令。
二、代碼實(shí)戰(zhàn)
1.創(chuàng)建配置工程
1)創(chuàng)建maven工程
2)創(chuàng)建目錄
- src——main下創(chuàng)建兩個(gè)文件夾(Java和resources)。
- 和main同級(jí)的創(chuàng)建一個(gè)test,test里面創(chuàng)建一個(gè)Java。
3)配置工程
- file——project structure——modules
4)創(chuàng)建包
- 在src——java下創(chuàng)建問(wèn)價(jià)夾(XXX),
- (XXX)下創(chuàng)建entity,mapper,,service和util包。
5)配置依賴pom.xml加入依賴,一個(gè)是Mybatis的,一個(gè)是MySQL的。
代碼如下(示例):
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
2.代碼實(shí)戰(zhàn)(查詢記錄數(shù))
1)設(shè)計(jì)數(shù)據(jù)庫(kù)
1)創(chuàng)建實(shí)體類在entity下new一個(gè)名為person的class
代碼如下(示例):
public class Person {
private Integer Id;
private String name;
private String nickname;
private Integer age;
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 String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"Id=" + Id +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
'}';
}
}
2)Mapper接口
定義方法(實(shí)體名+Mapper)
在mapper下創(chuàng)建一個(gè)名為PersonMapper的interface
public interface PersonMapper {
//定義查詢記錄方法數(shù)
public Integer findCount();
}
3)resources包
- resources包下創(chuàng)建cn包
- cn包下創(chuàng)建kgc包
- kgc包下創(chuàng)建一個(gè)XML(這里的xml文件名與mapper接口名一致)
xml文件中有兩個(gè)部分組成,一個(gè)是頭部文件,一個(gè)是主體
//頭文件:
<?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">
//查詢映射標(biāo)簽(select):
<mapper namespace="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
</select>
</mapper>
(1)mapper叫根節(jié)點(diǎn),根節(jié)點(diǎn)有個(gè)屬性是namespace=""、namespace=""、的作用是映射我們mapper的全路徑,在以后的使用中會(huì)自動(dòng)映射成我們mapper的實(shí)現(xiàn)類
(2)select里面的Id=“”一般和我們PersonMapper里面的方法名保持一致
(3)返回值這里有一個(gè)專門的屬性叫resultType="java.lang.Integer"
(4)方法名和返回值都對(duì)應(yīng)之后看有無(wú)參數(shù),如果有要加上parameterType=""
4)寫sql語(yǔ)句`
<mapper namespace="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>
</mapper>
5)配置主配置文件mybatis-config.xml`
在resources里新建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
//根節(jié)點(diǎn):爺爺
<configuration>
//子節(jié)點(diǎn):爸爸
<environments default="development">
//爸爸天生有很多的孫子(這里可以配置很多個(gè)數(shù)據(jù)庫(kù),比如development1,development2等等)
<environment id="development">
<transactionManager type="JDBC" /> </transactionManager>//事務(wù)里面有一個(gè)類型type,可以配JDBC(JDBC利用的機(jī)制是數(shù)據(jù)庫(kù)它的一個(gè)數(shù)據(jù)源的一個(gè)事務(wù)JDBC??梢栽试S不用數(shù)據(jù)庫(kù)的事務(wù))
<dataSource type="POOLED"></dataSource>//(dataSource屬性,代表數(shù)據(jù)源,鏈接數(shù)據(jù)庫(kù)。“POOLED”這里的連接池根據(jù)需要可以更改。)
</environment>
//development2(一般企業(yè)里配一個(gè)開發(fā)環(huán)境,一個(gè)測(cè)試環(huán)境)
// <environment id="development2">
// <transactionManager type="" /> </transactionManager>
// <dataSource type=""></dataSource>
// </environment>
// </environments>
</configuration>
mybatis-config.xml完整代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!--jdbc.properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--setttings:控制mybatis全局配置行為-->
<settings>
<!--設(shè)置mybatis輸出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--環(huán)境配置:數(shù)據(jù)庫(kù)的連接信息-->
<!--default:中配置的值需要和某個(gè)environment配置的id相同,
通知mybatis使用具體哪一個(gè)數(shù)據(jù)庫(kù)的連接信息,即具體訪問(wèn)對(duì)應(yīng)的數(shù)據(jù)庫(kù)-->
<environments default="development">
<!--environment:一個(gè)數(shù)據(jù)庫(kù)信息的配置,環(huán)境-->
<!--id屬性:一個(gè)唯一值,自定義,表示環(huán)境的名稱-->
<environment id="development">
<!--transactionManager屬性:mybatis的事務(wù)類型-->
<transactionManager type="JDBC" />
<!--dataSoure屬性:代表數(shù)據(jù)源,連接數(shù)據(jù)庫(kù)-->
<!--type屬性:JDBC 表示使用的是使用連接池的數(shù)據(jù)源-->
<dataSource type="POOLED">
<!--配置驅(qū)動(dòng)-->
<property name="driver" value="${driver}"/>
<!--配置連接數(shù)據(jù)庫(kù)的url字符串-->
<property name="url" value="${url}"/>
<!--配置連接數(shù)據(jù)庫(kù)的用戶名-->
<property name="username" value="${username}"/>
<!--配置連接數(shù)據(jù)庫(kù)的密碼-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--sql映射文件標(biāo)簽-->
<mappers>
<!--reource:從類路徑開始的路徑信息:target/clasess(類路徑)-->
<mapper resource="cn/kgc/mapper/PersonMapper.xml"/>
</mappers>
</configuration>
5)測(cè)試`
在test——Java包下新建一個(gè)名為TestMybatis的測(cè)試類
測(cè)試用例怎么寫:測(cè)一個(gè)對(duì)象sqlSession,需要通過(guò)sqlSessionFactor()對(duì)象才能創(chuàng)建sqlSession。sqlSessionFactor()需要通過(guò)sqlSessionFactor()Builder()來(lái)創(chuàng)建出來(lái)。
1. 先new一個(gè)SqlSessionFactoryBuilder(),得到一個(gè)返回值builder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
2. 獲取我們的SqlSessionFactory,要用builder.上我們的builder()方法,通過(guò)流的形式傳一個(gè)In的參數(shù)。
3. 通過(guò)Resources.getResourceAsStream(“”)讀取我們的主配置文件才能調(diào)用我們的依賴信息,在這里拋異常。這里有一個(gè)返回值nputStream in(字節(jié)流),通過(guò)字節(jié)流就可以讀取
4. 這時(shí)builder.build(in);得到喲個(gè)返回值就是SqlSessionFactory factory。
5. 得到SqlSessionFactory factory之后,根據(jù)圖片的流程就要得到我們的SqlSession。
6. factory.openSession()打開我們的Session,就可以得到我們的Session
7. 執(zhí)行sql語(yǔ)句。sqlSession.getMapper(這里的mapper利用的是我們的一個(gè)反射機(jī)制,機(jī)制利用的時(shí)我們的一個(gè)接口)通過(guò)sqlSession.getMapper(PersonMapper.class)調(diào)用一個(gè)調(diào)用方法,得到一個(gè)返回值count
8. 輸出對(duì)應(yīng)的返回值
9. 關(guān)閉sqlsession
public class TestMybatis {
@Test
public void testHelloWorld() throws IOException {
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
//5.調(diào)用接口的方法
Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
//6.輸出對(duì)應(yīng)的返回值count
System.out.println("count:" + count);
//7.關(guān)閉 SqlSession
sqlSession.close();
}
}
3.代碼實(shí)戰(zhàn)(增加)
PersionMapper
public interface PersonMapper {
//定義查詢記錄方法數(shù)
public Integer findCount();
//增加
public Integer addPerson(Person person);
}
PersonMapper.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">
<mapper namespace="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>
<insert id="addPerson" parameterType="cn.kgc.entity.Person">
insert into t_user(name,nickname,age) values(#{name},#{nickname},#{age})
</insert>
</mapper>
測(cè)試類
@Test
public void testInsert() throws Exception {
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
//5.調(diào)用接口的方法
Person p = new Person();
p.setName("李四");
p.setNickname("一個(gè)人的夜晚上");
p.setAge(22);
sqlSession.getMapper(PersonMapper.class).addPerson(p);
//6.提交實(shí)物,該行代碼必須放在關(guān)閉sqlsession之前
sqlSession.commit();
sqlSession.close();
}
3.代碼實(shí)戰(zhàn)(增刪改查,模糊精確查詢集合)
完整工程代碼
Person類
package cn.kgc.entity;
public class Person {
private Integer Id;
private String name;
private String nickname;
private Integer age;
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 String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"Id=" + Id +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
'}';
}
}
PersonMapper類
package cn.kgc.mapper;
import cn.kgc.entity.Person;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface PersonMapper {
//定義查詢記錄方法數(shù)
public Integer findCount();
//增加
public Integer addPerson(Person person);
//修改功能
public Integer updatePerson(Person person);
//刪除功能
public Integer delById(Integer Id);
//刪除功能2
public Integer delById2(Person person);
//查詢對(duì)象
public Person findById(Integer Id);
//查詢集合
public List<Person> findAll();
//模糊查詢
public List<Person> findByName(String name);
//通過(guò)用戶名和昵稱 絕對(duì)查詢
public List<Person> findByPerson(Person person);
//通過(guò)用戶名和昵稱 絕對(duì)查詢2
public List<Person> findByPerson2(@Param("name")String name,@Param("nickname")String nickname);
//測(cè)試¥(不安全)符號(hào)和#(安全)的作用
public List<Person> findColList(@Param("colname")String colname);
}
MybatisUtil類
package cn.kgc.util;
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;
public class MytabisUtil {
private static SqlSessionFactory factory = null;
static {
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
}catch (IOException e){
e.printStackTrace();
}
}
//獲取SqlSession對(duì)象
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if(factory!=null){
sqlSession = factory.openSession();
}
return sqlSession;
}
}
PersonMapper.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">
<mapper namespace="cn.kgc.mapper.PersonMapper">
<select id="findCount" resultType="java.lang.Integer">
select count(*) from t_user
</select>
<insert id="addPerson" parameterType="cn.kgc.entity.Person">
insert into t_user(name,nickname,age) values(#{name},#{nickname},#{age})
</insert>
<update id="updatePerson" parameterType="cn.kgc.entity.Person">
update t_user set name=#{name},nickname=#{nickname},age=#{age} where Id = #{Id}
</update>
<delete id="delById" parameterType="cn.kgc.entity.Person" >
delete from t_user where id = #{Id}
</delete>
<delete id="delById2" parameterType="cn.kgc.entity.Person">
delete from t_user where id = #{Id}
</delete>
<select id="findById" resultType="cn.kgc.entity.Person" parameterType="java.lang.Integer">
select * from t_user where id = #{Id}
</select>
<select id="findAll" resultType="cn.kgc.entity.Person">
select * from t_user
</select>
<select id="findByName" resultType="cn.kgc.entity.Person" parameterType="java.lang.String">
select * from t_user where `name` like concat('%',#{name},'%')
</select>
<select id="findByPerson" parameterType="cn.kgc.entity.Person" resultType="cn.kgc.entity.Person">
select * from t_user where `name` = #{name} and nickname = #{nickname}
</select>
<select id="findByPerson2" parameterType="cn.kgc.entity.Person" resultType="cn.kgc.entity.Person">
select * from t_user where `name` = #{name} and nickname = #{nickname}
</select>
<select id="findColList" resultType="cn.kgc.entity.Person">
select * from t_user order by ${colname}
</select>
</mapper>
jdbc.properties(配置文件)
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db_202125 username=root password=123
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!--jdbc.properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--setttings:控制mybatis全局配置行為-->
<settings>
<!--設(shè)置mybatis輸出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--環(huán)境配置:數(shù)據(jù)庫(kù)的連接信息-->
<!--default:中配置的值需要和某個(gè)environment配置的id相同,
通知mybatis使用具體哪一個(gè)數(shù)據(jù)庫(kù)的連接信息,即具體訪問(wèn)對(duì)應(yīng)的數(shù)據(jù)庫(kù)-->
<environments default="development">
<!--environment:一個(gè)數(shù)據(jù)庫(kù)信息的配置,環(huán)境-->
<!--id屬性:一個(gè)唯一值,自定義,表示環(huán)境的名稱-->
<environment id="development">
<!--transactionManager屬性:mybatis的事務(wù)類型-->
<transactionManager type="JDBC" />
<!--dataSoure屬性:代表數(shù)據(jù)源,連接數(shù)據(jù)庫(kù)-->
<!--type屬性:JDBC 表示使用的是使用連接池的數(shù)據(jù)源-->
<dataSource type="POOLED">
<!--配置驅(qū)動(dòng)-->
<property name="driver" value="${driver}"/>
<!--配置連接數(shù)據(jù)庫(kù)的url字符串-->
<property name="url" value="${url}"/>
<!--配置連接數(shù)據(jù)庫(kù)的用戶名-->
<property name="username" value="${username}"/>
<!--配置連接數(shù)據(jù)庫(kù)的密碼-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--sql映射文件標(biāo)簽-->
<mappers>
<!--reource:從類路徑開始的路徑信息:target/clasess(類路徑)-->
<mapper resource="cn/kgc/mapper/PersonMapper.xml"/>
</mappers>
</configuration>
TestMybatis類
import cn.kgc.entity.Person;
import cn.kgc.mapper.PersonMapper;
import cn.kgc.util.MytabisUtil;
import jdk.internal.util.xml.impl.Input;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
@Test
public void testHelloWorld() throws IOException {
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
//5.調(diào)用接口的方法
Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
//6.輸出對(duì)應(yīng)的返回值count
System.out.println("count:" + count);
//7.關(guān)閉 SqlSession
sqlSession.close();
}
@Test
public void testInsert() throws Exception {
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
//5.調(diào)用接口的方法
Person p = new Person();
p.setName("李四");
p.setNickname("一個(gè)人的夜晚上");
p.setAge(22);
sqlSession.getMapper(PersonMapper.class).addPerson(p);
//6.提交實(shí)物,該行代碼必須放在關(guān)閉sqlsession之前
sqlSession.commit();
sqlSession.close();
}
@Test
public void testupdate() throws Exception {
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
Person p2 = new Person();
p2.setId(2);
p2.setName("趙四");
p2.setNickname("來(lái)啊,造作啊");
p2.setAge(23);
sqlSession.getMapper(PersonMapper.class).updatePerson(p2);
//6.提交實(shí)物,該行代碼必須放在關(guān)閉sqlsession之前
sqlSession.commit();
sqlSession.close();
}
@Test
public void testdel() throws Exception{
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
sqlSession.getMapper(PersonMapper.class).delById(2);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testdel2 () throws Exception{
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
Person person = new Person();
person.setId(2);
sqlSession.getMapper(PersonMapper.class).delById2(person);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testfindById () throws Exception{
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
Person person = sqlSession.getMapper(PersonMapper.class).findById(1);
System.out.println("id"+ person.getId()+"name"+ person.getName()+"nickname"+ person.getNickname()+"age"+ person.getAge());
sqlSession.close();
}
@Test
public void testfindAll () throws IOException{
String str ="mybatis-config.xml";
InputStream in =Resources.getResourceAsStream(str);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
List<Person> all = sqlSession.getMapper(PersonMapper.class).findAll();
for(Person p:all){
System.out.println(p);
}
sqlSession.close();
}
@Test
public void testfindByName () throws IOException{
String str ="mybatis-config.xml";
InputStream in =Resources.getResourceAsStream(str);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
List<Person> list = sqlSession.getMapper(PersonMapper.class).findByName("wqz");
for(Person p:list){
System.out.println(p);
}
sqlSession.close();
}
@Test
public void testfindByPerson () throws IOException{
String str ="mybatis-config.xml";
InputStream in =Resources.getResourceAsStream(str);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
Person person = new Person();
List<Person> list = sqlSession.getMapper(PersonMapper.class).findByPerson(person);
for(Person p:list){
System.out.println(p);
}
sqlSession.close();
}
@Test
public void findByPerson2 () throws Exception {
//1.通過(guò)流的機(jī)制獲取主配置文件mybatis-config.xml的主要配置信息
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.實(shí)例化SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.調(diào)用builder對(duì)象的builder()方法,獲取SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//4.調(diào)用factory對(duì)象的openSession()方法,獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
String name = "王五";
String nickname = "123";
List<Person> list = sqlSession.getMapper(PersonMapper.class).findByPerson2(name,nickname);
for(Person p:list){
System.out.println("name:"+p.getName()+"nickname"+p.getNickname());
}
sqlSession.close();
}
@Test
public void testfindCount(){
SqlSession sqlSession = MytabisUtil.getSqlSession();
Integer count = sqlSession.getMapper(PersonMapper.class).findCount();
System.out.println(count);
}
@Test
public void findColList(){
SqlSession sqlSession = MytabisUtil.getSqlSession();
List<Person> colList = sqlSession.getMapper(PersonMapper.class).findColList("Id");
for (Person p:colList){
System.out.println(p);
}
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>20211125</name>
<groupId>org.example</groupId>
<artifactId>20211125</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8888</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
<contextPath>/</contextPath>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--dependency>
<groupId>org.example</groupId>
<artifactId>[the artifact id of the block to be mounted]</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency-->
</dependencies>
</project>
以上就是Java SSM框架講解的詳細(xì)內(nèi)容,更多關(guān)于SSM框架的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot實(shí)現(xiàn)mock平臺(tái)的示例代碼
本文主要介紹了springboot實(shí)現(xiàn)mock平臺(tái)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
使用Spring MVC攔截器實(shí)現(xiàn)日志記錄的方法
本篇文章主要介紹了使用Spring MVC攔截器實(shí)現(xiàn)日志記錄的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Springboot任務(wù)之異步任務(wù)的使用詳解
今天學(xué)習(xí)了一個(gè)新技能SpringBoot實(shí)現(xiàn)異步任務(wù),所以特地整理了本篇文章,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
分析java中全面的單例模式多種實(shí)現(xiàn)方式
單例模式是一種常用的軟件設(shè)計(jì)模式,單例對(duì)象的類只能允許一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,有利于協(xié)調(diào)系統(tǒng)整體的行為。比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中。本文將介紹它的思想和多種實(shí)現(xiàn)方式2021-06-06

