mybatis實現MySQL數據庫的增刪改查
- 2020 年 12 月 29 日
- 筆記
環境:
- jdk1.8
- mysql5.7
- maven3.6.0
- IDEA
什麼是mybatis框架?
- MyBatis 是一款優秀的持久層框架,
- 它支持自定義 SQL、存儲過程以及高級映射。
- MyBatis免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。
- MyBatis可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
- MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了[google code](//baike.baidu.com/item/google code/2346604),並且改名為MyBatis 。2013年11月遷移到Github。
下面開始搭建
sql文件:
/*
SQLyog Ultimate v13.1.1 (64 bit)
MySQL - 5.7.31-log : Database - mybatis
*********************************************************************
*/
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mybatis`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`pwd`) values
(1,'qijian','123'),
(2,'Tom','123'),
(3,'qijian','111');
使用 Maven 來構建項目。pom.xml文件代碼如下。注意我搭建該項目是mybatis-study的子項目。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis-study</artifactId>
<groupId>com.qijijan</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-01</artifactId>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
<build>
<!--Maven靜態資源過濾問題-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.poroperties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
XML 配置文件中包含了對 MyBatis 系統的核心設置,包括獲取數據庫連接實例的數據源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"//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=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="****"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/qijian/dao/UserMapper.xml"/>
</mappers>
</configuration>
注意: XML 頭部的聲明,它用來驗證 XML 文檔的正確性。environment 元素體中包含了事務管理和連接池的配置。mappers 元素則包含了一組映射器(mapper),這些映射器的 XML 映射文件包含了 SQL 代碼和映射定義信息。
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例為核心的。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。這裡使用的是XML 配置文件。
MybatisUtils工具類.
package com.qijian.utils;
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 MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
private static String resource = "mybatis-Config.xml";
private static InputStream inputStream;
static {
//使用mybatis的第一步:獲取 SqlSessionFactory對象
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。
// SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession() throws IOException {
return sqlSessionFactory.openSession();
}
}
實體類如下
//user.java
package com.qijian.pojo;
public class User {
private int id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
//UserMapper
package com.qijian.dao;
import com.qijian.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserMapper {
//查詢所有的用戶
//@Select("SELECT * FROM mybatis.user WHERE id = #{id}")
List<User> getUserList();
//通過id查詢用戶
User getUserById(int id);
//增加用戶
int addUser(User user);
//添加用戶 使用Map集合
int addUserByMap(Map<String,Object> map);
//修改用戶
int updateUser(User user);
//刪除用戶
void deleteUser(int id);
}
基於 XML 映射語句 在命名空間 「com.qijian.dao.UserMapper」 中定義如下 的映射語句(例如名為 「getUserList」),這樣你就可以用全限定名 「com.qijian.dao.UserMapper.getUserList」 來調用映射語句了
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"//mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qijian.dao.UserMapper">
<select id="getUserList" resultType="com.qijian.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User">
select *from mybatis.user where id = #{id};
</select>
<insert id="addUser" parameterType="com.qijian.pojo.User">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd});
</insert>
<insert id="addUserByMap" parameterType="Map">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd});
</insert>
<update id="updateUser" parameterType="com.qijian.pojo.User">
update mybatis.user
set name = #{name},pwd = #{pwd}
where id=#{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
注意:
對命名空間的一點補充
在之前版本的 MyBatis 中,命名空間(Namespaces)的作用並不大,是可選的。 但現在,隨着命名空間越發重要,你必須指定命名空間。
命名空間的作用有兩個,一個是利用更長的全限定名來將不同的語句隔離開來,同時也實現了你上面見到的接口綁定。就算你覺得暫時用不到接口綁定,你也應該遵循這裡的規定,以防哪天你改變了主意。 長遠來看,只要將命名空間置於合適的 Java 包命名空間之中,你的代碼會變得更加整潔,也有利於你更方便地使用 MyBatis。
命名解析:為了減少輸入量,MyBatis 對所有具有名稱的配置元素(包括語句,結果映射,緩存等)使用了如下的命名解析規則。
全限定名(比如 「com.mypackage.MyMapper.selectAllThings)將被直接用於查找及使用。
短名稱(比如 「selectAllThings」)如果全局唯一也可以作為一個單獨的引用。 如果不唯一,有兩個或兩個以上的相同名稱(比如 「com.foo.selectAllThings」 和 「com.bar.selectAllThings」),那麼使用時就會產生「短名稱不唯一」的錯誤,這種情況下就必須使用全限定名。
package com.qijian.dao;
import com.qijian.pojo.User;
import com.qijian.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserMapperTest {
@Test
public void testSelect() throws IOException {
//第一步:獲取sqlsesion對象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for(User user : userList){
System.out.println(user);
}
//關閉資源
sqlSession.close();
}
@Test
public void testSelectById() throws IOException {
//獲取sqlSession對象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
// 注意增刪改差需要提交事務
@Test
public void testAddUser() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.addUser(new User(7,"herry","123"));
if (res>0){
System.out.println("插入成功!");
}
//提交事務
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdateUser() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
sqlSession.getMapper(UserMapper.class).updateUser(new User(3,"qijian","111"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDeleteUser() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(7);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testAddByMap() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//空過Map可以很方便的插入數據
// 假設,我們的實體類,或者數據庫中的表,字段或者參數過多,我們應當使用Map
Map<String,Object> map = new HashMap<String, Object>();
map.put("id",8);
map.put("name","wangwu");
map.put("pwd","1234");
userMapper.addUserByMap(map);
sqlSession.commit();
sqlSession.close();
}
// Map中傳遞參數,直接在SQL中取出key
// 對象傳遞參數,直接在SQL中取對象的屬性
// 只有一個基本類型參數的情況下,可以直接在SQL中取到
// 多參數用Map
}