目錄
- MyBatis概述
- 建立項目
- 建立一個子產品
- 測試
- CRUD
- 1.namespace
- 2.select
- 3.insert
- 4.update
- 5.delete
- 萬能的map
- 模糊查詢怎麼實作
- 2.環境配置(environments)
- 3.屬性(properties)
- 類型别名(typeAliases)
- 分頁
- 1.使用limit分頁
- 使用注解開發
MyBatis是一個優秀的持久層架構,它對jdbc的操作資料庫的過程進行封裝,使開發者隻需要關注SQL本身,而不需要花費精力去處理例如注冊驅動、建立connection、建立statement、手動設定參數、結果集檢索等jdbc繁雜的過程代碼。
1.建立一個普通的maven項目
2.删除src目錄
3.導入maven依賴
1.編寫mybatis的核心配置檔案
<?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.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="fa6298500"/>
</dataSource>
</environment>
</environments>
</configuration>
2.編寫mybatis工具類
//mybatis工具類
//sqlSessionFactory --> sqlSession
public class MybatisUtils
{
private static SqlSessionFactory sqlSessionFactory;
static
{
try
{
//使用mybatis獲得sqlSessionFactory對象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
catch (IOException e)
{
e.printStackTrace();
}
}
//既然有了sqlSessionFactory,就可以從中獲得sqlSession執行個體了
//sqlSession完全包含了面向資料庫執行SQL指令所需的所有方法
public static SqlSession getSqlSession()
{
return sqlSessionFactory.openSession();
}
}
3.編寫實體類
package com.pojo;
//資料庫實體類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User
{
private int id;
private String name;
private String pwd;
}
4.Dao接口
public interface UserDao
{
List<User> getUserList();
}
5.接口實作類
<?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/Mapper接口-->
<mapper namespace="com.dao.UserDao">
<!-- select查詢語句 -->
<select id="getUserList" resultType="com.pojo.User">
select * from mybatislearn.user;
</select>
</mapper>
org.apache.ibatis.binding.BindingException: Type interface com.dao.UserMapper is not known to the MapperRegistry.
錯誤原因:每一個mapper檔案都需要在Mybatis核心配置檔案中注冊
java.lang.ExceptionInInitializerError
錯誤原因:maven的約定大于配置
解決方法:
在build中配置resources,來防止資源導出失敗的問題
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
這段代碼放入兩個pom.xml中
namespace中的包名要與Dao/mapper接口的包名一緻
選擇,查詢語句;
- id:對應namespace中的方法名
- resultType:sql語句執行的傳回值
- parameterType:參數類型
1.編寫接口
//查詢全部使用者
List<User> getUserList();
2.編寫對應的mapper中的sql語句
<select id="getUserList" resultType="com.pojo.User">
select * from mybatislearn.user;
</select>
3.測試
@Test
public void test()
{
try (SqlSession sqlSession = MybatisUtils.getSqlSession())
{
//第一步,擷取SqlSession對象
//第二步,執行sql
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
<!--對象中的屬性,可以直接取出來 -->
<insert id = "addUser" parameterType = "com.pojo.User">
insert into mybatislearn.user(id, name, pwd) values(#{id},#{name},#{pwd});
</insert>
<update id = "updateUser" parameterType = "com.pojo.User">
update mybatislearn.user set name = #{name},pwd = #{pwd} where id = #{id};
</update>
<delete id = "deleteUser" parameterType = "com.pojo.User">
delete from mybatislearn.user where id = #{id};
</delete>
注意點
- 增删改需要送出事務
sqlSession.commit();
假設我們的實體類或者資料庫中的表,字段或者參數過多,我們應當考慮使用map
int addUser2(Map<String, Object> map);
<insert id = "addUser2" parameterType = "map">
insert into mybatislearn.user(id,pwd) values (#{userID},#{passWord});
</insert>
@Test
public void getUserById2()
{
try(SqlSession sqlSession = MybatisUtils.getSqlSession())
{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("mima","123456");
userMapper.getUserById2(map);
sqlSession.commit();
}
}
Map傳遞參數,直接在sql中取出key即可(parameterType = "map")
對象傳遞參數,直接在sql中取對象的屬性即可(parameterType = "Object")
隻有一個參數的情況下,可以直接在sql中取到!
多個參數用map或者注解
1.Java代碼執行的時候,傳遞通配符% %
List<User> userList= userMapper.getUserLike("%李%");
2.在sql拼接中使用通配符!
select * from mybatislearn.user where name like "%"#{value}"%";
MyBatis可以配置成适應多種環境
不過要記住:盡管可以配置多個環境,但每個SqlSessionFactory執行個體隻能選擇一種環境
預設事務管理器:JDBC 連接配接池:POOLED
我們可以通過properties來實作引用配置檔案
這些屬性都是可外部配置且可動态替換的,既可以在典型的Java屬性檔案中配置,
也可通過properties元素的子元素來傳遞【db.properties】
編寫一個配置檔案
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
在核心配置檔案中映入
<!-- 引入外部配置檔案 -->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="fa6298500"/>
</properties>
- 可以直接引入外部檔案
- 可以在其中增加一些屬性配置
- 如果兩個檔案有同一個字段,優先使用外部配置檔案的!
類型别名可為 Java 類型設定一個縮寫名字。 它僅用于 XML 配置,意在降低備援的全限定類名書寫
<!-- 可以給實體類起别名 -->
<typeAliases>
<typeAlias type = "com.pojo.User" alias="User"/>
</typeAliases>
也可以指定一個包名,MyBatis會在包名下面搜尋需要的Java Bean,比如:掃描實體類的包,它的預設别名就為這個類的類名,首字母小寫。
<!-- 可以給實體類起别名 -->
<typeAliases>
<package name = "com.pojo"/>
</typeAliases>
在實體類比較少的時候,使用第一種方式
如果實體類十分多,建議使用第二種
第一種可以DIY别名,第二種不行,如果非要改,需要在實體上添加注解
- 減少資料的處理量
文法:select * from user limit startIndex,pageSize;
使用mybatis實作分頁,核心sql
1.接口
List<User> getUserByLimit(Map<String, Object> map);
2.Mapper.xml
<select id="getUserByLimit" parameterType="map" resultType="User">
select * from mybatislearn.user limit #{startIndex},#{pageSize};
</select>
public void getUserByLimit()
{
try(SqlSession sqlSession = MybatisUtils.getSqlSession())
{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("startIndex",0 );
map.put("pageSize",2);
List<User> userList = userMapper.getUserByLimit(map);
for (User user : userList)
{
System.out.println(user);
}
}
}
1.注解在接口上實作
@Select("select * from mybatislearn.user")
List<User> getUsers();
}
2.需要在核心配置檔案中綁定接口
<!--綁定接口 -->
<mappers>
<mapper class="com.dao.UserMapper"/>
</mappers>
SpringBoot整合MyBatis
整合包
mybatis-spring-boot-starter
1.導入包
2.配置檔案
3.mybatis配置
4.編寫sql
5.service層調用dao層
6.controller調用service層
總結
整體來說Mybatis的學習難度不大,and用XML寫sql真的香啊!不用頻繁修改代碼裡的sql語句很友善!具體可以去參考狂神說Java的Mybatis學習視訊。