1、根据xml配置创建一个sqlsessionfactory的对象
有数据源的一些运行环境信息
2、sql映射文件,配置了每一个sql,以及sql的封装规则
3、将sql注册在全局配置文件中
4、coding
1)根据全局配置文件得到SqlsessionFactory
2)试用sqlsession工厂,获取到sqlsession对象试用它来执行增删改查
一个sqlsession就是代表与数据库的一次对话,用完关闭(close)
3)使用sql唯一标识该告诉mybatis执行哪个sql,sql都是保存在sql映射文件中
String resource = "mybatis-config.xml";
InputStream inputStrem = Resource.getResoureceAsStream(resource);
SqlsessionFactory sessionFactory = new SqlSessionFactoryBuilder().Builder(resource);//获取sqlsessionfactory对象
SqlSession opensession = sessionFactory.openSession();//使用opensession方法获取sqlsession对象
加载数据库信息-->创建sqlsession工厂-->用OpenSession()方法创建sqlsession,每个sqlsession都是一个数据库查询实例
//获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = opensession.getMapper(EmployeeMapper.class);//获取接口的实现类对象
Employee empById = mapper.getEmpById(1);//调用接口的方法
System.out.println(mapper.getClass());
System.out.println(empById);
传多个参数时候需要加上@Param(“xx”)。
用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
jdbc oracle
mybatis 在接口类中传参
#{}和${}的区别:
个人理解就是#{}防止sql注入
${}用于处理sql语句中动态填入的部分,例如某个图书的info表 书名_info_tbl,这时候书名就该直接拼接进来。又如下图样例中年份工资表和排序规则。没法sql预编译,只能拼接。
有时候resultType返回可能为null时,自己写个resultMap
例如DepartmentMapper.xml
<?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.atguigu.mybatis.dao.DepartmentMapper"> <resultMap type="com.atguigu.mybatis.bean.Department" id="Dept"> <id column="dept_id" property="id"/> <result column="dept_name" property="department_name"/> </resultMap> <select id="getDeptById" resultMap="Dept"> select id,dept_name from tbl_department where id = #{id} </select> </mapper>
DepartmentMapper接口类规定了方法。
Department类是一个POJO
<!--id标签和result标签中 column数据库列名,property对应Department中属性名 -->
<!--
association
property 联级查询中java类的类名。
javaType 该类名的全类名
-->
mybatis 配置的xml中。设置延时加载
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--
mapUnderscoreToCamelCase 默认为false 设置为true后开启驼峰命名
lazyLoadingEnabled 默认flase
aggressiveLazyLoading 默认true
-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="flase"/>
</settings>