基本使用
-
1.导入所依赖的jdbc连接jar包和mybatis jar包
-
2.po的中属性的命名要和数据库中表中字段的命名一致
-
3.配置mybatis-config.xml主要用于数据库的连接和与写sql语句配置文件的关联。configuration中可以给po包起别名(typeAliases),除此之外还要与mapper文件关联(mappers)
-
4.mapper文件中写sql语句,增删查改分别对应insert、delete、select、update关键字
- 一条语句相关的参数:
- id: statementID: 代表的是一整条sql语句
- parameterType: 输入映射(实操发现该项可以没有)
- resultType: 输出映射
- #{} : 占位符,相当于我们sql语句中的?占位符(占位符的值: 如果输入映射是基本类型,占位符的值可以是value或者任意;如果输入映射不是基本类型,则一定要写成value)
- 一条语句相关的参数:
-
5
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
通过上面的操作拿到SqlSession,用它来执行mapper文件中相应的sql语句
- 6.对于一个插入语句一般情况没有返回值,如果在插入后需要返回数据库表的当前自增主键,需要做如下操作
<insert id="addUser" parameterType="com.ming.po.User">
<!--
keyProperty : 将查询结果(就一个数字,当前表中最大的ID值)封装到User对象的id属性中
order : 在insert语句之前还是之后执行 last_insert_id();
resultType : 执行select last_insert_id()之后的返回值
-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select last_insert_id();
</selectKey>
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert>
- 7.#{}和${}的区别
简单来说#{} 解析的是占位符?可以防止SQL注入,比如打印出来的语句 select * from table where id=?然而${} 则是不能防止SQL注入,打印出来的语句 select * from table where id=2
面向接口开发
而在企业中在使用Mabatis的时候都是面向接口进行开发,这又如何去做?
- 创建一个接口,每一个statement都有一个接口中对应的方法与之对应,并且方法的命名命名要与写sql语句的xml文件中的statementId对应,同样返回值域resultType对应,参数与parameterType对应。
- 有了接口当然就要有该接口的实现类,在该类中覆写接口中的方法,获取SqlSession,并作相应的业务处理
- 而在真正使用的时候,只需要new一个该实现类的实例,传入需要的参数,并调用接口中的方法就OK
Mapper代理方式开发
mapper代理方式开发是对企业级开发中的面向接口开发的升级
- 面向接口开发的过程中可以发现有一个接口就要写一个对应的实现类,而mapper代理的方式就是为了化简这个过程,将接口对象的实例创建通过动态代理的方式来完成
- 而需要动态代理的方式来自动完成,我们在编写的接口的时候就必须要遵循一定的规范
- mapper.xml文件的namespace必须是该接口的全限定名
- mapper.xml文件中的statementID是接口的方法名
- mapper.xml文件中的parameterType是接口方法的参数类型
- mapper.xml文件中的resultType是接口方法的返回值
- 注意使用mapper代理开发的时候,自己写sql语句的那个xxxMapper.xml文件要和接口放在同一个包下,而且命名要完全完全一致
- 接下来我们就要在configuration的xml配置文件中指定需要扫描的包,将原来给定的mappper.xml文件改为包扫描的形式
<mappers>
<!--原来格式-->
<mapper resource="xxx.xml"/>
<!--现在格式-->
<package name="com.mechanicalwood.mapper"/>
</mappers>
- 然后在使用的时候首先通过反射,拿到该相应接口的实例对象
SqlSession sqlSession = sqlSessionFactory.openSession();XxxMapper xxxMapper = (xxxMapper) sqlSession.getMapper(XxxMapper.class);
,拿到了mapper之后再调用mapper中的方法完成相应的操作
动态sql
在开始动态sql之前先引入两个概念包装类和扩展类
- 在实际开发项目中,我们查询条件不可能很单一,查询字段可能包括很多字段,我们在基础实体类的基础上扩展他,之后包装他作为我们的查询条件。
- 扩展类用于继承所查询的实体类,直接获取实体对象的字段,并添加一些扩展字段
- 包装类用于parameterType,在使用的时候扩展的东西可以写在包装类里面也可以写在扩展类里面,最后扩展类通过set方法获取到了要查询的信息,然后进行查询
动态sql
- 在查询的时候为了避免statement的sql语句重复,引入了动态sql还有sql片段。
- 通过对传入的包装类属性值的判断,来确定要不要执行相应的sql语句
- <if>是用于动态sql的第一步,用于判断传入的参数是否为空,来决定下面的statement是否需要执行。但是当进行多条件查询的时候,通过if虽然也能完成相应的工程,但实现起来比较冗余,所以引出了<where>。
- <where>标签会进行自动判断,如果任何条件都不成立,那么就在sql语句里就不会出现where关键字
如果有任何条件成立,会自动去掉多出来的 and 或者 or。
resultMap
- resultMap是用于区别resultType的,当sql语句所查询出来表的字段跟实体类的属性不一致的时候会用到resultMap
同时查询多个ID值
要解决这个问题会用到包装类和动态sql的foreach
- 在包装类中建立一个int类的List,然后在需要用的时候传入这个List
- 在statement中使用foreach分别读出List中的id值,生成相应的查询多个id值得sql语句
配置文件相关
别名
在configuration的xml配置文件中可以给相应的po类起别名,有两种方式
- 单个类:
<typeAliases>
<!--给User起别名aliasUser: 单个起别名-->
<typeAlias type="com.mechanicalwood.po.XXX" alias="XXX"/>
</typeAliases>
- 包下所有类:
<typeAliases>
<!--批量起别名,原则:和类名一样或者类名的第一个字母小写 -->
<package name="com.mechanicalwood.po"/>
</typeAliases>
在xml文件中引入配置文件中的参数方法
- 1.编写xxx.properties文件,k=v的格式给出
- 2.在xml文件中引入相关的配置文件
- 3.在需要的地方用${k}的方式替换所需要的value值