MyBatis学习笔记–代码实现
思路:搭建环境–>导入MyBatis–>编写代码–>测试
搭建环境
- 搭建数据库
create database mtbatis;
use mabatis;
create table user(
id int primary key not null,
name varchar(30) default null,
pwd varchar(30) default null
)engine = InnoDB default charset = utf8
insert into user (id,name,pwd) values
(1,'abt','123456'),
(2,'abt2','123456'),
(3,'abt3','123456');
- 新建项目
-
新建一个普通Maven项目
-
导入Maven依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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>com.albert</groupId> <artifactId>MyBatis-study</artifactId> <version>1.0-SNAPSHOT</version> <!--导入依赖--> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</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> </dependency> </dependencies> </project>
创建一个模块
- 编写MyBatis核心配置文件
<?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核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
</configuration>
- 编写MyBatis工具类
package com.alb.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;
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 的实例。S
// qlSession 提供了在数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
编写代码
-
实体类
package com.alb.pojo; // 实体类 public class User { private int id; private String name; private String pwd; public User(){ } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
-
Dao接口
package com.alb.dao; import com.alb.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); }
-
接口实现类由原来的UserDaoImpl转为一个Mapper配置文件
<?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:绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.alb.dao.UserDao"> <select id="getUserList" resultType="com.alb.pojo.User"> select * from `user`; </select> </mapper>
测试
注意:
org.apache.ibatis.binding.BindingException: Type interface com.alb.dao.UserDao is not known to the MapperRegistry.
每一个Mapper.xml都需要在MyBatis核心配置文件中注册
MapperRegistry:
核心配置文件中注册mappers
-
junit测试
@Test public void test(){ // 第一步:获取sqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); for (User user : userList) { System.out.println(user); } // 关闭sqlSession sqlSession.close(); }
CRUD
namespace
namespace中的包名要和Dao/mapper接口的包一致
select
查询语句
- id:就是对应namespace中的方法名
- resultType:Sql语句执行的返回值
- parameterType:参数类型
上述例子即为查询
insert
插入语句
- id:就是对应namespace中的方法名
- parameterType:参数类型
// 根据ID查询用户
public User getUserById(int id);
<insert id="addUser" parameterType="com.alb.pojo.User">
insert into `user`(id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
// 增删改需要提交事务
@Test
public void addUser(){
// 获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 使用和指定语句的参数和返回值相匹配的接口
UserDao userDao = sqlSession.getMapper(UserDao.class);
// 传入需添加用户的信息
User user = new User();
user.setId(4);
user.setName("zhangsan");
user.setPwd("123456");
// 判断是否插入成功
int res = userDao.addUser(user);
if(res > 0)
System.out.println("成功");
else
System.out.println("失败");
// 提交事务
sqlSession.commit();
// 关闭sqlSession对象
sqlSession.close();
}
update
更新语句
- id:就是对应namespace中的方法名
- parameterType:参数类型
// 新增用户
public int updateUser(User user);
<update id="updateUser" parameterType="com.alb.pojo.User">
update user set name = #{name}, pwd = #{pwd}
<where>
id = #{id}
</where>
</update>
@Test
public void updateUser(){
// 获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 使用和指定语句的参数和返回值相匹配的接口
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setName("abtt");
user.setPwd("112233");
user.setId(1);
int res = userDao.updateUser(user);
sqlSession.commit();
if (res > 0)
System.out.println("Success");
else
System.out.println("Failed");
sqlSession.close();
}
delete
// 删除用户
public int deleteUser(int id);
<delete id="deleteUser" parameterType="int">
delete from user
<where>
id = #{id}
</where>
</delete>
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
int res = userDao.deleteUser(4);
sqlSession.commit();
if (res > 0)
System.out.println("Success!");
else
System.out.println("Failed!");
sqlSession.close();
}
注意:增删改中必须要提交事务