前言:
什麼是框架?使用框架有什麼好處?
框架就是我們軟件開發中的一種解決方案,不同的框架對應解決不同的問題。框架封裝了很多細節,使開發者可以使用極簡的方式去實現功能,大大的提升了開發效率。
現在學習的Mybatis是三層架構(表現層,業務層,持久層)中持久層相關的。
對於持久層來說,有以下幾種解決方案:
- JDBC技術:Connection,Statement,ResultSet
- Spring的JDBCTemplate:Spring中對JDBC的簡單封裝
- Apache的DBUtils:和上述的很像,也是對JDBC的簡單封裝
以上都不是框架,JDBC是規範,而後兩個是工具類。
Mybatis框架:
一、概述
是一個優秀的基於java的持久層框架,它內部封裝了JDBC,使開發者只需要關注sql語句本身,而無需處理加載驅動、創建連接、創建Statement等繁瑣的過程。它使用了ORM思想,實現了結果集的封裝。可以使用xml和註解方式來配置各種Statement。
ORM:Object Relational Mapping 對象關係映射,就是把數據庫表和實體類及實體類的屬性對應起來,讓我們可以通過操作實體類就可以實現操作數據庫表。
二、入門
前面說到,我們可以使用xml和註解的方式來配置Statement,基於開發的角度去想,註解方式十分方便,但是我們是學習者,xml配置我們也是要了解學習的。
如何搭建?
- 創建maven工程並在pom.xml中導入座標(配置xml)
- 在src/main/java中創建實體類和dao接口
- 在resources中穿件MyBatis的主配置文件SqlMapConfig.xml
- 如果是基於xml配置,我們需要按照包名在resources下創建IUserDao.xml
我們需要在pom中導入的座標如下:
<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>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
然後依照包名創建dao接口和實體類:
package com.hty.domain;
import java.io.Serializable;
/**
* @program: day20
* @author: Semineces
* @create: 2020-01-20 14:35
*/
public class User implements Serializable {
private Integer id;
private String username;
private String sex;
private String telephone;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + username + '\'' +
", sex='" + sex + '\'' +
", telephone='" + telephone + '\'' +
'}';
}
}
package com.hty.dao;
import com.hty.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @program: day20
* @author: Semineces
* @create: 2020-01-20 14:55
*/
public interface IUserDao {
/**
* 通過id獲取信息
* @return
*/
//@Select("select * from myuser where id = #{id}") 這行是基於註解的
List<User> getUserById(int id);//通過id查人
}
在resources下創建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">
<configuration>
<typeAliases>
<typeAlias type="com.hty.domain.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/project?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="passowrd"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--基於xml配置實現-->
<mapper resource="com/hty/dao/User.xml"></mapper>
<!--基於註解配置實現-->
<!-- <mapper class="com.hty.dao.IUserDao"></mapper> -->
</mappers>
</configuration>
然後我們需要在與IUserDao對應的路徑下創建User.xml(如果我們是基於註解配置,就不用創建了)
依照這個目錄來創建,具體內容爲:
其中,id爲接口中的方法名,parameterType爲接受的參數類型,resultType爲返回的結果類型。
<?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">
<!-- namespace的屬性值必須使全限定類名 -->
<mapper namespace="com.hty.dao.IUserDao">
<select id="getUserById" parameterType="int" resultType="com.hty.domain.User">
select * from myuser where id = #{id}
</select>
</mapper>
至此,初步搭建環境就完成了,現在我們在test/java下創建一個測試類來測一測。
import com.hty.dao.IUserDao;
import com.hty.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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @program: day20
* @author: Semineces
* @create: 2020-01-20 14:52
*/
public class TestMybatis {
private InputStream inputStream;
private SqlSession sqlSession;
private IUserDao iUserDao;
@Before
public void init() throws IOException {
//讀取xml的時候使用了類加載器,它只能讀取類路徑的配置文件
inputStream = Resources.getResourceAsStream("config/SqlMapConfig.xml");
//創建工廠:mybatis使用了構建者模式,其中SqlSessionFactoryBuilder是構建者
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//使用工廠生產SqlSession對象,就是使用了工廠模式,好處是解耦(降低了類之間的依賴關係)
sqlSession = sqlSessionFactory.openSession();
//創建dao接口實現類使用了代理模式
iUserDao = sqlSession.getMapper(IUserDao.class);
}
@Test
public void testGetUser() {
//使用代理對象執行方法
List<User> users = iUserDao.getUserById(1);
for (User user : users) {
System.out.println(user);
}
}
@After
public void destroy() throws IOException {
//釋放資源
sqlSession.close();
inputStream.close();
}
}
得到控制檯輸出我們所查到的內容:
至此,Mybatis的入門搭建,以及簡單的小實例成功了。
三、注意事項
1.Mybatis中映射配置文件位置必須與dao接口的包結構相同
2.基於User.xml配置中mapper標籤裏的namespace屬性的取值必須是dao接口的全限定類名
3.映射配置文件的操作配置(select),id屬性的取值必須使dao接口的方法名
當我們遵從了這三點後,在開發中就無須寫實現類了(因爲已經沒必要了)。
四、進行CRUD
大概步驟跟前面的差不多,基於xml配置就還是要在User.xml中寫sql語句。
<insert id="insertUser" parameterType="User">
insert into myuser(username,sex,telephone) values (#{username},#{sex},#{telephone})
</insert>
<update id="updateUser" parameterType="User">
update myuser set username=#{username},sex=#{sex},telephone=#{telephone} where id=#{id}
</update>
<select id="getUser" resultType="com.hty.domain.User">
select * from myuser
</select>
<delete id="deleteUser" parameterType="int">
delete from myuser where id=#{id}
</delete>
然後我們在接口中添加上述方法:
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
List<User> getUser();
最後在我們的測試類中寫測試方法:
@Test
public void testInsertUser() {
User user = new User();
user.setUsername("semineces");
user.setSex("男");
user.setTelephone("1111");
iUserDao.insertUser(user);
//除了查詢操作外,都要使用commit來提交事務
sqlSession.commit();
}
@Test
public void testGetUser() {
List<User> users = iUserDao.getUser();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testUpdateUser() {
User user = iUserDao.getUserById(1);
user.setSex("女");
iUserDao.updateUser(user);
sqlSession.commit();
}
@Test
public void testDeleteUser() {
iUserDao.deleteUser(2);
sqlSession.commit();
}
至此,我們就已經實現完mybatis的入門CRUD操作了,如果是基於註解開發,則用select註解將sql語句寫在IUserDao接口的方法上方。