Mybatis的基本配置以及使用
mybatis是什麼?
mybatis是優秀的Java持久層框架,支持定製SQL和存儲過程存儲過程以及高級映射,可以通過xml配置或者註解方式來進行映射原始類型接口和java pojo(簡單的Java對象 僅用來進行數據的傳遞而沒有邏輯方法)到數據庫中的對象
mybatis的優點
- mybatis中使用了dao層來放置持久層代碼,將持久層代碼與業務邏輯層代碼分開,進行了解耦便於了代碼的維護
- mybatis是半自動化的持久層框架,相比使用JDBC來操作數據庫簡單了很多幾乎避免了所有的JDBC代碼
- mybatis支持定製化的sql由程序員來編寫sql代碼,更加的靈活。
mybatis的使用
-
mybatis資源的獲取:mybatis官方網址
-
使用maven進行項目的管理我們只需要在pom.xml文件中導入mybatis的依賴座標
maven依賴座標獲取以及jar包下載網站:maven repository
因爲使用maven管理項目因此獲取mybatis依賴座標即可 一般下載使用人數較多的版本<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
1. 使用xml文件方式從數據庫查詢表中數據
- 首先在數據庫創建一個數據庫表user並且插入數據(要連接數據庫別忘了在pom.xml中加入MySQL的依賴座標和單元測試junit依賴座標用於測試)
create database mybatis_demo; use mybatis_demo; create table user( eno int primary key auto_increment, ename varchar(50) not null, email varchar(50), salary double, dno int ); insert into user(ename,email,salary,dno) value('fff','[email protected]',19000,1), ('ggg','[email protected]',15000,2), ('hhh','[email protected]',13000,3), ('jjj','[email protected]',16000,4);
- 創建一個包名爲entiyt的包來存放實體類,實體類成員屬性必須要對應表中的字段(因爲mybatis要將出數據庫中查詢出來的數據進行映射到實體類對象中然後返回)
public class User {
private int eno;
private String ename;
private String email;
private double salary;
private int dno;
public User(){
}
public User(int eno, String ename, String email, double salary, int dno) {
this.eno = eno;
this.ename = ename;
this.email = email;
this.salary = salary;
this.dno = dno;
}
public int getEno() {
return eno;
}
public void setEno(int eno) {
this.eno = eno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public int getDno() {
return dno;
}
public void setDno(int dno) {
this.dno = dno;
}
@Override
public String toString() {
return "User{" +
"eno=" + eno +
", ename='" + ename + '\'' +
", email='" + email + '\'' +
", salary=" + salary +
", dno=" + dno +
'}';
}
}
- 在源碼部分新建一個包,包名叫做dao 用來存放持久層代碼
在dao包下面創建一個接口裏面聲明操作數據庫的方法,接口中的方法不能重載
public interface UserDao {
// 查詢數據庫中所有的user
List<User> queryAllUsers();
}
- 在resources目錄下編寫一個接口的映射文件userDaoMapper.xml(相當於接口UserDao的實現類)
<?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:對應的是dao層中的接口
id:必須與接口中的方法的名稱一致
resultType:方法返回值的類型
持久層dao接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字
符串作爲 key 值,可唯一定位一個 MapperStatement。在 Mybatis 中,每一個
<select>、<insert>、<update>、<delete>標籤,都會被解析爲一個
MapperStatement 對象
-->
<mapper namespace="org.xupt.dao.UserDao">
<select id="queryAllUsers" resultType="org.xupt.entity.User">
select * from mybatis_demo.user;
</select>
</mapper>
- 編寫mybatis的配置文件mybatis-config.xml,將mybatis與數據庫連接(數據庫的配置信息可以抽取出來成一個db.properties文件然後在configuration標籤下面使用properties標籤引入)
<?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">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--mybatis sql映射⽂件的位置-->
<mapper resource="UserDaoMapper.xml"/>
</mappers>
</configuration>
- 進行測試
public class test {
@Test
public void testF() throws IOException {
// 讀取mybatis的全局配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 創建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 使用sqlSessionFactory生產sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 創建代理對象 面向接口編程
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 使用代理對象 調用接口中的方法
List<User>res = mapper.queryAllUsers();
for (User user:res){
System.out.println(user.toString());
}
}
}
測試結果:
2. 使用註解的方式從數據庫查詢表中數據
註解方式與xml方式區別:
註解方式不需要xml映射文件 sql語句寫在接口中的方法上的註解裏
mybatis的配置文件中sql映射要換成接口所在位置
public interface UserDao {
// 查詢數據庫中所有的user
@Select("select * from user")
List<User> queryAllUsers();
}
修改sql映射位置
<mappers>
<!--mybatis sql映射⽂件的位置-->
<mapper class="org.xupt.dao.UserDao"/>
</mappers>
測試結果(測試方法和xml方式一樣)