Mybatis创建工程
idea创建普通maven工程就可以;
用到的依赖:这里推荐官网看
https://mybatis.org/mybatis-3/zh
可以在里面自行选择需要的依赖,写在pom文件中
创建目录格式
注意src目录下的main下面java里面的package包一定要一层一层创建!!!!
resources里面的目录结构要和dao层接口的一样,同样要一层一层创建!!!!
1、编写mybatis-config.xml文件
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<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="123456"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.xml都需要在Mybatis的核心配置文件中注册-->
<mappers>
<mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
</mappers>
</configuration>
主要两个位置:
第一个位置是
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&CharacterEncoding=UTF-8"/>
mybatis是数据库名;
?后面如果删除useSSL=false&
报错:`
Thu Oct 22 22:48:16 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'`
删除:useUnicode=true&
报错:
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
删除:CharacterEncoding=UTF-8
报错:
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
第二个位置是非常重要一定要写对
这里写resources目录下UserDao.xml的相对路径com/mybatis/dao/UserDao.xml
2、UserDao.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="com.mybatis.dao.UserDao">
<select id="addUser" parameterType="com.mybatis.entity.User">
insert into user values(#{uid},#{uname},#{uage},#{upsw})
</select>
</mapper>
这里主要注意:
1、namespace写的是java目录下接口UserDao的包结构路径
com.mybatis.dao.UserDao
2、为什么文件名是UserDao.xml?可不可以是其他?
测试结构式可以的,但是最好写成一样的,方便接口多的时候可以相对应;(部分教程里面说一定要一样),其实只要在映射配置的xml文件中和接口实现方法中写对接口名,不影响程序执行;截图为证
3、里面的sql语句变量字段名必须和实体类User里面的成员变量名一致;但是可以不和数据库里面的字段名一致;(推荐写成一致的)
变量顺序要和User实体类里面的有参构造函数参数顺序相同:
3、写UserDao接口
package com.mybatis.dao;
import com.mybatis.entity.User;
public interface UserD {
public void addUser(User user);
}
4、写实体类
package com.mybatis.entity;
public class User {
private int uid;
private String uname;
private int uage;
private String upsw;
public User(){}
public User(int uid, String uname, int uage, String upsw) {
this.uid = uid;
this.uname = uname;
this.uage = uage;
this.upsw = upsw;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
public String getUpsw() {
return upsw;
}
public void setUpsw(String upsw) {
this.upsw = upsw;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uname='" + uname + '\'' +
", uage=" + uage +
", upsw='" + upsw + '\'' +
'}';
}
}
5、写实现类
package com.mybatis.dao;
import com.mybatis.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class UserImpl implements UserD {
public void addUser(User user) {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//通过SqlSessionFactoryBuilder对象构建SqlSessionFactory对象
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));
//通过SqlSessionFactory创建SqlSession对象
SqlSession ss=ssf.openSession();
//执行数据库增删改查操作
ss.insert("com.mybatis.dao.UserD.addUser",user);
//提交事务
ss.commit();
}
}
6、运行类
package com.mybatis.run;
import com.mybatis.dao.UserImpl;
import com.mybatis.dao.UserD;
import com.mybatis.entity.User;
public class Run {
public static void main(String[] args) {
UserD userDao=new UserImpl();
User user=new User(2,"li三",23,"123456");
userDao.addUser(user);
}
}
常见错误:
1:找不到resource
有的小伙伴说resource中目录结构要和java中的目录结构一样,实测可以不一样
只要在配置文件中resource目录写对,可以不一样的!!!!!!!!!(打脸ing)
但是刚入坑的我最开始并不知道namespace以及resource对应的是什么东东,所以被各种毒打;
写错路径报错:
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource /UserDao.xml
还有手贱写错parameterType的:报错
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias ‘com.mybatis.dao.entity.User’. Cause: java.lang.ClassNotFoundException: Cannot find class: com.mybatis.dao.entity.User
实现类方法要和接口方法一致
参数:包结构.接口.方法
写错报错:Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.mybatis.UserD.addUser
爬坑ing!!!