Mybatis框架
mybatis是一个半ORM框架,它可以让程序员只关注sql语句
,其他jdbc步骤不用关心.
Mybatis框架: 是方便开发==Dao层(持久层)==代码.
注意:官网: mybatis – MyBatis 3 | 简介
完全的ORM框架,可以实现"全自动",即只要根据ORM要求,将数据表和实体类设计的完全对应,那么在项目中就可以不用写SQL,由框架自动生成.
例如: Hibernate , Jpa , MybatisPlus , tk-mapper
使用流程
1.创建maven-java项目
2.加入对应依赖
<dependencies>
<!-- mybatis的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- jdbc驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
mybatis全局配置文件
名称:常用mybatis-config.xml或者sqlconfing.xml等
格式:xml格式
位置:mian 的resource下
内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 固定的 -->
<configuration>
<!-- jdbc环境 -->
<environments default="development">
<environment id="development">
<!-- 事务管理:jdbc管理 -->
<transactionManager type="JDBC"/>
<!-- 数据源配置:
type:POOLED,池化技术,使用数据库连接池
-->
<!--
jdbc连接属性
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/java2212"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件 -->
<!--加载接口文件 加载sql语句以及接口方法 -->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
mybatis框架简化dao层,并改名为mapper
package com.qf.mapper;
import com.qf.model.User;
/**
* 现在使用了Mybatis后,统一将包名替换成mapper,接口名替换成XxxMapper.java
*/
public interface UserMapper {
User findUserById(int id);
}
mybatis 的映射文件
<!--
以前,是写完Dao层接口,需要写Dao层实现类,在实现类中写JDBC
现在,是写完Mapper层接口,需要写Mapper接口的xml映射文件,其中写sql语句
-->
<!--
映射文件名称: 模块名Mapper.xml
映射文件格式: xml
映射文件位置: 放在resources下,(后续也可以放在mapper包下...)
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mapper跟标签
namespace="该映射文件对应的接口文件的全限定名"
-->
<!--namespace选择进行下部操作的接口 -- >
<mapper namespace="com.qf.mapper.UserMapper">
<!--mysql的增删改查均在mappper标签内进行 -->
<!--
select 标签用于查询(后续还有其他标签)
id: 接口中的方法名
resultType: 结果类型,是查询返回的结果集要封装的那个类(这一步就是自动ORM)
parameterType: 接口中方法的参数类型
-->
<select id="findUserById" resultType="com.qf.model.User" parameterType="int">
<!--
以前此处写的 where id = ?
现在此处写 where id = #{},当接口的参数是简单类型时,此处任意,
但是接口的参数是复杂类型是就有限制,后续再说
此时,{}内的与方法参数名一致即可
-->
select * from user where id = #{id}
</select>
</mapper>
测试
1.加入测试依赖
2 在方法上加上@Test注解
3 单元测试的方法,一定要是无返回值,void
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
执行流程
- 通过配置文件逻辑,获得文件流
- 通过流获得SqlSessionFactory
- 通过工厂获得SqlSession
- 通过SqlSession获得接口的代理对象
- 通过接口对象调用方法执行
- 其实执行的是接口方法对应的xml中的标签内的sql语句
1.查询
接口方法的参数是单个
UserMapper
UserMapper.xml
TestMybitis
Users findUserById(int id);
<select id="findUserById" resultType="com.qf.model.Users" parameterType="int">
<!--
以前此处写的 where id = ?
现在此处写 where id = #{},当接口的参数是简单类型
时,此处任意,
但是接口的参数是复杂类型是就有限制,后续再说
此时,{}内的与方法参数名一致即可
-->
select * from users where id = #{id}
</select>
@Test
public void hello() throws Exception {
// 配置文件路径
String resource = "mybatis-config.xml";
// 通过配置文件,获得输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过流获得SqlSession工厂
// SqlSession就是一次与SQL的交互
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理的模式
// 可以通过接口得到对应的映射文件,从而让映射文件执行
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Users users = mapper.findUserById(1);
System.out.println(users);
}
接口方法的参数是多个
Users findUserByLogin(@Param("name") String name ,@Param("password") String password);
<select id="findUserByLogin" resultType="com.qf.model.Users">
select * from users where name = #{name} and password = #{password}
</select>
@Test
public void find() throws IOException {
// 配置文件路径
String resource = "mybatis-config.xml";
// 通过配置文件,获得输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过流获得SqlSession工厂
// SqlSession就是一次与SQL的交互
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理的模式
// 可以通过接口得到对应的映射文件,从而让映射文件执行
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Users userByLogin = mapper.findUserByLogin("李四", "123");
System.out.println(userByLogin);
}
接口方法的参数是对象类型
Users findUserByUsers(Users users);
<select id="findUserByUsers" resultType="com.qf.model.Users" parameterType="com.qf.model.Users">
select * from users where name = #{name} and password = #{password}
</select>
@Test
public void user() throws IOException {
// 配置文件路径
String resource = "mybatis-config.xml";
// 通过配置文件,获得输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过流获得SqlSession工厂
// SqlSession就是一次与SQL的交互
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理的模式
// 可以通过接口得到对应的映射文件,从而让映射文件执行
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Users userByUsers = mapper.findUserByUsers(new Users(1,"李四","123"));
System.out.println(userByUsers);
}
接口方法的参数是Map
Users findUserByLoginMap(Map<String,String> map);
<select id="findUserByLoginMap" resultType="com.qf.model.Users" parameterType="Map">
select * from users where name = #{name} and password = #{password}
</select>
@Test
public void mapUsers() throws IOException {
// 配置文件路径
String resource = "mybatis-config.xml";
// 通过配置文件,获得输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过流获得SqlSession工厂
// SqlSession就是一次与SQL的交互
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理的模式
// 可以通过接口得到对应的映射文件,从而让映射文件执行
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, String> map = new HashMap<>();
map.put("name","李四");
map.put("password","123");
Users userByLoginMap = mapper.findUserByLoginMap(map);
System.out.println(userByLoginMap);
}
接口方法的参数是List
List<User> findAllUser();
<!--
查询返回一个对象,还是List集合,resultType指定的都是要封装的实体类类型
特别注意:不是List
-->
<select id="findAllUser" resultType="com.qf.model.User">
select * from user
</select>
删除【重要】
int deleteUserById(int id);
<delete id="deleteUserById" parameterType="int">
<!-- 删除使用<delete>标签
没有resultType属性,默认返回int类型数据-->
delete from users where id = #{id}
</delete