目的:入門,熟悉mybatis是什么,怎么用。
1. 初識Mybatis
1.1 Mybatis介紹
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀基于Java的持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對結(jié)果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
與hibernate相比:
特點:
1.開源持久層框架
2.靈活--sql語句與代碼分離,面向配置的編程
3.良好支持復(fù)雜數(shù)據(jù)映射,動態(tài)sql
4.學(xué)習(xí)成本低
2. Mybatis快速入門
2.0 Jar包下載
mybatis官網(wǎng)下載
mybaits里面jar包分為兩類,一類是mybatis本身 jar,另一類是依賴的ajr.
mybatis文檔查看
mybatis-spring
2.1開發(fā)環(huán)境搭建
1.創(chuàng)建測試項目:

2.添加相應(yīng)的包:

3.創(chuàng)建數(shù)據(jù)庫和表
CREATE database mybatis;
USE mybatis;
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=5 DEFAULT CHARSET=latin1;
INSERT INTO users(NAME, age) VALUES('Demo', 27);
INSERT INTO users(NAME, age) VALUES('Collin', 28);
??:此數(shù)據(jù)表中編碼為latin1,默認(rèn)編碼---未做修改,一般設(shè)置為utf-8;
2.2 使用MyBatis查詢表中的數(shù)據(jù)
0.mybatis工作流程
1.讀取配置文件
2.生成sqlSessionFactory
3.建立sqlSession
4.調(diào)用mybatis提供的API
5.查詢mapper配置文件
6.返回結(jié)果
7.關(guān)閉sqlSession
1.添加Mybatis的配置文件config.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">
<!-- 設(shè)置 -->
<configuration>
<!-- 和spring整合之后environments配置將廢除 -->
<!--配置環(huán)境 -->
<environments default="development">
<!-- 環(huán)境變量 -->
<environment id="development">
<!-- 事務(wù)管理 -->
<transactionManager type="JDBC" />
<!--配置數(shù)據(jù)庫連接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 注冊userMapper.xml文件, userMapper.xml位于cn.it.my.mapping這個包下,
所以resource寫成cn/it/my/mapping/userMapper.xml -->
<mappers>
<!-- 映射器 -->
<mapper resource="cn/it/my/mapping/userMapper.xml" />
</mappers>
</configuration>
2.定義表所對應(yīng)的實體類
Users.java
package cn.it.my.domain;
public class User {
private int id;
private String name;
private int age;
public User() {
super();
}
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 + "]";
}
}
3.定義操作users表的sql映射文件userMapper.xml
<?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="cn.it.my.mapping.userMapper"就是cn.it.my.mapping(包名)+userMapper(userMapper.xml文件去除后綴)
-->
<mapper namespace="cn.it.my.mapping.userMapper">
<!-- 在select標(biāo)簽中編寫查詢的SQL語句, 設(shè)置select標(biāo)簽的id屬性為findUserById,id屬性值必須是唯一的,不能夠重復(fù)
使用parameterType屬性指明查詢時使用的參數(shù)類型,resultType屬性指明查詢返回的結(jié)果集類型
resultType="cn.it.my.domain.User"就表示將查詢結(jié)果封裝成一個User類的對象返回
User類就是users表所對應(yīng)的實體類
-->
<!-- 根據(jù)id查詢得到一個user對象-->
<select id="findUserById" parameterType="int"
resultType="cn.it.my.domain.User">
select * from users where id=#{id}
</select>
</mapper>
4.在config.xml文件中注冊userMapper.xml文件
<!-- 注冊userMapper.xml文件, userMapper.xml位于cn.it.my.mapping這個包下,
所以resource寫成cn/it/my/mapping/userMapper.xml -->
<mappers>
<!-- 映射器 -->
<mapper resource="cn/it/my/mapping/userMapper.xml" />
</mappers>
5.測試代碼:
public class Test {
public static void main(String[] args) throws Exception {
// 第一步:根據(jù)mytais的配置創(chuàng)建SqlSessionFactory------加載mybatis的配置文件
String resource = "mybatis.xml";
// 使用類加載器加載mybatis的配置文件(它也加載關(guān)聯(lián)的映射文件)
// InputStream is =
// Test.class.getClassLoader().getResourceAsStream(resource);
InputStream is = Resources.getResourceAsStream(resource);
// 根據(jù),mybatis配置創(chuàng)建sqlSessionFactory
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);
// 第二步:根據(jù)SqlSessionFactory創(chuàng)建能執(zhí)行映射文件中sql的sqlSession
SqlSession sqlSession = sessionFactory.openSession();
// 第三步:通過SqlSession操作數(shù)據(jù)庫(根據(jù)用戶id查詢一條記錄)
/**
* 通過sqlSession查詢用戶信息(發(fā)起數(shù)據(jù)庫操作)
* 第一個參數(shù)statement:指定mapper映射文件中statement的id,指定時需要前邊加上statement所屬的命名空間
* 第二個參數(shù)parameter。指定輸入?yún)?shù)
* selectOne返回時單條記錄,如果色了傳統(tǒng)返回多條記錄(list集合),使用selectOne會報錯
* 根據(jù)映射文件中的resultType指定輸出類型
*
* 映射sql的標(biāo)識字符串,
* cn.it.mapping.userMapper是userMapper.xml文件中mapper標(biāo)簽的namespace屬性的值,
* findUserById是select標(biāo)簽的id屬性值,通過select標(biāo)簽的id屬性值就可以找到要執(zhí)行的SQL
*/
// 映射sql的標(biāo)識字符串
// String statement = "cn.it.my.mapping.userMapper.getUser";
// 執(zhí)行查詢返回一個唯一user對象的sql
// User user = sqlSession.selectOne(statement, 1);
User user = sqlSession.selectOne("cn.it.my.mapping.userMapper.findUserById", 3);
// 第四步:遍歷查詢結(jié)果
System.out.println(user);
/*
* selectlist,查詢集合
* 查詢用戶列表
* selectList表示查詢一個結(jié)果集(可以是多條。也可以是一條)
*/
List<User> list= sqlSession.selectList("test.findUserList","張");
// 第五步:
sqlSession.close();
}
}
mybatis核心組件:
1.SqlSessionFactoryBuilder:構(gòu)造器,根據(jù)配置信息或者代碼來生成
2 SqlSessionFactory(工廠接口)
3.SqlSessionFactory:依賴工廠來生成SqlSession(會話)
4.SqlSession:既可以返送sql去執(zhí)行并返回結(jié)果,又可以獲取Mapper的接口
5.SqlMapper:由Java接口和XML文件共同構(gòu)成,需要給出對應(yīng)的sql和映射規(guī)則,負(fù)責(zé)發(fā)送sql去執(zhí)行并返回結(jié)果
開發(fā)規(guī)范:
1.在mapper.xml中namespace等于mapper接口地址
2.mapper.java接口中的方法名和mapper.xml中statement的id一致
3.mapper.java接口中的方法輸入?yún)?shù)類型和mapper.xml中statement的parameterType指定的類型一致
4.mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致
??作用:
????定義參數(shù)類型
????描述緩存
????描述SQL語句
????定義查詢結(jié)果和POJO的映射關(guān)系
6.執(zhí)行結(jié)果:
