框架(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>