学习笔记(狂神MyBatis)
1、搭建环境测试第一个MyBatis程序
创建数据库
CREATE DATABASE `mybatis`;
USE `mybatis`;
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;
insert into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
a、创建一个普通的maven项目
b、导入maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>StudyMyBatis</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>MyBatis01</module>
</modules>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
</properties>
<!--导入依赖-->
<dependencies>
<!--MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--mybatis驱动-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit驱动-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</project>
c、创建一个模块,编写核心配置文件mybatis-config.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">
<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?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<!--根据自己的数据库用户名密码更改-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--和mapper.xml中的namespace的路径相同,注意用 / 隔开-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
d、编写工具类MybatisUtils
(固定不变)
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 {
static SqlSessionFactory sqlSessionFactory = null;
static {
try {
//使用Mybatis第一步 :获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例.
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
e、业务代码
- 实体类
public class User {
//实体类 字段名和数据库字段名相同
private int id; //id
private String name; //姓名
private String pwd; //密码
//有参无参构造
//get,set方法
//toString
}
- mapper接口
import java.util.List;
import java.util.Map;
public interface UserMapper {
List<User> getUserList();
}
- 接口配置文件
UserMapper.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">
<!--namespace的值必须写对和核心配置文件中的mappers路径相同用 . 隔开-->
<mapper namespace="mapper.UserMapper">
<!--id和接口的方法名相同,resultTypeSql语句执行的返回值,parameterType:参数类型-->
<select id="getUserList" resultType="pojo.User">
select * from mybatis.user
</select>
</mapper>
- 编写junit测试
@Test
public void selectUser() {
//1.获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2.执行SQL
//getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//以上两行固定不变
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}
如果出现错误提示为:org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.
需要在pom.xml中导入以下配置
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2、简单操作数据库
- insert
1、编写接口
public interface UserMapper {
//查询所有用户
List<User> getUserList();
//插入用户
void addUser(User user);
}
2、mapper的xml文件SQL语句
<insert id="addUser" parameterType="pojo.User">
insert into mybatis.user (id, name, pwd)
values (#{id}, #{name}, #{pwd})
</insert>
3、测试
@Test
public void addUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(6, "liuliuliu", "666"));
//增删改一定要提交事务
sqlSession.commit();
//关闭sqlSession
sqlSession.close();
}
- update
1、编写接口
public interface UserMapper {
//查询所有用户
public List<User> getUserList();
//更改用户
void updateUser(User user);
}
2、mapper的xml文件SQL语句
<update id="updateUser" parameterType="pojo.User">
update mybatis.user
set name =#{name},
pwd=#{pwd}
where id = #{id};
</update>
3、测试
@Test
public void updateUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4, "哈哈哈", "111"));
//增删改一定要提交事务
sqlSession.commit();
//关闭sqlSession
sqlSession.close();
}
- Delete
1、编写接口
public interface UserMapper {
//查询所有用户
public List<User> getUserList();
//删除用户
void deleteUser(int id);
}
2、mapper的xml文件SQL语句
<delete id="deleteUser" parameterType="int">
delete
from mybatis.user
where id = #{id}
</delete>
3、测试
@Test
public void deleteUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
//增删改一定要提交事务
sqlSession.commit();
//关闭sqlSession
sqlSession.close();
}
- 万能Map
1、编写接口
public interface UserMapper {
//查询所有用户
public List<User> getUserList();
//用万能Map插入用户
void addUser2(Map<String, Object> map);
}
2、mapper的xml文件SQL语句
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id, name, pwd)
values (#{userid}, #{username}, #{userPwd})
</insert>
3、测试
@Test
public void addUser2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userid", 5);
map.put("username", "赵武");
map.put("userPwd", 123);
mapper.addUser2(map);
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
3、配置文件解析mybatis-config.xml
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
配置文档的顶层结构如下:
environments
可以配置成适应多种环境
例如下图:
MyBatis默认的事务管理器就是JDBC ,连接池:POOLED
properties
可以通过properties属性来实现引用配置文件(优先使用外部配置文件的内容)
在resources目录下编写一个配置文件db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username=root
password=root
在核心配置文件mybatis-config.xml
中引入
<!--引用外部配置文件-->
<properties resource="db.properties"></properties>
typeAliases
意在降低冗余的全限定类名书写。
<!--在实体类比较少的时候 可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>
如果实体类十分多,也可以指定包起别名,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名,比如 domain.blog.Author
的别名为 author
;若有注解,则别名为其注解值。
<typeAliases>
<package name="com.kuang.pojo"/>
</typeAliases>
第一种可以DIY别名,第二种不行,如果非要改,需要在实体上增加注解。
映射器 mappers
注册绑定我们的Mapper文件;
第一种:
推荐使用resource
注册
<!--每一个Mapper.xml都需要在MyBatis核心配置文件中注册-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
第二种:
使用class文件绑定注册
接口和他的Mapper配置文件必须同名
接口和他的Mapper配置文件必须在同一个包下
<!--每一个Mapper.xml都需要在MyBatis核心配置文件中注册-->
<mappers>
<mapper class="com.kuang.dao.UserMapper"/>
</mappers>
第三种:使用包扫描进行注入
<mappers>
<package name="com.kuang.dao"/>
</mappers>
resultMap
解决实体类中给的字段和数据库中的字段名不相符
例如:
实体类字段
数据库字段
则配置文件如下:
<resultMap id="getUserByIdMap" type="User">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="getUserByIdMap">
select *
from mybatis.user
where id = #{id}
</select>