入門概述
Mybatis框架
1.入門
1.1簡述mybatis
mybatis是一個持久成框架,簡化了我們與數據庫的交互。使我們只需要關注sql語句本身,而不需要花費精力取處理加載驅動、創建連接、創建statement等繁雜的過程。
1.2瞭解mybatis
- mybatis通過xml或註解的方式將要執行的各種statement配置起來.
- 通過對象和statement中的sql的動態參數進行映射生成最終的sql語句
- mybatis框架執行sql並將結果映射爲java對象並返回。
- 是通過ORM思想實現了結果集的封裝。
1.3回顧JDBC
- 註冊驅動
- 獲取數據庫連接對象
- 定義Mysql語句
- 獲取執行Mysql
- 執行
- 處理結果
- 釋放資源
import java.sql.*;
/**
*添加一條記錄
*/
public class JDBCdemo03 {
public static void main(String[] args) {
Connection conn =null;
Statement statement=null;
try {
//註冊驅動
Class.forName("com.mysql.cj.jdbc.Driver");
//定義sql
String sql = "insert into cat(name ,age ,id ) values ('湯姆',18,1003)";
//獲取數據庫連接對象
try {
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/hello?serverTimezone=UTC", "root", "990801lxq");
//獲取sql執行對象
statement = conn.createStatement();
//執行sql
int i = statement.executeUpdate(sql);
if(i>0){
System.out.println("添加成功"+"/t"+"共有"+i+"語句受到影響");
}else {
System.out.println("添加失敗");
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement !=null){
try {
statement.cancel();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
1.4搭建環境
- 創建表
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '湯姆', '12354');
INSERT INTO `user` VALUES (2, '喬恩', '123');
INSERT INTO `user` VALUES (3, '張三', '123');
INSERT INTO `user` VALUES (5, '類鱷類', '12345');
-
新建maven項目
-
導入依賴
- 主要的依賴
<!-- mysql依賴--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </depe
- 可以增加的依賴
<!-- junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!-- log4j--> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 找不到配置文件的依賴
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
配置環境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">
<!-- configuration核心配置文件-->
<configuration>
<!-- 環境配置 環境可以有多套 default="環境id"-->
<environments default="development">
<environment id="development">
<!-- 配置事務類型-->
<transactionManager type="JDBC"/>
<!-- 配置數據源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="990801lxq"/>
</dataSource>
</environment>
</environments>
</configuration>
- 編寫pojo
package cn.guoke.pojo;
import lombok.Data;
@Data
public class User {
private int id;
private String name;
private String pwd;
}
這個是需要get set 方法的 爲了省事使用了lombok
lombok的座標
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
- 編寫UserMapper接口
package cn.guoke.dao;
import cn.guoke.pojo.User;
import java.util.List;
public interface UserMapper {
//獲取所有的user
List<User> getUserList();
}
-
編寫對應的UserMapper.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.guoke.dao.UserMapper"> <select id="getUserList" resultType="cn.guoke.pojo.User"> select * from User where 1=1 </select> </mapper>
- namespace 對應UserMapper的接口
- namespace對應接口中編寫的方法、
- resultType返回值類型
-
在編寫完UserMapper.xml後我們要在mybatis-config.xml對其經行映射
<mappers> <mapper resource="cn/guoke/dao/UserMapper.xml"/> </mappers>
有四種映射的方式:
- resource:使用相對於類路徑的資源引用
- url:使用完全限定資源定位符(URL
- class:使用映射器接口實現類的完全限定類名
- name:將包內的映射器接口實現全部註冊爲映射器
這樣我們的環境就搭建完成了
2.CRUD
我們要使用mybatis需要一個SqlSessionFactory 實例。
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲核心的。
SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。
而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。
2.1直接獲取SqlSessionFactory
package cn.guoke.dao;
import cn.guoke.pojo.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.Test;
import java.io.InputStream;
import java.util.List;
public class UserMapperTest {
@Test
public void test01() throws Exception {
/**
* 1.讀取配置文件
* 2.創建SqlSessionFactory 工廠
* 3.使用工廠產生SqlSession對象
* 4.使用SqlSession創建Dao接口的代理對象
* 5.使用代理對象執行方法
* 6.釋放資源
*/
//1.
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
//2.
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(input);
//3.
SqlSession sqlSession = factory.openSession();
//4
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//5.
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//6.
sqlSession.close();
input.close();
}
}
2.2編寫工具類
我們看到每次測試的時候我們都需要獲取一個SqlSession
我們可以編寫一個工具類,來方便測試
package cn.guoke.utils;
import cn.guoke.dao.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionException;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtils {
private static SqlSessionFactory factory;
static {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return factory.openSession();
}
}
測試:
@Test
public void test2(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
2.3 CRUD使用xml實現
- 在UserMapper中增加CRUD的方法
package cn.guoke.dao;
import cn.guoke.pojo.User;
import java.util.List;
public interface UserMapper {
//獲取所有的user
List<User> getUserList();
//根據ID查詢用戶
User getUserID(int id);
//增加一個用戶
int addUser(User user);
//修改一個用戶
int intoUser(int id);
//刪除一個用戶
int delUser(int id);
}
-
編寫UserMapper.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.guoke.dao.UserMapper"> <select id="getUserList" resultType="cn.guoke.pojo.User"> select * from User where 1=1 </select> <select id="getUserID" resultType="cn.guoke.pojo.User" parameterType="int"> select * from USER where id=#{id} </select> <insert id="addUser" parameterType="cn.guoke.pojo.User"> insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd}); </insert> <update id="intoUser" parameterType="cn.guoke.pojo.User"> update user set name=#{name},pwd=#{pwd} where id=#{id}; </update> <delete id="delUser" parameterType="int"> delete from user where id = #{id} </delete> </mapper>
-
parameterType 傳遞參數的數據類型
- #{id} 用來傳遞參數
2.4使用註解看配置
- 配置mappers
<mappers>
<mapper class="guoke.dao.UserMapper"/>
</mappers>
- 使用註解
package guoke.dao;
import guoke.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
//獲取所有的user
@Select("select * from User")
List<User> getUserList();
}
2.5模糊查詢
- 在接口中增加一個發法
//模糊查詢
List<User> getUserByName(String name);
- 測試
public void test4(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userByName = mapper.getUserByName("%張%");
for (User user : userByName) {
System.out.println(user);
}
sqlSession.close();
}
除去上述方法,含可以在xml中配置
<select id="getUserByName" resultType="cn.guoke.pojo.User" parameterType="String">
select * from USER where name like '%${value}%'
</select>
2.6使用聚合函數
和上述一樣定義接口返回就可以了
3.mybatis參數
3.1parameterType
- 傳遞簡單類型
- 傳遞pojo對象
- 傳遞pojo包裝對象
3.2resultType
- 簡單類型
- pojo對象
- pojo列表
3.3resultMap
<resultMap id="UserMap" type="cn.guoke.pojo.User">
<!-- 主鍵使用id-->
<id property="user" column="id"></id>
<!-- 其他字段-->
<result property="username" column="name"/>
</resultMap>