本文轉載自https://www.cnblogs.com/xqz0618/p/javaweb03.html
部落格裡面所有紅字均為本部落客為小萌新們解答報錯的地方,如果可以的話盛唐希望親們的點贊呢
【MyBatis介紹】
MyBatis 是支援普通 SQL 查詢,存儲過程和進階映射的優秀持久層架構。
MyBatis 消除 了幾乎所有的 JDBC 代碼和參數的手工設定以及結果集的檢索。
MyBatis 使用簡單的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成資料庫中的記錄。
每個MyBatis應用程式主要都是使用SqlSessionFactory執行個體的,一個SqlSessionFactory執行個體可以通過SqlSessionFactoryBuilder獲得。
SqlSessionFactoryBuilder可以從一個xml配置檔案或者一個預定義的配置類的執行個體獲得。
用xml檔案建構SqlSessionFactory執行個體是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader執行個體,包括用檔案路徑或file://開頭的url建立的執行個體。
MyBatis有一個實用類----Resources,它有很多方法,可以友善地從類路徑及其它位置加載資源。
MyBatis 最強大的特性之一就是它的動态語句功能。如果您以前有使用JDBC或者類似架構的經曆,您就會明白把SQL語句條件連接配接在一起是多麼的痛苦,
要確定不能忘記空格或者不要在columns列後面省略一個逗号等。動态語句能夠完全解決掉這些痛苦。盡管與動态SQL一起工作不是在開一個party,但是MyBatis确實能通過在任何映射SQL語句中
【步驟】
①擷取MyBatis加包(在😁項目基礎上使用MyBatis)
在https://mvnrepository.com/上搜尋MyBatis可以選擇相應的版本
②在pop.xml中添加以下代碼,管理Mybatis加包
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
🌂在Java Resources中建立conf.xml
④配置資料庫連接配接資訊(盛唐友情提示:下面驅動"com.mysql.cj.Driver"是mysql驅動在10版本以上的驅動名稱,10以下為"com.mysql.jdbc.Driver",同時記得根據自己的mysql版本提前在pom.xml裡面加入mysql驅動的依賴哦,這裡就不做贅述了。)
<?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.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://伺服器位址:端口号/資料庫名稱?serverTimezone=GMT%2B8" />
<property name="username" value="資料庫使用者名" />
<property name="password" value="資料庫密碼" />
</dataSource>
</environment>
</environments>
</configuration>
😭查詢資料庫中S_User表資料----建立對應的實體類
package com.springdemo.model;
public class User {
public User(String userId, String userName, String userPwd, String userPower) {
super();
this.userId = userId;
this.userName = userName;
this.userPwd = userPwd;
this.userPower = userPower;
}
public User() {
super();
}
private int _key;
private String userId;
private String userName;
private String userPwd;
private String userPower;
public int get_key() {
return _key;
}
public void set_key(int _key) {
this._key = _key;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getUserPower() {
return userPower;
}
public void setUserPower(String userPower) {
this.userPower = userPower;
}
@Override
public String toString() {
return "User [key=" + _key + ",id="+userId+" name=" + userName + ", power=" + userPower + "]";
}
}
注:建立get ,set,構造函數快捷鍵(右鍵--> source )
⑥建立User表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的值習慣上設定成包名+sql映射檔案名,這樣就能夠保證namespace的值是唯一的
例如namespace="com.springdemo.mapping.userMapper"就是com.springdemo.mapping(包名)+userMapper(userMapper.xml檔案去除字尾)
-->
<mapper namespace="com.springdemo.mapping.userMapper">
<!-- 在select标簽中編寫查詢的SQL語句, 設定select标簽的id屬性為getUser,id屬性值必須是唯一的,不能夠重複
使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢傳回的結果集類型
resultType="com.springdemo.model.User"就表示将查詢結果封裝成一個User類的對象傳回
User類就是users表所對應的實體類
-->
<!-- 根據_key查詢得到一個user對象-->
<select id="getUser" parameterType="int"
resultType="com.springdemo.model.User"> <!-- 建立對應user實體類的位置 -->
select * from S_USER where _key=#{id}
</select>
</mapper>
⑦在conf.xml檔案中注冊userMapper.(<configuration>标簽内)
<mappers>
<!-- 注冊userMapper.xml檔案,
userMapper.xml位于com.springdemo.mapping這個包下,是以resource寫成com/springdemo/mapping/userMapper.xml-->
<mapper resource="com/springdemo/mapping/userMapper.xml"/>
</mappers>
⑧使用Test.java 檔案添加測試
package com.springdemo.impl;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
import com.springdemo.model.User;
import com.springdemo.tools.DBTools;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test {
public static void main(String[] args) throws IOException {
//mybatis的配置檔案
String resource = "conf.xml";
//使用類加載器加載mybatis的配置檔案(它也加載關聯的映射檔案)
InputStream is = Resources.getResourceAsStream(resource);
//建構sqlSession的工廠
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources類加載mybatis的配置檔案(它也加載關聯的映射檔案)
//Reader reader = Resources.getResourceAsReader(resource);
//建構sqlSession的工廠
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//建立能執行映射檔案中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的辨別字元串,
* me.gacl.mapping.userMapper是userMapper.xml檔案中mapper标簽的namespace屬性的值,
* getUser是select标簽的id屬性值,通過select标簽的id屬性值就可以找到要執行的SQL
*/
/* 根據——key查找 */
String statement = "com.springdemo.mapping.userMapper.getUser";
//映射sql的辨別字元串,getUser與映射檔案中配置select标簽id一緻
//執行查詢傳回一個唯一user對象的sql
User user = session.selectOne(statement,2);
System.out.println(user);
}
盛唐友情提供:sql腳本如下
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for s_user
-- ----------------------------
DROP TABLE IF EXISTS `s_user`;
CREATE TABLE `s_user` (
`userId` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`userPwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`userPower` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`_key` int(255) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`_key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;
-- ----------------------------
-- Records of User
-- ----------------------------
INSERT INTO `s_user` VALUES ('1', '1', '1', '1', 1);
INSERT INTO `s_user` VALUES ('2', '2', '2', '2', 2);
INSERT INTO `s_user` VALUES ('wll', 'wll', '123456', '7000', 3);
SET FOREIGN_KEY_CHECKS = 1;
⑨執行結果
盛唐友情提示:這裡如果不了解maven的運作機制的同學會出現如下問題
這個問題是maven項目預設是沒有将未放在resources的檔案com/mapping/userMapper.xml加入項目當中,在pom.xml裡面引用即可
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>com/springdemo/mapping/userMapper.xml</include>
</includes>
</resource>
</resources>
</build>
【增删改查】
修改userMapper.xml統一管理傳回類型
<resultMap id="userMap" type="com.springdemo.model.User">
<id property="_key" column="_key" javaType="java.lang.Integer"></id>
<result property="userId" column="userId" javaType="java.lang.String"></result>
<result property="userName" column="userName" javaType="java.lang.String"></result>
<result property="userPwd" column="userPwd" javaType="java.lang.String"></result>
<result property="userPower" column="userPower" javaType="java.lang.String">
</result>
</resultMap>
resultMap設定對應的實體類
①查詢所有user記錄
🍕userMapper.xml配置
<select id="selectUser" resultMap="userMap">
select * from s_user
</select>
resultMap設定傳回的ReusltMap
🍔測試java代碼
String stateselect = "com.springdemo.mapping.userMapper.selectUser";
List<User> userList = session.selectList(stateselect);
for(int i=0;i<userList.size();i++) {
System.out.println(userList.get(i));
}
②删除指定user記錄
🍟userMapper.xml配置
<delete id="deleteUser" parameterType="int">
delete from S_user where _key=#{_key}
</delete>
🌭測試java代碼
String statementdl = "com.springdemo.mapping.userMapper.deleteUser";
try {
session.delete(statementdl,4);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
🌂更新user表記錄
🍿userMapper.xml配置
<update id="updateUser" >
update S_user set userPwd=#{userName},userPwd=#{userPwd},userPower=#{userPower} where _key=#{_key}
</update>
🥓測試java代碼
String statementup = "com.springdemo.mapping.userMapper.updateUser";
User userup = new User("wqyx","wqyx", "hhh","超級");
userup.set_key(2);
try {
session.update(statementup, userup);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
④新增user表記錄
🍿userMapper.xml配置
<insert id="insertUser" useGeneratedKeys="true" keyProperty="_key">
insert into S_USER (userId,userName,userPwd,userPower) values (#{userId},#{userName},#{userPwd},#{userPower})
</insert>
🥓測試java代碼
String statementIn = "com.springdemo.mapping.userMapper.insertUser";
User userin = new User("wll","wll", "123456","7000");
try {
session.insert(statementIn,userin);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}