我用MyBatis遇到的一些坑,与君共享之
author:码德
一、介绍一下mybatis
MyBatis 核心主要是ORM(object relational Mapping) 对象关系映射,主要是将代码中的成员变量与表中的一行数据进行一一对应,最终把对象持久化到数据库中
📖有关这个关系映射中间有很多坑啊~~
我从头开始吧 啊 哈哈
首先打开你的idea新建一个项目(我这边就用maven了)
第二步(这大家都懂)
然后就没有然后了,项目建完后是酱紫的
接下来开始mybatis
1.导入所需依赖
//就这俩
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
//其他
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.导入几个配置文件 这个直接拿去用就可以
主要有db.properties log4j.properties mybatis.xml
db.properties
jdbc.username = root #记得改数据库参数
jdbc.password = root
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql:///case?serverTimezone=Asia/Shanghai
#jdbc.url = jdbc:mysql://localhost:3306/java2005?serverTimezone=Asia/Shanghai
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis.xml 下边注释用其一即可
<?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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置外部文件 -->
<properties resource="db.properties"></properties>
<!-- 配置别名 -->
<typeAliases>
<!-- <typeAlias type="com.liang.pojo.User" alias="user"></typeAlias>-->
<package name="com.liang.pojo"/>
</typeAliases>
<!-- 配置环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<!--<mapper resource="com/liang/dao/UserDao.xml"/>-->
<!--<mapper class="com.liang.dao.UserDao"/>-->
<package name="com.liang.dao"/>
</mappers>
</configuration>
*dao和实体类(这里也有坑~~~~注意你的成员变量命名一定要和数据库字段一致,一致,一致)*
package com.liang.pojo;
import lombok.Data;
import java.sql.Date;
@Data
public class User {
Integer id;
String username;
String address;
String sex;
Date birthday;
}
package com.liang.dao;
import com.liang.pojo.User;
import java.util.List;
public interface UserDao {
/*
查询所有
*/
public List<User> findAll();
/*
添加
*/
public void saveUser(User user);
}
创建与dao相互映射的xml文件 (这里有一个小坑,注意要这样创建与之对应的目录)
这里还有一个小坑啊,这个文件的名字必须与你的dao相对应,大小写一致!!!!
不对应也可以,但是需要配置,具体我之后会补上
<?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="com.liang.dao.UserDao">
<!-- 查询所有 这里的User就是我们配置别名的用处,我们可以省去com.liang.dao.pojo-->
<select id="findAll" resultType="User">
select * from user
</select>
<!--插入 再补充一个坑,如果你写SQL语句想换行的话记得加空格,要不你懂得-->
<insert id="saveUser" parameterType="User">
insert into test(username,address,sex)
values (#{username},#{address},#{sex})
</insert>
</mapper>
至此我们的目录结构是这样的
数据库
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`birthday` date NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
接下来就要测试了
package com.liang;
import com.liang.dao.UserDao;
import com.liang.pojo.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.Test;
import java.io.InputStream;
import java.util.List;
public class test {
@Test
public void saveUser()throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
User user = new User();
user.setUsername("亮亮");
user.setAddress("穿过云间的光");
user.setSex("男");
userDao.saveUser(user);
//提交
session.commit();
//6.释放资源
session.close();
in.close();
}
//查询所有
@Test
public void testfindAll()throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
System.out.println(users);
//6.释放资源
session.close();
in.close();
}
}
插入成功
over 今天先到这里