文章目录
Mybatis
1.简介
什么是 MyBatis?
1.MyBatis 是一款优秀的持久层框架
2.它支持自定义 SQL、存储过程以及高级映射
3.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
4.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java
POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
中文文档: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
Github: https://github.com/search?q=mybatis
2.创建一个Mybatis程序
2.1搭建环境
搭建数据库
create database mybatis;
use mybatis;
create table user(
id int(20) not null primary key,
name varchar(30) default null,
pwd varchar(30) default null
)engine=innodb default charset=utf8;
insert into user (id,name,pwd) values
(1,'k','123456'),
(2,'z','123456')
创建Maven项目 (父工程)
1.删除src
2.Maven配置文件导入依赖
3.在父工程下导入依赖(子工程均可使用)
<!--导入依赖-->
<dependencies>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
创建子工程
maven由于他的约定大于配置,解决配置文件无法被导出或者生效的问题,子工程Maven配置文件中导入 在父工程导入是没用的
<build>
<resources>
<!-- 手动指定java文件夹为resources文件夹-->
<!-- 当xml文件在java文件夹而不在resources文件夹时,该xml文件不能被编译进target目录,-->
<!-- 又因为代码在执行时是执行的target中编译过的文件,所以加载不到该xml文件。因此必须进行指定。-->
<resource>
<directory>src/main/java</directory>
<includes>
<!-- 指定java文件夹下子包中的所有.xml文件-->
<include>**/*.xml</include>
</includes>
</resource>
<!-- 上述的指定是将原有的编译资源resources目录覆盖掉了,而不是添加编译目录,因此需要补充原有的编译资源目录-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
2.2编写mybatis.config核心配置文件
<?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://localhost:3306/mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 每一个Mapper.xml都需要在Mybatis核心文件配置中注册 -->
<mappers>
<mapper resource="com/kz/dao/UserMapper.xml"/>
</mappers>
</configuration>
2.3编写mybatis工具类
package com.kz.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;
//sqlSessionFactory --> sqlSession
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
//获取sqlSession对象
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//SqlSession 完全包含了面向数据库执行SQL命令所需的所有方法
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
2.4编写实体类
package com.kz.pojo;
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public int getId() {
return id;
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
2.5编写Dao接口
public interface UserMapper{
//查询
public List<User> getUserList();
}
2.6编写Mapper(相当于JDBC的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接口-->
<mapper namespace="com.kz.dao.UserMapper">
<!-- 返回 方法名 实体类 -->
<select id="getUserList" resultType="com.kz.pojo.User">
select * from mybatis.user
</select>
</mapper>
3.测试
规范写法
@Test
public void getUserList(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 方式1: getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user:userList
) {
System.out.println(user);
}
//关闭
sqlSession.close();
}
4.添加功能
4.1增删改操作 必须提交事务
注意事项!!!
id:就是对应namespace中的方法名 resultTyoe:Sql执行的返回类型 parameterTyoe:参数类型
1.编写接口
//添加 public int addUser(User user);
2.编写对应的mapper中的sql语句
<!-- 方法名 输入类型 --> <insert id="addUser" parameterType="com.kz.pojo.User"> insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd}); </insert>
3.测试
//增删改必须提交事务 @Test public void addUser(){ //获取sqlSession SqlSession sqlSession = MyBatisUtils.getSqlSession(); //获取接口 UserMapper mapper = sqlSession.getMapper(UserMapper.class); int insert = mapper.addUser(new User(4, "张国荣", "123456")); //事务提交 sqlSession.commit(); sqlSession.close(); }
4.2编写接口
public interface UserMapper {
//查询
public List<User> getUserList();
//通过id查询
public User selectById(int i);
//添加
public int addUser(User user);
//修改
public int updateUser(User user);
//删除
public int deleteUser(int i);
//万能map
int addUser2(Map<String,Object> map);
//模糊查询
List<User> selectLike(String value);
}
4.3编写对应的mapper中的sql语句
<?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接口-->
<mapper namespace="com.kz.dao.UserMapper">
<!-- 返回 方法名 实体类 -->
<select id="getUserList" resultType="com.kz.pojo.User">
select * from mybatis.user
</select>
<!-- 输入类型 输出类型-->
<select id="selectById" parameterType="int" resultType="com.kz.pojo.User">
select * from mybatis.user where id=#{id};
</select>
<!-- 输入类型 输出类型-->
<insert id="addUser" parameterType="com.kz.pojo.User">
insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd});
</insert>
<update id="updateUser" parameterType="com.kz.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>
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd) values (#{uid},#{uname},#{upwd})
</insert>
<select id="selectLike" parameterType="map" resultType="com.kz.pojo.User">
select * from mybatis.user where name like "%"#{value}"%";
</select>
</mapper>
测试
package com.kz.dao;
import com.kz.pojo.User;
import com.kz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserMapperTest {
@Test
public void getUserList(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 方式1: getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user:userList
) {
System.out.println(user);
}
//关闭
sqlSession.close();
}
@Test
public void selectById(){
//获取SqlSessiion
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//获取接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectById(2);
System.out.println(user);
sqlSession.close();
}
//万能的Map
@Test
public void addUser2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> objectStringMap = new HashMap<>();
objectStringMap.put("uid",10);
objectStringMap.put("uname","123");
mapper.addUser2(objectStringMap);
sqlSession.commit();
sqlSession.close();
}
//模糊查询
@Test
public void selectLike(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectLike("1");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
//增删改必须提交事务
@Test
public void addUser(){
//获取sqlSession
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//获取接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int insert = mapper.addUser(new User(4, "张国荣", "123456"));
//事务提交
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(1, "刘德华", "123456"));
sqlSession.commit();
System.out.println("修改成功");
sqlSession.close();
}
@Test
public void deleteUser(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(4);
sqlSession.commit();
System.out.println("删除成功");
sqlSession.close();
}
}
5.分析错误
1.标签不要匹配错
2.resouce绑定mapper,需要使用路径
3.程序配置文件必须符合规范
4.NullPoinException,没有注册资源
5.输出的xml文件中存在中文乱码
6.maven资源没有导出问题