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
搭建数据库
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>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.28version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.2version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
maven由于他的约定大于配置,解决配置文件无法被导出或者生效的问题,子工程Maven配置文件中导入 在父工程导入是没用的
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.*include>
includes>
resource>
resources>
build>
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>
<mappers>
<mapper resource="com/kz/dao/UserMapper.xml"/>
mappers>
configuration>
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();
}
}
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;
}
}
public interface UserMapper{
//查询
public List<User> getUserList();
}
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kz.dao.UserMapper">
<select id="getUserList" resultType="com.kz.pojo.User">
select * from mybatis.user
select>
mapper>
规范写法
@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();
}
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(); }
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);
}
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<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();
}
}
1.标签不要匹配错
2.resouce绑定mapper,需要使用路径
3.程序配置文件必须符合规范
4.NullPoinException,没有注册资源
5.输出的xml文件中存在中文乱码
6.maven资源没有导出问题