🍤MyBatis框架①
- 简介
- Mybatis的基本使用
①. 环境配置 ②.定义SQL映射文件 ③.基本使用 ④.封装会话 ⑤.接口绑定
一、🍜简介
1、 🍜什么是Mybatis:
- Mybatis是一个半自动的ORM持久层框架,内部封装了JDBC
2、 🍜Mybatis的优点:
- 简单易学,容易上手
- JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
- MyBatis相当灵活,便于统一管理和优化,并可重用。
- 总的是,学习简单,灵活,适合做互联网开发
3、🍜 Mybatis的缺点:
- ① SQL语句的编写工作量较大
- ② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
二、🍜Mybatis的基本使用
- 环境配置
- 定义核心配置文件
- 定义SQL映射文件
- 基础使用
- selectList(“命名空间.id”) 用户查询多条数据情况,返回一个List集合, 没有查到数据返回空集合,不是null
- selectOne(“命名空间.id”) 用于查询单条数据,返回一个数据, 如果没有查到返回null
- selectMap(“命名空间.id”,key的字段名) 用于查询多条记录情况, 返回Map集合, 需要指定那个属性作为key, sql查询结果作为value,指定的字段值作为key, 如果查不到, 返回一个空map集合,不是null。
1、🍜环境配置
(1)、 在项目下建lib包导入jar包
(2)、分别在src下建包和mybatis配置文件
(3)、配置文件的内容
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=SCOTT
password=TIGER
<?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 : 当前选择使用哪一个环境 ,定义要使用的环境的id属性值
<!
<properties resource="db.properties" />
<!
<!
<typeAliases>
<typeAlias type="com.mybatis.pojo.Dept" alias="dept"/>
<!
<!
<!
<!
</typeAliases>
<environments default="dev">
<!
<environment id="dev">
<!
<transactionManager type="JDBC"/>
<!
type="POOLED" 选择连接池技术管理连接
<dataSource type="POOLED">
<!
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!
<mappers>
<!
<package name="com/mybatis/mappers"/>
</mappers>
</configuration>
2、🍜定义SQL映射文件
<?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.mybatis.mappers.DeptMapper">
</mapper>
3、🍜基本使用
(1)sql.selectList(“命名空间.id”); 测试类:
SqlSession sql=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Mybatis_config.xml")).openSession();
List<String> result01=sql.selectList("com.mybatis.mappers.DeptMapper.queryNames");
result01.forEach(System.out::println);
sql映射文件DeptMapper.xml文件内容
<select id="queryNames" resultType="String">
select dname from dept
</select>
(2)sql.selectOne(“命名空间.id”);
测试类:
Dept result02=sql.selectOne("com.mybatis.mappers.DeptMapper.queryDeptno",20);
System.out.println(result02);
sql映射文件DeptMapper.xml文件内容
<select id="queryDeptno" resultType="dept" parameterType="int">
select * from dept where deptno=${deptno}
</select>
(3)selectMap(“命名空间.id”,key的字段名)
测试类:
Map<String,Dept> map = session.selectMap("com.yjxxt.mappers.DeptMapper.queryAll","dname");
System.out.println(map);
sql映射文件DeptMapper.xml文件内容
<select id="queryAll" resultType="com.yjxxt.pojo.Dept">
select * from dept
</select>
4、🍜封装会话功能和<typeAliases>别名和<Package>
(1)typeAliases别名
- 定义后的别名,不区分大小写
- alias="别名"
- 为了方便sql映射文件内编写sql文件
在Mybatis_config.xml文件中的<configuration>标签下:》》
<typeAliases>
<typeAlias type="com.mybatis.pojo.Dept" alias="dept"/>
<package name="com.yjxxt.pojo"/>-->
</typeAliases>
(2)Package包路径
- 默认在Package包下寻找sql映射文件
- 在Mybatis_config.xml文件内配置
<mappers>
<package name="com/mybatis/mappers"/>
</mappers>
(3)封装会话工具包
public class SessionTool {
private static SqlSessionFactory sqlfactory=null;
static {
try {
sqlfactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Mybatis_config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession(){
SqlSession sion=null;
if(sqlfactory!=null){
sion= sqlfactory.openSession(true);
}
return sion;
}
}
5、🍜接口绑定方案
1. 接口名在SQL映射文件同名,同一个包下 2. 命名空间=全包名+类名 3. sql的id=对应的抽象方法 4. sql的入参,返回值与方法的一致 5. 注解:@param()给入参起别名,方便使用
(1)简单使用方式
- 在sql文件同级建同名接口,并在内写方法
- sql映射文件内编写id要求与方法同名,返回类型相同,入参类型相同
测试类:》》
DeptMapper dept01=sql.getMapper(DeptMapper.class);
System.out.println(dept01.queryDept());
sql映射文件》》
<select id="queryDept" resultType="Dept">
select * from dept
</select>
接口》》》
public interface DeptMapper {
List<Dept> queryDept();
Dept queryDeptno(int deptno);
List<String> queryNames();
}
(2)通过接口绑定解决多参数传递问题
DeptMapper dept01 = sql.getMapper(DeptMapper.class);
System.out.println (dept01.queryDeptnoAndDname (20, "RESEARCH"));
<select id="queryDeptnoAndDname" resultType="Dept">
select * from dept where deptno=#{deptno} and dname=#{dname}
</select>
public interface DeptMapper {
List<Dept> queryDept();
Dept queryDeptnoAndDname(@Param("deptno") int deptno,@Param("dname") String dename);
}
3、接口代理开发(CRUD)
增加数据(接口)》》》
public interface UserMapper {
public int addUser(String name,int pwd);
}
增加数据(sql映射)》》》
<insert id="addUser">
INSERT INTO T_USER VALUES(seq_user_id.nextval,#{param1},#{param2})
</insert>
修改数据(接口)》》》
public interface UserMapper {
public int updateUser(User user);
}
修改数据(sql映射)》》》
<update id="updateUser" parameterType="User">
update t_user set username=#{username},userpwd=#{userpwd} where id=#{id}
</update>
删除数据(接口)》》》
public interface UserMapper {
public int deleteUser(int id);
}
删除数据(sql映射)》》》
<delete id="deleteUser" parameterType="int">
delete from t_user where id=#{id}
</delete>
查询数据(接口)》》》
public interface UserMapper {
public List<User> queryUserByNamePwd(@Param("name") String name,@Param("pwd") int pwd);
查询数据(sql映射)》》》
<select id="queryUserByNamePwd" resultType="User">
select * from t_user where username=#{name} or userpwd = #{pwd}
</select>
-----未完待续……
|