框架(Framework 半成品軟件)
框架(Framework)是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實例間交互的方法;另一種
定義認為蝴猪,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架惑艇。前者是從應(yīng)用方面而后者是從目的方面給出的定義迫靖。
簡而言之,框架其實就是某種應(yīng)用的半成品测秸,就是一組組件疤估,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺霎冯,你來做表演铃拇。而且,框架一般是成熟的沈撞,不斷升級的軟件框架一般處在低層應(yīng)用平臺(如 J2EE )和高層業(yè)務(wù)邏輯之間的中間層慷荔。
Mybatis
mybatis是一個優(yōu)秀的基于 java 的持久層框架,它內(nèi)部封裝了 jdbc缠俺,使開發(fā)者只需要關(guān)注 sql 語句本身拧廊,而不需要花費精力去處理加載驅(qū)動、創(chuàng)建連接晋修、創(chuàng)建 statement 等繁雜的過程吧碾。mybatis通過 xml 或注解的方式將要執(zhí)行的各種statement配置起來,并通過java對象和statement 中
sql 的動態(tài)參數(shù)進行映射生成最終執(zhí)行的 sql 語句墓卦,最后由 mybatis 框架執(zhí)行 sql 并將結(jié)果映射為 java 對象并返回倦春。采用 ORM 思想解決了實體和數(shù)據(jù)庫映射的問題,對 jdbc進行了封裝落剪,屏蔽了 jdbc api 底層訪問細節(jié)睁本,使我們不用與 jdbc api 打交道,就可以完成對數(shù)據(jù)庫的持久化操作忠怖。
jdbc 問題
1呢堰、數(shù)據(jù)庫鏈接創(chuàng)建、釋放頻繁造成系統(tǒng)資源浪費從而影響系統(tǒng)性能凡泣,如果使用數(shù)據(jù)庫鏈接池可解決此問題枉疼。
2皮假、Sql 語句在代碼中硬編碼,造成代碼不易維護骂维,實際應(yīng)用 sql 變化的可能較大惹资,sql 變動需要改變 java代碼。
3航闺、使用 preparedStatement 向占有位符號傳參數(shù)存在硬編碼褪测,因為 sql 語句的 where 條件不一定,可能多也可能少潦刃,修改 sql 還要修改代碼侮措,系統(tǒng)不易維護。
4乖杠、對結(jié)果集解析存在硬編碼(查詢列名)萝毛,sql 變化導致解析代碼變化,系統(tǒng)不易維護滑黔,如果能將數(shù)據(jù)庫記錄封裝成 pojo 對象解析比較方便
Mybatis 框架快速入門
1. 創(chuàng)建 maven 工程
maven 是管理jar包的笆包,用maven 工程中沒有jar包,jar包在倉庫中略荡,maven 工程在pom.xmk存儲的是依賴jar的坐標庵佣。
2. 添加依賴jar包
在pom.xml中添加所需的依賴坐標
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
<build>
<!-- 定義classpath -->
<resources>
<!-- resources文件 -->
<resource>
<directory>src/main/resources</directory>
<!-- 是否被過濾,如果被過濾則無法使用 -->
<filtering>false</filtering>
</resource>
<!-- java文件夾 -->
<resource>
<directory>src/main/java</directory>
<!-- 引入映射文件等 -->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
3. 編寫User實體類
- 3.1 數(shù)據(jù)庫腳本
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性別',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('41', '老李', '2018-02-27 17:47:08', '男', '北京');
INSERT INTO `user` VALUES ('42', '小二李', '2018-03-02 15:09:37', '女', '北京');
INSERT INTO `user` VALUES ('43', '小二李', '2018-03-04 11:34:34', '女', '北京');
INSERT INTO `user` VALUES ('45', '居八戒', '2018-03-04 12:04:06', '男', '北京');
INSERT INTO `user` VALUES ('46', '老李李', '2018-03-07 17:37:26', '男', '北京');
INSERT INTO `user` VALUES ('48', '小馬寶莉', '2018-03-08 11:44:00', '女', '北京');
- 3.2 實體類
package com.neusoft.domain;
import java.io.Serializable;
import java.util.Date;
/**
* @author Eric Lee
* @date 2020/9/3 09:45
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
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 +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
- 3.3 編寫持久層接口 IUserDao
import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface IUserDao {
// 查詢所有
List<User> findAll();
}
-
3.4 編寫持久層接口的映射文件IUserDao.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="com.neusoft.dao.IUserDao">
<!-- 配置查詢所有用戶的sql-->
<select id="findAll" resultType="com.neusoft.domain.User">
select * from user
</select>
</mapper>
4.編寫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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置環(huán)境 -->
<environments default="mysql">
<!-- 配置mysql的環(huán)境-->
<environment id="mysql">
<!-- 配置事務(wù)的類型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數(shù)據(jù)源(連接池) -->
<dataSource type="POOLED">
<!-- 配置連接數(shù)據(jù)庫的4個基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/java_ssm"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件 -->
<mappers>
<mapper resource="com/neusoft/dao/IUserDao.xml"/>
</mappers>
</configuration>
5.編寫測試類
package com.neusoft.test;
import com.neusoft.dao.IUserDao;
import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;
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;
/**
* @author Eric Lee
* @date 2020/9/3 10:13
*/
public class MybatisTest1 {
@Test
public void test1() throws IOException {
// 1\. 讀取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2\. 創(chuàng)建 SqlSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3\. 使用 工廠生產(chǎn)的 SqlSession對象
SqlSession session = factory.openSession();
// 4\. 使用SqlSession 創(chuàng)建Dao 接口 的代理對象
IUserDao userDao = session.getMapper(IUserDao.class);
// 5\. 使用代理對象執(zhí)行方法
List<User> users = userDao.findAll();
for(User user: users){
System.out.println(user);
}
// 6 釋放資源
session.close();
in.close();
}
}
基于注解的 mybatis
1.在持久層接口中添加注解
package com.neusoft.dao;
import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface IUserDao {
// 查詢所有
@Select("select * from user")
List<User> findAll();
}
2.修改SqlMapConfig.xml配置文件
<!-- 告知mybatis映射配置的位置-->
<mappers>
<mapper class="com.neusoft.dao.IUserDao"></mapper>
</mappers>