目录
4.在src/com下写一个db.properties配置文件
JAVAEE开发的三大框架:MyBatis、Spring MVC、Spring
MyBatis:封装jdbc代码的一个框架
Spring MVC:封装Servlet编程的一个框架
Spring:无缝融合MyBatis框架和Spring MVC框架的粘合框架
一、MyBatis框架API
--sqlSession相当于Connection连接对象,有一些操作数据库的方法
--SqlSessionFactory创建sqlSession回话对象的工厂
--SqlSessionFactoryBuilder创建SqlSessionFactory对象,加载mybatis.xml配置文件
--使用mybatis框架,让你不再关注数据库是如何连接的,让你重点写sql语句
二、使用mybatis框架
1.创建java项目
2.在项目下新建文件夹lib ,把jar包导入进去
3.在src下写一个mybatis.xml配置文件
--在mybatis.xml配置文件中加载db.properties
<?xml version="1.0" encoding="UTF-8"?>
<!-- .DTD文件是xml格式文件的约束文件,它约束了该xml文件使用的标签以及标签之间的关系 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 -->
<configuration>
<!-- properties 标签代表 加载指定路径的properties文件 -->
<properties resource="com/db.properties"></properties>
<!-- 配置 -->
<settings>
<!-- 默认mybatis3 传入null值 会报错.设置 当传入值为null时,字段值使用NULL来代替 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 类型别名: 自定义别名 -->
<typeAliases>
<!-- 实体的包名+类名 -->
<!-- <typeAlias type="com.entity.Pep5bean" alias="_pep5bean"/> -->
</typeAliases>
<!-- 可以配置很多数据库环境 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<!-- 数据库连接的参数 -->
<property name="driver" value="${driverName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${userName}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载 mapper映射文件 -->
<mappers>
<!-- <mapper resource="com/dao/mapper.xml"/> -->
</mappers>
</configuration>
4.在src/com下写一个db.properties配置文件
url=jdbc:oracle:thin:@localhost:1521:orcl
driverName=oracle.jdbc.driver.OracleDriver
userName=scott
password=a733511
5.测试连接数据库(写好表对应的实体类)
6.写mapper.xml映射文件
此时名称空间可以命自己想命的名字
<?xml version="1.0" encoding="UTF-8"?>
<!-- dtd约束 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 名称空间 namespace :区别不同映射文件中的唯一标识 -->
<mapper namespace="stu">
<select id="findById" parameterType="int" resultType="com.a_test.Stu">
select * from stu where u_id=${value}
</select>
</mapper>
7.在mybatis.xml中加载mapper.xml文件
<!-- 加载 mapper映射文件 -->
<mappers>
<mapper resource="com/a_test/mapper.xml"/>
</mappers>
8.测试
package com.a_test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test1 {
public static void main(String[] args) throws IOException {
//1.构建配置文件的输入流
InputStream in = Resources.getResourceAsStream("mybatis.xml");
//2.创建sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//3.创建会话实例(相当于connection)
SqlSession sqlSession = sqlSessionFactory.openSession();
System.out.println(sqlSession);
/**
* 第一个参数:你要调用哪个映射文件的哪个标签
* 第二个参数:要传入的参数
*
*/
Stu stu = sqlSession.selectOne("stu.findById",2);
System.out.println(stu);
//4.关闭资源
sqlSession.close();
}
}
9.结果
org.apache.ibatis.session.defaults.DefaultSqlSession@3b81a1bc
Stu [u_id=2, u_username=小lan, u_password=1d3]
9.1#{}和${}
#{}和${value}表示参数的注入
#{}表示preparedStatement的占位符,传入的参数会自动进行类型转换
${value}参数的 字符串拼接,不会进行类型转换
如下:该sql语句输入参数类型为Stu,呢么#{u_id}中的u_id一定要是Stu的一个属性
输入参数的类型可以是实体类、int、double......
如果方法的输入参数是List<Product> ,ParamterType就写Product
9.2自定义别名和批量别名
在mybatis.xml中为实体类添加别名 ,写在mybatis.xml的根标签中
目的:在写mapper.xml时的resultType和parameterType可以不用写全类限定名可以使用别名替代。
自定义别名:
<typeAliases>
<!-- 类型别名: 自定义别名 -->
<!-- 实体的包名+类名 -->
<typeAlias type="a_cache.Stu" alias="_stu"/>
<!-- 类型别名:批量别名 -->
<package name="b_batch"/>
<package name="i_eg.entity"/>
</typeAliases>
9.3ORM映射
如果数据库的字段名和实体类的属性名不一样。又没有ORM映射,就获取不到数据库中字段的值。
像一些查询语句获取某个字段的值就获取不到。
<!-- ORM映射 -->
<resultMap type="_student" id="student">
<!-- 要将 实体类的属性 与 数据库的字段名对应起来 -->
<!-- 主键设置 -->
<id property="uid" column="u_id"/>
<!-- 其他字段的映射 -->
<result property="uPwd" column="u_Pwd"/>
<result property="uRegtime" column="u_Regtime"/>
<!-- 没有写的字段,默认ResultSet 对象会获取 与 实体属性名一样的 字段名 -->
</resultMap>
三、Mybatis用动态代理方式实现
避免出现 Stu stu = sqlSession.selectOne("stu.findById",2);这样的"stu.findById"硬编码
StuMapper mapper = sqlSession.getMapper(StuMapper.class);
List<Stu> list = mapper.findAllstu();
/**
* 获取dao接口的代理实现对象(动态代理对象,帮你实现了UserMapper接口,
* 并且实现了其中的方法)
*
* mybatis会提供一个代理实现类,代理实现类重写了该接口(UserMapper)的所有方法
*
* 过程:
* 1)通过getMapper(Mapper.class)获取 该接口对应的mapper.xml文件
* 规范1:接口的包名+类名 要对应唯一的 一个映射文件的名称空间
* 2)读取并且加载mapper.xml文件
* 3)当你调用 代理实现类的方法的时候,会从mapper.xml文件中找到对应的statement对象
* 规范2:接口的方法名 要 与 mapper.xml文件中的标签的ID属性 一致
*/