1.不一樣框架解決不用問題,框架封裝了不少細節,開發者可使用簡單的方式實現功能。java
2.三層架構: 1.表現層 2.業務層 3.持久層 都有相應的處理框架。mysql
3.持久層的技術解決方案:sql
JDBC技術: Connection PrepareStatement ResultSet數據庫
Spring的 JDBCTemplate Spring中對jdbc的簡單封裝mybatis
Apache的DBUtils: 它和Spring的JDBCTemplate很像,也是對JDBC的簡單封裝架構
注: 以上都不是框架。JDBC是規範,DPring的JDBCTemplate和Apache的DBUtils都只是工具類app
參考JDBC:框架
JDBC步驟很繁瑣的,重複的。能夠簡化!開發關注項目的功能實現。maven
Mybatis封裝JDBC,開發者只須要關注SQL語句,省去了加載驅動,建立鏈接,建立statement等ide
經過XML或者註解方式將要執行的各類statement配置起來,經過Java對象和statement中sql的動態參數進行映射成最終執行的sql語句。而後封裝結果映射成Java對象並返回。
MyBatis 是ORM思想,數據庫字段和實體類映射。
廢話很少說,先搭建個環境再說吧
環境搭建:
MyBatis配置文件的約束:
config:
<?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">
Mapper:
<?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">
sql:
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 DEFAULT CHARSET=utf8; insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),
(42,'小二王','2018-03-02 15:09:37','女','北京金燕龍'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龍'),
(45,'張三','2018-03-04 12:04:06','男','北京金燕龍'),(46,'老王','2018-03-07 17:37:26','男','北京'),
(48,'小馬寶莉','2018-03-08 11:44:00','女','北京修正'); DROP TABLE IF EXISTS `account`; CREATE TABLE `account` ( `ID` int(11) NOT NULL COMMENT '編號', `UID` int(11) default NULL COMMENT '用戶編號', `MONEY` double default NULL COMMENT '金額', PRIMARY KEY (`ID`), KEY `FK_Reference_8` (`UID`), CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `account`(`ID`,`UID`,`MONEY`) values (1,41,1000),(2,45,1000),(3,41,2000); DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `ID` int(11) NOT NULL COMMENT '編號', `ROLE_NAME` varchar(30) default NULL COMMENT '角色名稱', `ROLE_DESC` varchar(60) default NULL COMMENT '角色描述', PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院長','管理整個學院'),(2,'總裁','管理整個公司'),(3,'校長','管理整個學校'); DROP TABLE IF EXISTS `user_role`; CREATE TABLE `user_role` ( `UID` int(11) NOT NULL COMMENT '用戶編號', `RID` int(11) NOT NULL COMMENT '角色編號', PRIMARY KEY (`UID`,`RID`), KEY `FK_Reference_10` (`RID`), CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`), CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user_role`(`UID`,`RID`) values (41,1),(45,1),(41,2);
建立步驟:
1.建立maven工程而且導入座標
2. SqlMapperConfig.xml主配置文件
3. 實體類
4. Dao接口
5. IUserDao.xml 映射配置文件
環境搭建的注意事項:
1. 建立IUserDao.xml和IUserDao.java 時名稱是爲了和咱們以前的知識保持一致。在Mybatis中它把持久層的操做接口名稱和映射文件叫作: Mapper
因此IUserDao 和 IUserMapper是同樣的
2. 在IDEA建立目錄時候,它和包是不同的。包在建立時候,source下的com.toov5.dao是它的三級目錄(須要連續建立,逐層建立)
3. MyBatis的映射配置文件必須是和Dao接口的包結構相同
4. 映射配置文件的mapper標籤namespace屬性的取值必須是dao接口的全限定類名。
5. 映射配置文件的操做配置,id屬性和dao接口的方法名相同。
若是聽從上述3到5,就不用寫接口實現類了!
思路:
鏈接數據庫的信息
有了工廠就能夠生產操做對象,這個對象就能夠操做數據庫
此時只有dao接口,框架會生成代理對象。有了代理對象以後,表名方法已經被加強過了,能夠實現功能了。
最後關閉鏈接。
環境搭建:
實體類:
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 + '\'' + '}'; } }
接口:
/** * 用戶的持久層接口 */ public interface IUserDao { List<User> findAll(); }
映射:
<?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.toov5.dao.IUserDao"> <!--查詢全部--> <select id="findAll" resultType="com.toov5.entity.User"> select * from user; </select> </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> <!-- 配置環境 --> <environments default="mysql"> <!-- 配置mysql的環境--> <environment id="mysql"> <!-- 配置事務的類型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置數據源(也叫鏈接池) --> <dataSource type="POOLED"> <!-- 配置鏈接數據庫的4個基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每一個dao獨立的配置文件 --> <mappers> <!--resource目錄下 對應要建立相應的包 --> <mapper resource="com/toov5/dao/IUserDao.xml"/> </mappers> </configuration>
測試類:
/** * MyBatis測試類 */ public class MyBatisTest { public static void main(String[] args) throws IOException { //1.讀取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 建立SqlSessonFactory工廠 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //如何解析,如何封裝已經底層幫助實現了。細節封裝了。 SqlSessionFactory factory = builder.build(in); // SqlSessionFactory 是個接口,須要找實現。這個工廠是用來建立對象的,建立過程省略了 //3. 使用工廠生產SqlSession對象 SqlSession sqlSession = factory.openSession(); //4. 使用SqlSession建立Dao接口的代理對象(這樣就有了Dao的代理對象,不改變源碼基礎上對方法進行加強: List<User> findAll();) // 經過字節碼去生產代理對象(經過代理方式實現接口) IUserDao userDao = sqlSession.getMapper(IUserDao.class); //5.使用代理對象執行方法 List<User> userList = userDao.findAll(); userList.stream().forEach( user ->{ System.out.println(user); } ); //6.釋放資源 sqlSession.close(); in.close(); } }
測試結果:
小結:
1. 讀取配置文件
2. 建立SqlSessionFactory工廠
3. 建立SqlSession
4. 建立Dao接口的代理對象
5. 執行dao中的方法
6. 釋放資源