Mybatis新手教程之簡(jiǎn)單入門
1、Mybatis概述
MyBatis 是支持普通 SQL 查詢(相比較于Hibernate的封裝,Mybatis是半自動(dòng)化的JDBC封裝,一個(gè)特點(diǎn)就是Mybatis執(zhí)行的SQL查詢語(yǔ)句需要自己在配置文件中寫),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的 JDBC 代碼和參數(shù)的手工設(shè)置以及對(duì)結(jié)果集的檢索。MyBatis 可以使用簡(jiǎn)單的XML 或注解用于配置和原始映射,將接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
2、Mybatis原理解析
下面以Mybatis簡(jiǎn)單的執(zhí)行流程

1、加載mybatis全局配置文件(數(shù)據(jù)源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一個(gè)個(gè)MappedStatement(包括了參數(shù)映射配置、動(dòng)態(tài)SQL語(yǔ)句、結(jié)果映射配置),其對(duì)應(yīng)著<select | update | delete | insert>標(biāo)簽項(xiàng)。
2、SqlSessionFactoryBuilder通過(guò)Configuration對(duì)象生成SqlSessionFactory,用來(lái)開啟SqlSession。
3、SqlSession對(duì)象完成和數(shù)據(jù)庫(kù)的交互:
a、用戶程序調(diào)用mybatis接口層api(即Mapper接口中的方法)
b、SqlSession通過(guò)調(diào)用api的Statement ID找到對(duì)應(yīng)的MappedStatement對(duì)象
c、通過(guò)Executor(負(fù)責(zé)動(dòng)態(tài)SQL的生成和查詢緩存的維護(hù))將MappedStatement對(duì)象進(jìn)行解析,sql參數(shù)轉(zhuǎn)化、動(dòng)態(tài)sql拼接,生成jdbc Statement對(duì)象
d、JDBC執(zhí)行sql。
e、借助MappedStatement中的結(jié)果映射關(guān)系,將返回結(jié)果轉(zhuǎn)化成HashMap、JavaBean等存儲(chǔ)結(jié)構(gòu)并返回。
下面是Mybatis的框架原理圖

3、Mybatis簡(jiǎn)單實(shí)例
(1)導(dǎo)入相關(guān)jar包以及Mybatis運(yùn)行環(huán)境核心jar包和連接數(shù)據(jù)庫(kù)的包

(2)創(chuàng)建一張簡(jiǎn)單的數(shù)據(jù)表

(3)創(chuàng)建Java對(duì)象(PO類型)
package cn.mybatis.po;
public class User {
private int id;
private String username;
private String password;
private String address;
private String sex;
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getAddress() {
return address;
}
public String getSex() {
return sex;
}
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAddress(String address) {
this.address = address;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
User實(shí)體類
(4)創(chuàng)建Mybatis核心配置文件(SqlMapConfig.xml)
在核心配置文件配置連接數(shù)據(jù)庫(kù)的相關(guān)信息,(如果是和Spring整合,則可以放在Spring配置文件中進(jìn)行對(duì)數(shù)據(jù)庫(kù)的配置)
<?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> <!--加載資源文件--> <!-- <properties resource="jdbc.properties"></properties> <!–settings配置LOG4J輸出日志 –> <settings> <setting name="logImpl" value="LOG4J"/> </settings>--> <!--typeAliases配置包的別名--> <!--environments配置了數(shù)據(jù)庫(kù)連接,配置了driver、url、username、password屬性--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <!--<property name="" value="" />--> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///mybatis01" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> <!--配置一個(gè)SQL語(yǔ)句和映射的配置文件--> <mappers> <mapper resource="UserMapper.xml" /> </mappers> </configuration> Mybatis核心配置文件
(5)創(chuàng)建一個(gè)Mapper.xml文件,對(duì)應(yīng)編寫所需要的Sql查詢操作
<?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指定了命名空間-->
<mapper namespace="test">
<!--定義一個(gè)SELECT查詢-->
<!--parameterType:指定輸入?yún)?shù)的類型-->
<!--#{}表示占位符-->
<!--#{id}:其中的id表示的就是接受的輸入?yún)?shù),
參數(shù)名稱就是id,
這里指出:如果輸入?yún)?shù)是簡(jiǎn)單類型,#{}中的參數(shù)名可以任意設(shè)置(value或者其他名稱)-->
<!--resultType:指定輸出類型(即指定輸出結(jié)果所映射的Java對(duì)象類型)-->
<select id="findUserById" parameterType="int" resultType="cn.mybatis.po.User">
SELECT * FROM t_user WHERE id = #{id}
</select>
</mapper>
UserMapper配置文件
(7)創(chuàng)建測(cè)試程序,對(duì)剛剛編寫的select查詢進(jìn)行測(cè)試
package cn.mybatis.first;
import cn.mybatis.po.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 java.io.IOException;
import java.io.InputStream;
public class Test {
public User findUserById() throws IOException {
//得到mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件的文件流信息
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建會(huì)話工廠 傳入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過(guò)會(huì)話工廠得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通過(guò)sqlSession來(lái)操作數(shù)據(jù)庫(kù)
//第一個(gè)參數(shù)就是映射文件中statment的id:namespace +statment的id
//第二個(gè)參數(shù)就是制定映射文件中的parameterType類型的參數(shù)
User user = sqlSession.selectOne("test.findUserById",1);
//System.out.println(user);
//釋放會(huì)話資源
try {
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test = new Test();
try {
System.out.println(test.findUserById());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Test測(cè)試程序
(8)加入Log4j日志文件
### direct log messages to stdout ### log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n Log4j.properties
(9)測(cè)試結(jié)果

4.其他CRUD操作
(1)insert操作
在Mapper文件中添加響應(yīng)的SQL配置,以及使用MySQL中的LAST_INSERT_ID()函數(shù)得到增加的數(shù)據(jù)的主鍵值
<insert id="addUser" parameterType="cn.mybatis.po.User">
<!--
現(xiàn)在需要得到剛剛插入的記錄中的主鍵值,只適用于自增主鍵的情況
LAST_INSERT_ID()
keyProperty:將查詢到的主鍵值設(shè)置到parameterType指定對(duì)象中的那個(gè)屬性
order:指定相對(duì)于insert的順序
resultType:指定映射結(jié)果的結(jié)果類型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO t_user(id,username,password,address,sex) VALUES(#{id},#{username},#{password},#{address}, #{sex});
</insert>
插入數(shù)據(jù)的日志信息,沒有使用sqlSession.commit();之前的日志情況

從上面的圖中可以看出,沒有添加commit的時(shí)候,事務(wù)進(jìn)行了回滾,所以要想添加數(shù)據(jù),需要自己手動(dòng)提交(在沒有整合Spring之前)

附上insertUser的函數(shù)
public void inserUser() throws IOException {
//得到配置文件的文件流信息
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User("World","1234","武漢市","男");
sqlSession.insert("test.addUser",user);
System.out.println(user.getId());
sqlSession.commit();
//釋放會(huì)話資源
try {
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
inserUser函數(shù)
(2)模糊查詢
首先配置Mapper文件,${}和#{}的簡(jiǎn)單區(qū)別如下:
<!--
模糊查詢可能會(huì)查詢多條記錄
resultType:指定的就是查詢結(jié)果對(duì)應(yīng)的單條記錄類型
${}:表示將輸入的參數(shù)不加任何的修飾,直接作為字符串拼接在SQL中
但是這樣直接拼接,容易導(dǎo)致SQL注入的隱患
${value}中的value表示接受的輸入?yún)?shù),注意如果輸入?yún)?shù)是簡(jiǎn)單類型,其中的形參只能用value
-->
<select id="findUserByUsername" parameterType="java.lang.String" resultType="cn.mybatis.po.User">
SELECT * FROM t_user WHERE username LIKE '%${value}%'
</select>

使用查詢的時(shí)候碰到一個(gè)小錯(cuò)誤,由于之前測(cè)試的insert方法,其中在User實(shí)體類中添加了有參構(gòu)造函數(shù),所以出現(xiàn)了下面的錯(cuò)誤,分析原因就是:使用Mybatis查詢的時(shí)候需要在實(shí)體類中加入無(wú)參構(gòu)造方法(當(dāng)然如果實(shí)體類本身沒有構(gòu)造函數(shù),就會(huì)是默認(rèn)的無(wú)參構(gòu)造函數(shù))

附上findByUsername的函數(shù)實(shí)現(xiàn)
public void findUserByUsername() throws IOException {
//得到配置文件的文件流信息
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> userList = sqlSession.selectList("test.findUserByUsername","u");
System.out.println(userList);
//釋放會(huì)話資源
try {
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
findByUsername函數(shù)實(shí)現(xiàn)
(3)刪除操作
首先在Mapper中配置刪除的操作
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM t_user WHERE id = #{value}
</delete>
運(yùn)行測(cè)試程序,同insert中一樣,需要手動(dòng)提交事務(wù),如下面所示

最終結(jié)果:
數(shù)據(jù)表中刪除了編號(hào)為10的數(shù)據(jù)記錄


5.細(xì)節(jié)整理
(1)關(guān)于示例程序中一些相關(guān)類的理解
a)SqlSessionFactoryBuilder
用來(lái)創(chuàng)建SqlSessionFactory。因?yàn)镾qlSessionFactory使用了單例模式,所以不需要使用單例模式來(lái)管理SqlSessionFactoryBuilder,只需要在創(chuàng)建SqlSessionFactory時(shí) 候使用一次就可以
b)SqlSessionFactory
會(huì)話工廠,用來(lái)創(chuàng)建SqlSession??梢允褂脝卫J絹?lái)管理SqlSessionFactory這個(gè)會(huì)話工廠,工廠創(chuàng)建之后,就一直使用一個(gè)實(shí)例。
c)SqlSession
面向程序員的接口,提供了操作數(shù)據(jù)庫(kù)的方法。SqlSession是線程不安全的(原因:在SqlSession實(shí)現(xiàn)類中除了接口中的操作數(shù)據(jù)庫(kù)的方法之外,還有數(shù)據(jù)域的屬性,比如說(shuō)一些提交的數(shù)據(jù)等等,所以在多線程并發(fā)請(qǐng)求的時(shí)候,會(huì)導(dǎo)致線程不安全),所以我們可以將SqlSession使用在方法體里面,這樣每個(gè)線程都有自己的方法,就不會(huì)沖突
(2)Mybatis中mapper映射文件
如同解釋Mybatis執(zhí)行原理的時(shí)候一樣,Mapper映射文件中配置的Sql語(yǔ)句,實(shí)際上在執(zhí)行的時(shí)候都被封裝稱為一個(gè)個(gè)MapperStatment對(duì)象,即Mapper映射文件是按照statment來(lái)管理不同的Sql。在編寫程序的時(shí)候,我們?cè)谑褂肧qlSession其中的操作數(shù)據(jù)庫(kù)的方法(selectOne,selectList等等)的時(shí)候,傳入的參數(shù)除了實(shí)參(id,模糊查詢的字符串等等)之外,還需要傳入的就是相應(yīng)的Sql位置,而Sql是被Statment管理,所以就是傳入namespace+statmentId
(3)占位符
#{id}:其中的id表示的就是接受的輸入?yún)?shù),參數(shù)名稱就是id,這里指出:如果輸入?yún)?shù)是簡(jiǎn)單類型,#{}中的參數(shù)名可以任意設(shè)置(value或者其他名稱)
${value}:表示將輸入的參數(shù)不加任何的修飾,直接作為字符串拼接在SQL中但是這樣直接拼接,容易導(dǎo)致SQL注入的隱患${value}中的value表示接受的輸入?yún)?shù),注意如果輸入?yún)?shù)是簡(jiǎn)單類型,其中的形參只能用value
(4)別名定義
①單個(gè)別名的定義
<typeAliases> <!--針對(duì)單個(gè)別名的定義--> <typeAlias type="cn.mybatis.po.User" alias="user"></typeAlias> </typeAliases>
定義別名后的使用
<select id="findUserByIdTest" parameterType="int" resultType="user">
SELECT * FROM t_user WHERE id = #{id}
</select>
②批量別名的定義
<typeAliases> <!--批量別名定義:Mybatis在定義別名的時(shí)候會(huì)自動(dòng)掃描包中的po類,自動(dòng)的將別名定義為類名(首字母大寫或者小寫都可以)--> <package name="cn.mybatis.po"></package> </typeAliases>
(5)在SqlMapConfig.xml中加載Mapper映射文件的時(shí)候,除了通過(guò)resource的方式,還可以使用mapper接口加載的方式來(lái)實(shí)現(xiàn)
?、偈紫认茸⒁庖稽c(diǎn):
在配置mybatis-config.xml時(shí),其中的節(jié)點(diǎn)是有順序的,配置順序依次為:
properties/settings/typeAliases/typeHandlers/objectFactory/objectWrapperFactory/plugins/environments/databaseIdProvider/mappers
②使用mapper加載的方式,要將mapper接口和mapper配置文件放在同一目錄下面,并且文件名稱一致,而且要遵循mapper代理的方式進(jìn)行開發(fā)
<mappers> <mapper class="cn.mybatis.mapper.UserMapper"></mapper> </mappers>

6.Mybatis開發(fā)dao方法簡(jiǎn)介
?。?)使用dao接口+實(shí)現(xiàn)類的方式
a)首先編寫接口,如同一般編寫模式方式進(jìn)行編寫
package cn.mybatis.dao;
import cn.mybatis.po.User;
/**
* 原始Dao方式開發(fā):dao接口+dao實(shí)現(xiàn)類的方式
*/
public interface UserDao {
//根據(jù)id查詢信息
public User findUserById(int id) throws Exception;
//添加信息
public void insertUser(User user) throws Exception;
//刪除信息
public void deleteUser(int id) throws Exception;
}
dao接口
b)然后編寫接口實(shí)現(xiàn)
package cn.mybatis.dao.daoImpl;
import cn.mybatis.dao.UserDao;
import cn.mybatis.po.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
public class UserDaoImpl implements UserDao {
//使用構(gòu)造方法注入SqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
@Test
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
return user;
}
@Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// User user1 = new User("test1","123","洪山區(qū)","男");
sqlSession.insert("test.findUserById",user);
sqlSession.commit();
sqlSession.close();
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.findUserById",id);
sqlSession.commit();
sqlSession.close();
}
}
dao接口實(shí)現(xiàn)類
c)Mapper配置文件和SqlConfig配置文件不變
d)使用Junit進(jìn)行測(cè)試
package cn.mybatis.testdao;
import cn.mybatis.dao.UserDao;
import cn.mybatis.dao.daoImpl.UserDaoImpl;
import cn.mybatis.po.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
//創(chuàng)建UserDao的對(duì)象
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//調(diào)用UserDao的方法
User user = userDao.findUserById(1);
System.out.println(user );
}
}
Junit測(cè)試
e)測(cè)試結(jié)果

f)原始dao方法的問題
?、賒ao接口實(shí)現(xiàn)中存在大量的模板方法(即很多重復(fù)性的代碼 )
②調(diào)用SqlSession方法的時(shí)候?qū)tatmentid硬編碼了
?、蹢l用SqlSession方法的時(shí)候傳入的參數(shù),由于使用泛型,所以在編譯階段不會(huì)報(bào)錯(cuò)(即使傳入?yún)?shù)錯(cuò)誤)
?。?)使用Mapper代理的方法(即只需要Mapper接口)
?。╝)使用mapper方式的規(guī)范
?、僭谑褂胢apper代理的方式中,namespace的值應(yīng)該是mapper接口的路徑
②在mapper.java接口文件中的接口方法名稱和mapper.xml中的statment的id一致
?、墼趍apper.java接口文件中的接口方法的輸入?yún)?shù)和mapper.xml中的statment的parameterType一致
?、茉趍apper.java接口文件中的接口方法的返回值類型和mapper.xml中的statment的resultType一致
(b)查詢、刪除操作實(shí)例
?、倬帉憁apper.xml配置文件,其中包含select和delete的sql配置
<?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指定了命名空間-->
<!--在使用mapper代理的方式中,namespace的值應(yīng)該是mapper接口的路徑-->
<mapper namespace="cn.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="cn.mybatis.po.User">
SELECT * FROM t_user WHERE id = #{id}
</select>
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM t_user WHERE id = #{value}
</delete>
</mapper>
mapper.xml配置文件
?、诰帉憁apper接口,按照mapper代理的方式開發(fā)規(guī)范來(lái)編寫mapper的接口
package cn.mybatis.testmapper;
import cn.mybatis.mapper.UserMapper;
import cn.mybatis.po.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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到UserMapper的代理對(duì)象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(9);
System.out.println(user);
}
@Test
public void testDeleteUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(9);
sqlSession.commit();
}
@After
public void tearDown() throws Exception {
}
}
mapper接口
?、跩unit測(cè)試
package cn.mybatis.testmapper;
import cn.mybatis.mapper.UserMapper;
import cn.mybatis.po.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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
//得到UserMapper的代理對(duì)象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(8);
System.out.println(user);
}
@Test
public void testDeleteUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(8);
}
@After
public void tearDown() throws Exception {
}
}
Junit測(cè)試
?、懿樵兘Y(jié)果展示

?、輨h除結(jié)果展示

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- MyBatis入門學(xué)習(xí)教程(一)-MyBatis快速入門
- Mybatis實(shí)戰(zhàn)教程之入門到精通(經(jīng)典)
- Mybatis入門教程之新增、更新、刪除功能
- Mybatis-Plus 搭建與使用入門(小結(jié))
- Mybatis 開發(fā)注解快速入門
- mybatis原理概述入門教程
- MyBatis入門之增刪改查+數(shù)據(jù)庫(kù)字段和實(shí)體字段不一致問題處理方法
- Java Mybatis框架入門基礎(chǔ)教程
- Mybatis入門教程(四)之mybatis動(dòng)態(tài)sql
- MyBatis入門初體驗(yàn)之使用大全(2)
相關(guān)文章
Java之MultipartFile和File類型互轉(zhuǎn)方式
這篇文章主要介紹了Java之MultipartFile和File類型互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
IntelliJ IDEA之高效代碼插件RainBow Brackets詳解
這篇文章主要介紹了IntelliJ IDEA之高效代碼插件RainBow Brackets詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
MybatisPlus調(diào)用原生SQL的三種方法實(shí)例詳解
這篇文章主要介紹了MybatisPlus調(diào)用原生SQL的三種方法,在有些情況下需要用到MybatisPlus查詢?cè)鶶QL,MybatisPlus其實(shí)帶有運(yùn)行原生SQL的方法,我這里列舉三種,需要的朋友可以參考下2022-09-09
mybatis,foreach,找不到參數(shù)報(bào)錯(cuò)問題及解決
這篇文章主要介紹了mybatis,foreach,找不到參數(shù)報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

