mybatis搭建入门、配置及实现增删改查
1.开发环境
IDE:idea 2019.1
构建工具:maven 3.8.2
MySQL版本:MySQL 8.0
MyBatis版本:MyBatis 3.4.6
2.创建maven工程
-
创建maven项目,建议把外层src文件夹删掉,再建立二级模块,这样方便用外层xml做全局配置
-
在外层pom.xml中导入依赖
<dependencies>
<!--mybatis依赖导入-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
3.创建MyBatis的核心配置文件
在‘resources’文件夹下创建一个xml核心配置文件,习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring
之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及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>
<!--配置连接数据库的环境-->
<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/数据库名?serverTimezone=Asia/Shanghai"/>
<property name="username" value="数据库用户名"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<!--此处先在‘resources’文件下创建个mybatis的映射文件-->
<mapper resource="xxx.xml"/>
</mappers>
</configuration>
4.创建实体类
在src/main文件夹中创建java实体类com.mojito.User
用alt+insert快速构造get set方法
public class User {
private int id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", 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;
}
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
}
5.创建mapper接口
创建接口类“com.mapper.UserMapper”。MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
public interface UserMapper {
/*
* mybatis面向接口编程的两个一致
* 1.映射文件的namespace要和mapper的全类名保持一致
* 2.映射文件中sql语句的id要和mapper接口中的方法名一致
*
* 表-实体类-mapper接口-映射文件
* */
/**
* 添加用户信息
*/
int insertUser();
}
6.创建MyBatis的映射文件
相关概念:ORM(Object Relationship Mapping)对象关系映射。
对象:Java的实体类对象
关系:关系型数据库
映射:二者之间的对应关系1、映射文件的命名规则:
表所对应的实体类的类名+Mapper.xml
例如:表user,映射的实体类为User,所对应的映射文件为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
MyBatis映射文件存放的位置是src/main/resources/mappers目录下
2、MyBatis中可以面向接口操作数据,要保证两个一致:
a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致
b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
Java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
<?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.mapper.UserMapper">
<!--int insertUser();-->
<insert id="insertUser">
insert into user values(10,'admin','shiyang')
</insert>
</mapper>
7.通过junit测试功能
在test文件夹里创建测试类com.mojito.mybatis.test,在test包下创建test.java类
- SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
- SqlSessionFactory:是“生产”SqlSession的“工厂”。
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
public class test1 {
/*
* SqlSession默认不自动提交事务,若需要自动提交事务
* 可以使用SqlSessionFactory.openSession(true);
* */
@Test
public void testMybatis() throws IOException {
//加载核心配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlSessionFactoryBuilder且获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession 可实现mybatis的功能 访问sql语句
//SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession sqlSession = sqlSessionFactory.openSession(true);//优化为自动提交 设置自动提交参数为true b是autoCommit
//获取mapper接口对象 getMapper底层是个代理模式 可以帮助获取接口的一个实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//测试功能 过程:从mapper接口-->映射文件xml-->根据方法找到要调用的sql语句
int result = mapper.insertUser();
//提交事务
//sqlSession.commit();
System.out.println(result);
}
}
7.加入log4j日志功能
-
在外层pom.xml中加入依赖
<!--log4j日志依赖--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
加入log4j的配置文件
log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
8.mybatis的增删改查
**小技巧:**接口文件中写函数接口时alt+回车可利用mybatisX插件在xml映射文件中自动生成sql语句
(1)增
UserMapper接口文件中:
//添加用户
int insertUser();
UserMapper.xml映射文件中
<!--int insertUser();-->
<insert id="insertUser">
insert into user values(10,'admin','shiyang')
</insert>
test1.java测试文件:
@Test
public void testMybatis() throws IOException {
//加载核心配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlSessionFactoryBuilder且获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession 可实现mybatis的功能 访问sql语句
//SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession sqlSession = sqlSessionFactory.openSession(true);//优化为自动提交 设置自动提交参数为true b是autoCommit
//获取mapper接口对象 getMapper底层是个代理模式 可以帮助获取接口的一个实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//测试功能 过程:从mapper接口-->映射文件xml-->根据方法找到要调用的sql语句
int result = mapper.insertUser();
//提交事务
//sqlSession.commit();
System.out.println(result);
}
(2)删除
UserMapper接口文件中:
//删除用户信息
void deleteUser();
UserMapper.xml映射文件中:
<!--void deleteUser();-->
<delete id="deleteUser">
delete from user where id = 10
</delete>
test1.java测试文件:(包含了删、改、查,代码只用改注释操作部分)
@Test
public void testUpdateOrDelete() throws IOException {
//加载核心配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlSessionFactoryBuilder且获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession 可实现mybatis的功能 访问sql语句
//SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession sqlSession = sqlSessionFactory.openSession(true);//优化为自动提交 设置自动提交参数为true b是autoCommit
//获取mapper接口对象 getMapper底层是个代理模式 可以帮助获取接口的一个实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//修改
//mapper.updateUser();
//删除
//mapper.deleteUser();
//查询
//方式1:根据id查询 返回类型为实体类
/* User user = mapper.getUserById();
System.out.println(user);*/
//方式2:查询所有的用户信息 List集合
List<User> list = mapper.getAllUser();
list.forEach(System.out::println);
}
(3)改
UserMapper接口文件中:
//修改用户
void updateUser();
UserMapper.xml映射文件中:
<!--void updateUser();-->
<update id="updateUser">
update user set name = '石阳' where id = 2
</update>
test1.java测试文件:见(2)
(4)查
UserMapper接口文件中:
//查询
// 方式1:根据id查询 返回类型为实体类
User getUserById();
// 方式2:查询所有的用户信息 List集合
List<User> getAllUser();
UserMapper.xml映射文件中:
<!--User getUserById();-->
<!--查询功能的标签必须设置->resultType:设置默认的映射关系
resultMap:设置自定义的映射关系-->
<select id="getUserById" resultType="com.mojito.User">
select * from user where id = 5
</select>
<!-- List<User> getAllUser();-->
<select id="getAllUser" resultType="com.mojito.User">
select * from user
</select>