MyBatis是什么
MyBatis的前身就是iBatis,iBatis本是apache的一個開源項目,2010年這個項目由apahce sofeware foundation 遷移到了google code,并且改名為MyBatis。
MyBatis的主要作用是什么
- 根據(jù) JDBC 規(guī)范建立與數(shù)據(jù)庫的連接;
- 通過Annotaion/XML+JAVA反射技術(shù),實現(xiàn) Java 對象與關(guān)系數(shù)據(jù)庫之間相互轉(zhuǎn)化。
一個簡單的demo
- 使用Spring Boot
- 使用本地的MySQL
- 先在數(shù)據(jù)庫中建立一個表:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
- 加入MyBatis相關(guān)的依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.test</groupId>
<artifactId>MyBatisStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
這里用到了Spring Boot相關(guān)的依賴,可以看看mybatis-spring-boot-starter中的依賴關(guān)系
spring-boot-mybatis-starter.png
- 建立JavaBean的類User
package dao.domain;
/**
* @author wuxuguang
* users表所對應(yīng)的實體類
*/
public class User {
//實體類的屬性和表的字段名稱一一對應(yīng)
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
- 建立數(shù)據(jù)庫映射文件:
<?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,namespace的值習(xí)慣上設(shè)置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的
例如namespace="dao.mapper.userMapper"就是dao.mapper(包名)+userMapper(userMapper.xml文件去除后綴)
-->
<mapper namespace="dao.mapper.userMapper">
<!-- 在select標(biāo)簽中編寫查詢的SQL語句, 設(shè)置select標(biāo)簽的id屬性為getUser,id屬性值必須是唯一的,不能夠重復(fù)
使用parameterType屬性指明查詢時使用的參數(shù)類型,resultType屬性指明查詢返回的結(jié)果集類型
resultType="me.gacl.domain.User"就表示將查詢結(jié)果封裝成一個User類的對象返回
User類就是users表所對應(yīng)的實體類
-->
<!--
根據(jù)id查詢得到一個user對象
-->
<select id="getUser" parameterType="int"
resultType="dao.domain.User">
select * from users where id=#{id}
</select>
</mapper>
- 建立MyBatis的配置文件,并在這個配置文件中注冊userMapper文件
<?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="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/study" />
<property name="username" value="root" />
<property name="password" value="1234567" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注冊userMapper.xml文件,
userMapper.xml位于dao.mapper這個包下,所以resource寫成dao/mapper/userMapper.xml-->
<mapper resource="mybatis/userMapper.xml"/>
</mappers>
</configuration>
- 寫一個測試來進(jìn)行測試
public static void main(String[] args) throws IOException {
//mybatis的配置文件
String resource = "conf.xml";
//使用類加載器加載mybatis的配置文件(它也加載關(guān)聯(lián)的映射文件)
// InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
//構(gòu)建sqlSession的工廠
// SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關(guān)聯(lián)的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
//構(gòu)建sqlSession的工廠
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//創(chuàng)建能執(zhí)行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的標(biāo)識字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
* getUser是select標(biāo)簽的id屬性值,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
String statement = "dao.mapper.userMapper.getUser";//映射sql的標(biāo)識字符串
//執(zhí)行查詢返回一個唯一user對象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}