MyBatis 筆記(一)——快速入門
阿新 • • 發佈:2019-01-04
簡介
MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。
入門
新增依賴
在使用 Mybatis 的時候,需要新增資料庫驅動包和 Mybatis 包,以 MySQL 為例,Maven 依賴:
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> </dependencies>
MyBatis 配置檔案
使用 MyBatis 的時候需要一個 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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <!-- 基於XML配置檔案 --> <mapper resource="edu/wzm/mybatis/mapping/PersonMapper.xml"/> </mappers> </configuration>
Mapping 對映檔案
在上一節 MyBatis 的配置檔案中,看到了一個 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"> <!-- 為這個mapper指定一個唯一的namespace,namespace的值習慣上設定成包名+sql對映檔名,這樣就能夠保證namespace的值是唯一的 例如:namespace="edu.wzm.mybatis.mapping.PersonMapper"(userMapper.xml檔案去除字尾) --> <mapper namespace="edu.wzm.mybatis.mapping.PersonMapper"> <!-- 在select、insert、update、delete標籤中編寫查詢的SQL語句, 設定標籤的id屬性值必須是唯一的,不能夠重複。使用parameterType屬性 指明查詢時,使用的引數型別。resultType屬性指明查詢返回的結果集型別,resultType="edu.wzm.mybatis.domain.Person"就表示將查詢 結果封裝成一個Person類的物件返回,Person類就是person表所對應的實體類。 --> <insert id="insert" parameterType="edu.wzm.mybatis.domain.Person"> insert into person(name, age) values(#{name}, #{age}) </insert> <select id="getById" resultType="edu.wzm.mybatis.domain.Person"> select * from person where id = #{id} </select> <select id="getAll" resultType="edu.wzm.mybatis.domain.Person"> select * from person; </select> <update id="update" parameterType="edu.wzm.mybatis.domain.Person"> update person set age = #{age} where id = #{id} </update> <delete id="delete" parameterType="int"> delete from person where id = #{id} </delete> </mapper>
使用到的資料庫表:
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) DEFAULT '-1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
示例
在 Mapping 對映檔案中,可以看到引入了一個實體類 Person:
public class Person {
private int id;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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 "Person: [name=" + name + ", age=" + age + "]";
}
}
在上述工作都完成的情況下,我們就可以編寫訪問資料庫的 CRUD 程式碼:
public class PersonServices {
public void add(){
Person person = new Person("Alice", 30);
SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
/**
* 對映sql的標識字串。
* edu.wzm.mybatis.mapping.PersonMapper是PersonMapper.xml中mapper標籤的namespace屬性的值,
* insert是insert標籤的id屬性值,通過update標籤的id屬性值就可以找到要執行的SQL。
*/
int result = sqlSession.insert("edu.wzm.mybatis.mapping.PersonMapper.insert", person);
System.out.println(result);
sqlSession.close();
}
public void getAll(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Person> persons = sqlSession.selectList("edu.wzm.mybatis.mapping.PersonMapper.getAll");
System.out.println(persons);
sqlSession.close();
}
public void getById(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
Person person = sqlSession.selectOne("edu.wzm.mybatis.mapping.PersonMapper.getById", 1);
System.out.println(person);
sqlSession.close();
}
public void update(){
Person person = new Person();
person.setId(7);
person.setAge(27);
SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.update", person);
System.out.println(result);
sqlSession.close();
}
public void delete(){
SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.delete", 6);
System.out.println(result);
sqlSession.close();
}
}
之後,還要啟動 MyBatis 的 SQLSession 才能真正使用 MyBatis,下面是 MyBatis 的工具類:
public class MyBatisUtils {
public static SqlSessionFactory getSqlSessionFactory(){
InputStream is = MyBatisUtils.class.getClassLoader().getResourceAsStream(Const.MYBATIS_CONFIG_FILE);
return new SqlSessionFactoryBuilder().build(is);
}
/**
* @param autoCommit
* true: 表示建立的SqlSession物件在執行完SQL之後會自動提交事務
* false: 表示建立的SqlSession物件在執行完SQL之後不會自動提交事務,這時就需要我們手動呼叫sqlSession.commit()提交事務
* @return
*/
public static SqlSession getSqlSession(boolean autoCommit){
return getSqlSessionFactory().openSession(autoCommit);
}
public static SqlSession getSqlSession(){
return getSqlSessionFactory().openSession();
}
}
測試程式碼:
public class Driver {
public static void main(String[] args)throws Exception{
PersonServices services = new PersonServices();
services.getById();
services.add();
services.update();
services.delete();
services.getAll();
}
}