1核2g 做網(wǎng)站百度手機應用商店
目錄
1 配置 MyBatis 方式
1.1 XML 配置文件
1.2 Java 注解配置
1.3. Java API 配置
2 在 MySQL 中創(chuàng)建一張表
3 創(chuàng)建一個基于 Maven 的?JavaWeb 工程
4 編寫 User 實體類
5?創(chuàng)建 Mybatis 全局配置文件
6 編寫一個 DAO 或 Mapper 接口
7 編寫 SQL 映射配置文件(重要)
8 加載映射文件
9 導入日志文件
10 創(chuàng)建 MyBatisTest 測試類
11 參考文檔
1 配置 MyBatis 方式
MyBatis 可以通過以下三種方式來創(chuàng)建和配置
1.1 XML 配置文件
????????最常見的方式是使用 XML 配置文件來配置 MyBatis。在 XML 配置文件中,可以定義數(shù)據(jù)源、映射文件的位置、類型別名、插件等信息。XML 配置文件通常包括 MyBatis 的全局配置和映射文件的配置。以下是一個簡單的 XML 配置文件示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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/mydatabase"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/ExampleMapper.xml"/></mappers>
</configuration>
1.2 Java 注解配置
????????從 MyBatis 3.4.1 版本開始,MyBatis 支持使用 Java 注解來配置映射關系。可以使用 @MapperScan 注解來指定 Mapper 接口所在的包,也可以使用 @Mapper 注解來標記 Mapper 接口。以下是一個簡單的 Java 注解配置示例:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {// 數(shù)據(jù)源配置// 其他配置...
}
1.3. Java API 配置
????????除了使用 XML 配置文件和 Java 注解外,MyBatis 還支持使用 Java API 來進行配置。通過編寫 Java 代碼,可以動態(tài)地創(chuàng)建 SqlSessionFactory 對象,并且進行各種配置。以下是一個簡單的 Java API 配置示例:
DataSource dataSource = getDataSource(); // 獲取數(shù)據(jù)源
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(MyMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
2 在 MySQL 中創(chuàng)建一張表
drop table if exists person;
create table person (
id int(10) primary key auto_increment, #主鍵,自動增長
name varchar(14) unique not null, #該行不重復,不為空
age int,
sex char(10) default '女' # 沒有插入該列,填入默認值"女"
)charset=utf8; #utf-8 編碼#多行插入
insert into person(name, age, sex) values
('西施', 18, '女'),
('大喬', 32, null),
('王昭君', 24, null);insert into person(name,age) values('趙飛燕',27);
insert into person(name,age) values('虞姬', 25);
insert into person(id,name,age) values(9, '貂蟬', 26);
3 創(chuàng)建一個基于 Maven 的?JavaWeb 工程
可以參考以下博文:
IDEA 2023.2 配置 JavaWeb 工程-CSDN博客https://blog.csdn.net/zjs246813/article/details/136199249?spm=1001.2014.3001.5501導入依賴
<dependencies><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!-- mysql驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!-- 日志處理 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- 單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>
4 編寫 User 實體類
public class User {private Integer id;private String name;private Integer age;private String sex;// Getter、Setter、toString() 方法省略
}
5?創(chuàng)建 Mybatis 全局配置文件
創(chuàng)建 mysql.properties 配置文件
study 改為自己的數(shù)據(jù)庫名
root 是數(shù)據(jù)庫用戶名
123456 是數(shù)據(jù)庫用戶密碼
驅動器一般為?com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
name=root
password=123456
driver=com.mysql.cj.jdbc.Driver
在 resources 目錄中,創(chuàng)建 Mybatis 的全局配置文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 通過properties標簽,讀取java配置文件的內容 --><properties resource="mysql.properties" /><!-- 配置環(huán)境.--><environments default="development"><!-- id屬性必須和上面的default一致 --><environment id="development"><!--配置事務的類型--><transactionManager type="JDBC"></transactionManager><!--dataSource 元素使用標準的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象源 --><dataSource type="POOLED"><!--配置連接數(shù)據(jù)庫的4個基本信息--><property name="url" value="${url}" /><property name="username" value="${name}" /><property name="password" value="${password}" /><property name="driver" value="${driver}" /></dataSource></environment></environments>
</configuration>
對 mybatis-config.xml 中配置項的簡單說明:
- properties:用于加載外部屬性文件,通過指定 resource="mysql.properties",MyBatis 會嘗試從當前目錄下查找名為 "mysql.properties" 的文件,并將其中的屬性值應用到配置 property?中
- environments:
配置當前的環(huán)境,default 屬性有 development 和 work 兩種選擇,默認是 development 開發(fā)模式,work 是工作模式?? ?指定當前運行環(huán)境,通過 default 屬性指定某個運行環(huán)境的標識符 id 來使用該運行環(huán)境? - environment:
配置每個 environment 定義的環(huán)境,可以配置多個運行環(huán)境,但是每個 SqlSessionFactory 實例只能選擇一個運行環(huán)境。其 id 屬性也有 development 和 work 兩種選擇,并且必須和上面的 default 屬性一致?? 配置運行環(huán)境,通過 id 屬性來標識該環(huán)境。如果配置了兩個相同的 environment,即它們的 id 屬性值相同,MyBatis 會用后面的覆蓋掉前面的 - transactionManager:配置事務管理器類型,type 屬性中有 JDBC 和 MANAGED 兩種,一次只能配置一個
- JDBC 使用 JdbcTransactionFactory 工廠生成的 JdbcTransaction 對象實現(xiàn),以 JDBC 的方式進行數(shù)據(jù)庫的提交、回滾等操作,它依賴于從數(shù)據(jù)源得到的連接來管理事務范圍
- MANAGED 使用 ManagedTransactionFactory 工廠生成的 ManagedTransaction 對象實現(xiàn),它的提交和回滾不需要任何操作,而是把事務交給容器進行處理,默認情況下會關閉連接,如果不希望默認關閉,只要將其中的 closeConnection 屬性設置為 false 即可
- dataSource:配置數(shù)據(jù)源類型,type屬性有 UNPOOLED、POOLED 和 JNDI 三種選擇:
- UNPOOLED (UnpooledDataSourceFactory):采用非數(shù)據(jù)庫池的管理方式,每次請求都會新建一個連接,并用完后關閉它,所以性能不是很高。該方式適用于只有小規(guī)模數(shù)量并發(fā)用戶的簡單應用程序上
- POOLED?(PooledDataSourceFactory):采用連接池的概念將數(shù)據(jù)庫鏈接對象 Connection 組織起來,可以在初始化時創(chuàng)建多個連接,使用時直接從連接池獲取,避免了重復創(chuàng)建連接所需的初始化和認證時間,從而提升了效率,所以這種方式比較適合對性能要求高的應用中。在開發(fā)或測試環(huán)境中經(jīng)常用到此方式
- JNDI (JndiDataSourceFactory):數(shù)據(jù)源 JNDI 的實現(xiàn)是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用。在生產(chǎn)環(huán)境中優(yōu)先考慮這種方式
- property:dataSource 中的 property 元素就是數(shù)據(jù)庫相關的配置信息
6 編寫一個 DAO 或 Mapper 接口
在 com.mapper 目錄下創(chuàng)建一個 UserMapper 接口
package com.mapper;import com.entity.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper {// 查詢所有用戶List<User> selectAllUser();// 通過 id 查詢一個用戶User selectUserById(int id);// 模糊查詢,根據(jù) name 字段查詢用戶List<User> selectUserByName(String name);// insert、update、delete的返回值都是int(影響行數(shù))// 添加用戶// 帶兩個參數(shù),需要在接口中通過@Param注解指定名稱(因為編譯時參數(shù)名不會保留)int insertUser(@Param("name") String name,@Param("age") int age,@Param("sex") String sex);// 根據(jù) id 更新用戶int updateUser(@Param("id") int id,@Param("name") String name,@Param("age") int age,@Param("sex") String sex);// 根據(jù) id 刪除用戶int deleteUsesr(int id);
}
7 編寫 SQL 映射配置文件(重要)
????????在目錄 resources 創(chuàng)建 mapper 目錄,然后在 mapper 目錄下創(chuàng)建一個 UserMapper.xml 文件。Mybatis 中所有數(shù)據(jù)庫的操作都基于 SQL 映射配置文件中配置的SQL語句,在 SQL 映射配置文件中可以配置任何類型的 SQL 語句??蚣軙鶕?jù)配置文件中的參數(shù)配置,完成對 SQL 語句輸入輸出參數(shù)的映射配置。
相關屬性 | 描述 |
---|---|
namespace | 表示命名空間,用來設定當前 Mapper 配置文件的唯一標識,將來在 Java 程序中通過 namespace 屬性值來定位到這個配置文件,namespace 屬性值可以隨意命名,建議使用 Mapper 接口的全類名命名,如 com.mapper.UserMapper |
id | SQL 映射語句的唯一標識 |
parameterType | 用來指定 SQL 語句中的參數(shù)類型,可以是一個簡單類型,也可以是一個復雜對象類型 |
resultType 和?resultMap | 用來指定 SQL 語句的返回值類型,resultType 用于指定返回的單一結果類型,而 resultMap 用于指定返回結果的映射關系,通常用于復雜的查詢結果映射 |
parameterMap | 用來指定參數(shù)映射關系 |
sql | 用于定義可重用的 SQL 片段,可以在不同的 SQL 語句中重復使用,從而減少重復編寫相同的 SQL 代碼 |
include | 用于引用外部的 SQL 片段,可以在 SQL 映射文件中引用其他 SQL 片段,從而實現(xiàn)模塊化的 SQL 代碼編寫 |
cache | 用于配置結果緩存,可以指定 SQL 語句的查詢結果是否需要被緩存 |
#{} | #{} 表示 SQL 語句的占位符 |
${} | ${} 表示 SQL 語句的拼接符 |
#{} 和 ${} 介紹
- #{}:SQL 語句的占位符,相當于JDBC中的 "?",它會自動進行 Java 類型和 JDBC 類型轉換,可以防止 SQL 注入攻擊。#{} 接受的輸入?yún)?shù)的類型可以是簡單類型、普通 JavaBean 或者 HashMap 。當接受簡單類型時,#{} 中可以寫 value 或者其他任意名稱。如果接受的是JavaBean,它會通過 OGNL 讀取對象中的屬性值,例如,一個JavaBean user,它有一個屬性 name,在映射文件中可以使用 #{user.name} 來引用這個屬性值
- ${}: SQL 語句的拼接符,會將接收到的參數(shù)在不進行 JDBC 類型轉換的情況下拼接在 SQL 語句中,${} 里面必須要寫參數(shù),不然會報錯。${} 接受輸入?yún)?shù)的類型可以是簡單類型、普通 JavaBean 或者 HashMap 。當接受簡單類型時,${} 中只能寫 value,而不能寫其他任意名稱。如果接受的是 JavaBean,它會通過 OGNL 讀取對象中的屬性值,同上
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace-綁定一個對應dao/mapper接口-->
<mapper namespace="com.mapper.UserMapper"><!-- 查詢所有用戶 --><!--通過 resultType 指定查詢的結果是 User 類型的數(shù)據(jù)只需要指定 resultType 的類型,MyBatis 會自動將查詢的結果映射成 JavaBean 中的屬性--><!-- id 和 com.mapper.UserMapper.selectAllUser 對應 --><select id="selectAllUser" resultType="com.entity.User">select * from person;</select><!-- 通過id查詢一個用戶 --><!-- 帶一個簡單類型的參數(shù), 這種情況下parameterType屬性可以省略,mybatis可以自動推斷出類型 --><select id="selectUserById" parameterType="int" resultType="com.entity.User">select * from person where id = #{id};</select><!-- 模糊查詢,根據(jù)name字段查詢用戶--><select id="selectUserByName" parameterType="String" resultType="com.entity.User">select * from person where name like '%${value}%';</select><!-- 添加用戶--><!-- 帶兩個參數(shù),需要在接口中通過@Param注解指定名稱(因為編譯時參數(shù)名不會保留) --><!-- insert、update、delete的返回值都是int(影響行數(shù)) --><insert id="insertUser" parameterType="com.entity.User">insert into person(name, age, sex)values (#{name}, #{age}, #{sex});</insert><!-- 根據(jù)id更新用戶 --><update id="updateUser" parameterType="com.entity.User">update person set name = #{name},age = #{age},sex = #{sex} where id = #{id}</update><!-- 根據(jù)id刪除用戶 --><delete id="deleteUser" parameterType="int">delete from person where id = #{id}</delete>
</mapper>
8 加載映射文件
將上面創(chuàng)建的 UserMapper.xml 文件配置到全局配置文件 mybatis-config.xml 中
<!--指定映射配置文件的位置,這個映射配置文件指的是每個業(yè)務獨立的配置文件-->
<mappers><mapper resource="mapper/UserMapper.xml"/>
</mappers>
9 導入日志文件
導入日志文件,在 resources 目錄下創(chuàng)建 log4j.properties 配置文件,并且導入如下配置(如果log報錯則以管理員的方式啟動 Eclipse 或 IDEA)
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
10 創(chuàng)建 MyBatisTest 測試類
使用 JDBC 的事務管理在進行增刪改操作時,需要進行提交事務,也就是 sqlSession.commit(),否則數(shù)據(jù)不會操作成功
public class MybatisTest {//定義 SqlSessionSqlSession sqlSession = null;@Beforepublic void getSqlSession() throws IOException {//加載 mybatis 全局配置文件 Resources// 原 InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//創(chuàng)建 SqlSessionFactory 對象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//根據(jù) sqlSessionFactory 產(chǎn)生 sessionsqlSession = sqlSessionFactory.openSession();}//查詢所有用戶數(shù)據(jù)@Testpublic void testSelectAllUser() {/*** 注意:這個字符串由 UserMapper.xml 文件中的兩個部分構成(namespace + id)* <mapper namespace="com.mapper.UserMapper">中 namespace 的值* <select id="selectAllUser" > 中的 id 值* 這樣Mybatis才能找到需要的SQL*/String statement = "com.mapper.UserMapper.selectAllUser";List<User> listUser = sqlSession.selectList(statement);for (User user : listUser) {System.out.println(user);}sqlSession.close();}//根據(jù)Id查詢一個用戶數(shù)據(jù)@Testpublic void testSelectUserById() {String statement = "com.mapper.UserMapper.selectUserById";User user = sqlSession.selectOne(statement, 1);System.out.println(user);sqlSession.close();}//模糊查詢:根據(jù) person 表的 name 字段@Testpublic void testSelectUserByName() {String statement = "com.mapper.UserMapper.selectUserByName";List<User> listUser = sqlSession.selectList(statement, "大");for (User user : listUser) {System.out.println(user);}sqlSession.close();}//添加一個用戶數(shù)據(jù)@Testpublic void testInsertUser() {String statement = "com.mapper.UserMapper.insertUser";User user = new User();user.setName("嫦娥");user.setAge(24);user.setSex("女");int i = sqlSession.insert(statement, user);System.out.println( (i>0)? "添加成功!":"添加失敗!");//提交插入的數(shù)據(jù)sqlSession.commit();sqlSession.close();}//根據(jù)id修改用戶數(shù)據(jù)@Testpublic void testUpdateUser(){//如果設置的 id不存在,那么數(shù)據(jù)庫沒有數(shù)據(jù)更改String statement = "com.mapper.UserMapper.updateUser";User user = new User();user.setId(10);user.setName("王紅");user.setAge(26);user.setSex("女");int i = sqlSession.update(statement, user);System.out.println( (i>0)? "修改成功!":"修改失敗!");//提交數(shù)據(jù)sqlSession.commit();sqlSession.close();}//根據(jù)id刪除用戶數(shù)據(jù)@Testpublic void testDeleteUser(){String statement = "com.mapper.UserMapper.deleteUser";int i = sqlSession.delete(statement, 10);System.out.println( (i>0)? "刪除成功!":"刪除失敗!");sqlSession.commit();sqlSession.close();}
}
部分執(zhí)行結果
執(zhí)行過程(添加一個用戶)
11 參考文檔
Mybatis3詳解(二)----Mybatis的第一個入門實例 - 唐浩榮 - 博客園 (cnblogs.com)
MyBatis中#{}占位符與${}拼接符的用法說明_java_腳本之家 (jb51.net)