目录

这两个链接 基本上把本目录的所有知识点都包含进去了
mybatis高级查询具体操作

mybatis增删改查基本操作

Mybatis框架

1. jdbc回顾:

2. mybatis介绍

3. mybatis的整体架构

4. mybatis快速入门

5. 完整CRUD操作

6. 动态代理mapper实现类

7. mybatis-config 配置

8. Mapper.xml

9. 整理

10. 动态sql

11. 缓存

12. 高级查询

13. 分页插件

14. mybatis和spring整合

Mybatis框架

1.jdbc回顾:


jdbc的问题:

1、加载驱动问题:
每次执行都加载驱动
驱动名称,硬编码到java代码中,如果需要修改驱动。需要修改java文件
解决方案:将驱动名称放入到外部的配置文件
2、数据库的连接信息,硬编码到java代码中,解决方案:外部配置文件
3、设置参数的问题:
参数下标硬编码了。需要人为的去判断参数的位置。

4、遍历结果集:需要人工的判断字段名,以及个位置参数类型,不方便
是否可以:能够将结果集直接映射到一个pojo对象中
5、频繁的创建连接,关闭连接。导致资源浪费,影响性能,解决:连接池。

2.mybatis介绍

你会五大框架吗?

SSH spring struts2(webcontroller—[servlet]) hibernate (dao=jdbc—db)

SSM spring springmvc(webcontroller—[servlet] service[m] ) mybatis(dao=jdbc—db)


Cn.yanqi.bean domain entity pojo 实体类

在mybatis的包里面可以看到,ibatis的字样。

每一个框架都有一个核心配置文件,这个核心文件你必须会,不会这个框架就用不了

3.mybatis的整体架构

4.mybatis快速入门

编写第一个mybatis程序

创建数据表 tb_user

CREATE TABLE `tb_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_name` varchar(20) DEFAULT NULL,`sex` varchar(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

导入依赖

向工程的pom文件中,添加mybatis的依赖

向工程中,添加mybatis的依赖

编写全局配置文件

在工程的根目录src下面创建一个mybatis-config.xml 。这个名字不是固定的,可以随便起,
但也不能太随便,通常都叫mybatis-config.xml
注意:mybatis-config.xml 引入外部的jdbc.properties文件

外部的jdbc.properties文件

在src下创建

编写一个pojo实体类

提供getter,setter,toString方法

mapper.xml根据id查询用户信息

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200311065412420.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTE1MTk2MA==,size_16,color_FFFFFF,t_70)

1、创建一个局部的mapper.xml(名字也可以随便写,但是不能太随便,位置可以放在项目里的任何位置,只需要你能加载到对应的mpper.xml即可)

通常我们就叫标签为一个statement对象或者叫mapped statement对象

构建SqlSessionFactory

可以通过官方文档里找路径如下:

打开index.html

其中Mybatis-config.XML文件的位置不是固定的,只要能找到xml文件就行,可以随便放

2、在全局的mybatis-config.xml 中去添加mapper.xml的配置

3、书写java代码,调用指定的statement,并且传递参数信息。获取返回值


测试打印查看是否查询到数据

注意:需要在mybatis-config.xml 中使用mapper 去引入外部的mapper.xml

添加日志支持

放在src下面

导入依赖

mybatis使用步骤总结

5.完整CRUD操作

创建UserDao接口

 public interface UserDao {
/*** 根据id查询用户信息* @param id* @return
*/public User queryUserById(int id);    /*** 查询所有用户信息* @return*/public List<User> queryAllUser();/*** 根据id删除用户信息* @param id*/public void deleteUserById(int id);/*** 添加用户信息* @param user*/public void addUser(User user);/*** 修改用户信息* @param user*/public void updateUser(User user);}

创建UserDaoImpl实现类

public class UserDaoImpl implements UserDao{//需要sqlSession的来操作private SqlSession sqlSession;//临时解决方案,利用构造方法传入public UserDaoImpl(SqlSession sqlSession){this.sqlSession = sqlSession;}//根据id来查询用户@Overridepublic User queryUserById(int id) {return sqlSession.selectOne("user.queryUserById", id);}//查询所有@Overridepublic List<User> queryAllUser() {return sqlSession.selectList("user.queryAllUser");}//删除用户@Overridepublic void deleteUserById(int id) {sqlSession.delete("user.deleteUserById", id);}//添加用户@Overridepublic void addUser(User user) {sqlSession.insert("user.addUser", user);}//修改用户@Overridepublic void updateUser(User user) {sqlSession.update("user.updateUser", user);}
}

编写User对应的UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="user"><!-- 根据id来查询 --><select id="queryUserById" resultType="cn.yanqi.mybaits.pojo.User">select * from t_user where id = #{id}</select><!-- 查询所有 --><select id="queryAllUser" resultType="cn.yanqi.mybaits.pojo.User">select * from t_user</select><!-- 根据id来删除用户      没有结果集的映射的java对象--><delete id="deleteUserById">delete from t_user where id = #{id}</delete><!-- 添加用户 --><insert id="addUser">INSERT INTO t_user (id,name,sex)VALUES(NULL,#{name},#{sex})</insert><!-- 修改用户   #{name} pojo类属性一样--><update id="updateUser">UPDATE t_userSETname = #{name},sex = #{sex}WHEREid = #{id}</update></mapper>

在mybatis-config.xml里面引入UserMapper.xml

编写测试用例—操作


用Junit Test Case 来测试


编写测试用例

public class UserDaoTest {//new 一个userDao对象private UserDao userDao;private SqlSession sqlSession;//定义成全局的对象@Before//执行test方法之前执行public void setUp() throws Exception {String resource ="mybatis-config.xml";//读取xml配置文件InputStream is = Resources.getResourceAsStream(resource);//构建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //打开SqlSession,得到sqlSession可以进行curd的操作sqlSession = sqlSessionFactory.openSession();//userDao = new UserDaoImpl(sqlSession);//获取mapper的动态代理实现类userDao = sqlSession.getMapper(UserDao.class);}//根据id查询@Testpublic void testQueryUserById() {//调用userDao方法User user = userDao.queryUserById(1);System.out.println(user);}//查询所有@Testpublic void testQueryAllUser() {//调用userDao方法List<User> users = userDao.queryAllUser();//遍历输出for(User user : users){System.out.println(user);}}//根据id来删除@Testpublic void testDeleteUserById() {userDao.deleteUserById(6);sqlSession.commit();//必须开启事务}//添加user@Testpublic void testAddUser() {User user = new User();user.setName("yanqi");user.setSex("boy");userDao.addUser(user);sqlSession.commit();//不开启事务是写入不到数据库里去的}//修改用户@Testpublic void testUpdateUser() {//      1、先去查询User user = userDao.queryUserById(1);user.setName("yanqi");userDao.updateUser(user);
//      提交事务sqlSession.commit();}
}

数据库字段名和实体类属性名不一致的问题

查询数据的时候,查不到userName的信息,原因:数据库的字段名是user_name
POJO中的属性名字是userName
两端不一致,造成mybatis无法填充对应的字段信息。修改方法:在sql语句中使用别名
解决方案1:在sql语句中使用别名(麻烦)
Select * , user_name as username from t_user;


解决方案2: 参考后面的resultMap –mapper具体的配置的时候
解决方案3:参考驼峰匹配 — mybatis-config.xml 的时候

mybatis中dao层的命名规则

在mybatis中dao层的接口的名字不在使用***Dao 而是修改成***Mapper
例如:把UserDao,修改成UserMapper。 UserDao(Mapper)

思考CURD的dao中的问题

接口->实现类->mapper.xml

思考:能否只写UserDao接口,不书写实现类UserDaoImp,只编写Mapper.xml即可

6.动态代理mapper实现类

使用动态代理的目标是可以不用书写实现类,只需要书写接口和mapper.xml即可完成crud的操作

如果不想写实现类(UserDaoImpl ) ,只写接口UserDao ---- 就可以使用动态代理
因为在dao(mapper)的实现类中对sqlsession的使用方式很类似。mybatis提供了接口的动态代理

名称空间

mapper.xml 根标签的 namespace 属性
如果希望使用mybatis通过的动态代理的接口,就需要namespace 中的值,和需要对应的Mapper(dao)接口的全路径一直


通过sqlSession.getMapper(接口类.class)

使用动态代理总结

出现错误

错误原因:mapper接口的全路径和对应mapper.xml的名称空间不一致造成。

7.mybatis-config 配置

mapUnderscoreToCamelCase用法:

开启驼峰匹配:从经典数据库的命名规则user_name,到经典java命名规则的映射userName
java命名规则:驼峰书写, 大小写区分两个单词的界限。举例: userName;
数据库经典命名规则:两个单词之间,使用下划线分割。举例:user_name

开启驼峰匹配:相当于去掉数据库名字中的下划线,然后在与java中的属性名进行对应。

数据库中的user_name 和java属性中的 userName 是一样的
在mybatis-config.xml中:

typeAliases(常用)

给类起一个别名

缺点:需要为每一个类都去定义一个类型别名。书写麻烦。

typeAliases的使用2—使用扫描包



typeHandlers(类型处理器)

environments(环境)


预发布环境;

可以指定数据源

mappers----映射器

作用:将mapper.xml 文件配置到mybatis-config.xml的环境中。
<mapper url=”file…xml”这种是在硬盘中读取的,这种几乎不用

使用mapper接口路径:

这里所谓的mapper接口路径。实际上就是dao的接口路径。在mybatis中,通常把dao的包叫做mapper
类名,也叫做mapper

1、定义一个接口
2、在接口所在的包中定义mapper.xml
3、在mybatis-config.xml 中通过class路径,引入mapper。要求mapper.xml 中的名称空间是类的接口的全路径

问题:
1、mapper.xml 和 java文件没有分离。spring整合之后解决。
2、需要一个一个的去加载mapper

使用mapper接口扫描包(常用)


扫描的是包

缺点:
1、如果包的路径有很多?2、mapper.xml和mapper.java没有分离。
2、在spring整合的时候可以解决这个问题

整理mybatis-config中的内容

2settings:开启驼峰匹配。
从数据库的经典命名规则到java经典命名规则的映射; 把数据库中的下划线去顶在和java中的内容进行映射。

 <settings><setting name="mapUnderscoreToCamelCase" value="true" /></settings>

3、typealiases:类型别名。 为一些java对象,去起一个简写的名字,减少mapper.xml中的 代码书写量。

 <typeAliases><package name="cn.yanqi.mybatis.pojo"/>
</typeAliases>

4、环境:数据库的连接信息
5、mappers:关联外部的mapper.xml文件的
把外部的mapper.xml加载到mybatis中

扫描包的方式:

<mappers><!--扫描指定包下面的所有的接口要求:1、要求mapper.xml文件的名字和mapper接口的名字,一致2、要求mapper.xml文件 和 mapper接口类在一个目录下--><package name="cn.yanqi.mybatis.mapper"/>
<mapper resource="cn/yanqi/mybatis/resources/mapper.xml"/>
<mapper class="cn.yanqi.mybatis.mapper.UserMapper"/></mappers>

8.Mapper.xml

CURD操作

select

select – 书写查询sql语句

id属性:当前名称空间下的statement的唯一标识。必须。要求id和mapper接口中的方法的名字一致。
Select 标签中 resultType:将结果集映射为java的对象类型必须要有(和 resultMap 二选一)

parameterType:传入参数类型。可以省略,会自判断传入的是什么类型

要求:查询当前有多少人

接口方法

测试

insert

insert 的几个属性说明:
id属性:当前名称空间下的statement的唯一标识(必须属性);
parameterType:传入的参数类型,可以省略。
标签内部:具体的sql语句。insert语句
使用#{} 去替换一个变量。

怎么知道我们添加时是否添加成功怎么办?
UserMapper.java 接口中把返回类型直接写成Integer返回类型,其他的不用动

测试类中给一个integer 返回值就行了

添加成功后返回1

获取自增的id的值

可以拿到数据库的自增长的id值



测试:
User.getId();就可以直接拿到自增的id

测试结果:

Update

update 的几个属性说明:
id属性:当前名称空间下的statement的唯一标识(必须属性);
parameterType:传入的参数类型,可以省略。
标签内部:具体的sql语句。
使用#{} 去替换一个变量。

补充:

delete

delete 的几个属性说明:
id属性:当前名称空间下的statement的唯一标识(必须属性);
parameterType:传入的参数类型,可以省略。
标签内部:具体的sql语句。
使用#{} 去替换一个变量。

#{ 只是表示占位可以随便写 } 相当于 ?

${}的用法----传入参数的。接受参数。

#{} ?只能出现where中 ,当作一个变量 ,如要sql语句中要在实体对象中取出数据 ,那么where 后的#{}不能随便写
数据:是进行字符串拼接。如果使用{} 数据:是进行字符串拼接。 如果使用数据:是进行字符串拼接。如果使用{} 去取出参数信息,则需要在方法的参数列表上加上一个注释@param 表示参数的名字
#{} 只是表示占位,与参数的名字无关。如果用#{}去传入下例中的一个表名的话,是传不进去的

sql语句动态生成的时候,使用${};
sql语句中某个参数进行占位的时候#{}

mapper.xml中的内容:
新写一个接口的方法


mapper接口的内容:


测试:

parameterType传入参数-了解

定义传入参数的类型:

如果没有指定参数名,使用{} 没有指定参数名 ,使用没有指定参数名,使用{value} 表示传递过来的参数。
如果接口中书写的@Param(“TableName”) 就输入 ${TableName}

可以在方法的参数列表列表上 @param(“参数名”)

1、如果使用$去传递参数的时候,使用@Param 把参数指定一个名字
2、如果传入多个参数的时候,使用@Param,一定需要使用为每一个参数都去指定名字

parameterType传入多个参数

如果接口代码这样书写:
mapper.xml
传递多个参数的时候出现如下错误:

对于传入多个参数的时候,#{} 需要使用参数名的方式去获取数据。
java代码:

解决方案1 不推存使用:
在mapper.xml中使用 0,1这样的序号去,0表示第一个参数,1表示第二个参数。(从0开始数)



或者 用param1 param2 这个时就是从1开始:

解决方案2:
在java代码中加入param注解
测试

通过@param(“ 数据名”) 取出 # { 数据名 }


mapper.xml

接口:

面试题:#{}与${}的区别

${} statement对象
#{} Preparedstatement对象

${} 方式:


1、KaTeX parse error: Expected 'EOF', got '#' at position 7: 字符串拼接,#̲ 参数站位相当于jdbc中的?…不能够防止sql注入,#可以防止sql注入的
3、KaTeX parse error: Expected 'EOF', got '#' at position 17: …以替换sql语句任何一个内容,#̲只能替换参数 4、如果操作字符串,需要在sql中使用单引号。 #不需要(不需要判断数据类型,会自动转换)($要考虑参类型 ,#不用考虑参数类型)

简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * from table where id= ? 然而${} 作为字符串拼接来用,则是不能防止SQL注入打印出来的语句 select * from table where id=2 实实在在的参数 (sql注入:通过字符串拼接达到串改sql语句的目地)

8.5.1: $不能够防止sql注入,#可以防止sql注入的

以下案例演示的要判断数据类型

案例:根据姓名进行模糊查询

定义一个接口的方法


使用#

测试:


使用 $

接口定义方法

mapper定义

测试:

结果

【补充】

什么时候使用 $ ,

$可以代替所有#
如果传入的数据,不是sql中的字段的时候,就不能够使用#.

通常使用#。
选择获取参数的时候,首要选择的# 的方式(1、可以防止sql注入,2、可以不用考虑数据类型,简化书写,3、sql是参数的话的sql,预编译的sql,速度会块一些)
当#用不了的时候,去选择例如,sql需要改变是表名的情况,就可使用例如 ,sql需要改变是表名的情况,就可使用例如,sql需要改变是表名的情况,就可使用的方式。

总结:能用# 就不选择$

ResultMap


resultMap的自动映射

sql片段

作用:把重复的sql语句抽出来来放到sql标签中,然后通来引入

用法1

在一个mapper.xml 中使用 去定义sql片段,然后在需要的位置使用 引入


用法2
将所有的公用的SQL片段集中定义到一个Mapper.xml文件中,其他Mapper.xml文件如需引入mybatis-config.xml,通过命名空间.id即可。

sqlMapper.xml

在全局的mybatis-config.xml里面引入sqlMapper.xml

引入公共的sql.xml

9.整理

10.动态sql

if
进行判断。

需求1:查询男性用户,如果输入了姓名,进行模糊查找,如果不输入就按男性用户来查询。

定义接口

编写mapper和测试类

使用# {}的方式

1:使用的方式进行取出数据,要求在sql语句中‘{}的方式进行取出数据,要求在sql语句中 ‘%的方式进行取出数据,要求在sql语句中‘{}%’
2: 使用#{} 去取出数据,要求在传递参数的时候,就把% 进行拼接到参数上。%张%

choose,when,otherwise

choose,when,otherwise 相当于java中的 if, else if的逻辑

查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找。

定义接口

编写mapper.xml

如果其中的一个when 成立,则后的都不执行,如果所有when的都不成立,那么就执行otherwise
也就是谁在前面谁优先

测试

where 和set

作用:完成WHERE和SET关键字,并且处理SQL语句的中语法错误。
Select * from t_user where …
Update from t_user set name = …

练习:查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询。

定义接口

编写mapper.xml

Where标签 代替了 where这个关键字 , 并且会把多余的and去掉

测试


结果:把多余的and 去掉

Set 和 where的用户类似(自已测试)

set的使用

Set标签 相当于 sql中 set 关键字
需求:如果名字信息不是null,则修改名字, 如果age信息不是null,同时也修改age

会自动去掉错的 ,(逗号)

foreach

练习:按照多个id查询用户信息
Select * from t_user where id in(1,2,3)

定义接口

编写mapper.xml

Collection:要遍历的集合, item:接受遍历集合的值in( 1,2,3)

测试

Trim

trim介绍

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某写后缀,与之对应的属性是prefix和suffix;
可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOver

案例1

select * from user <trim prefix="WHERE" prefixOverrides="AND |OR"><if test="name != null and name.length()>0"> AND name=#{name}</if><if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>

假如说name和gender的值都不为null的话,打印的SQL为:
select * from user where name = ‘xx’ and gender = ‘xx’

where后不存在and,这是因为prefixOverrides="AND |OR"代表去掉第一个and或者是or。

案例2

update user<trim prefix="set" suffixOverrides="," suffix=" where id = #{id} "><if test="name != null and name.length()>0"> name=#{name} , </if><if test="gender != null and gender.length()>0"> gender=#{gender} ,  </if>
</trim>

假如说name和gender的值都不为null的话,打印的SQL为:
update user set name=‘xx’ , gender=‘xx’ where id=‘x’

11.缓存

一级缓存

在mybatis中,一级缓存默认是开启的,并且一直无法关闭(我们没法去管理一级缓存)

测试一级缓存

1、测试代码


2、日志输出

一级缓存满足条件:
1、同一个session中
2、相同的SQL和参数

使用sqlsession.clearCache()强制查询不缓存。

2、日志输出:

执行update,delete,insert 语句的时候,清空缓存 刷新缓存

执行update,delete,insert 语句的时候 都会清空缓存 然后刷新


二级缓存

mybatis 的二级缓存的作用域是一个mapper的namespace ,同一个namespace中查询sql可以从缓存中命中。
二级缓存是跨session

开启二级缓存

需要在mapper.xml 中加入如下:

测试二级缓存

java代码:

跨session来测试


需要把这个对象进行序列化

日志输出:
因为开启了二级缓存,第二次会去二级缓存中去命中,所有不会再发送sql语句

关闭二级缓存



在全局的mybatis-config.xml 中去关闭二级缓存


【扩展知识】

12.高级查询

案例说明


需求

一对一查询

查询订单,并且查询出下单人的信息

sql语句分析:
我们以定单为主,不管它有没有对应上这用户都要把订单查询出来

SELECT*FROMtb_orderLEFT JOIN tb_user ON tb_order.user_id = tb_user.idwhere tb_order.order_number = “20140921001”

一对一查询实现1(了解)


思考:查询订单,并且查询出下单人的信息同要把两个信息放在一块去

核心思想:扩展Order对象,来映射结果集。(把两个信息放到一块去)
第三个实体类,即用户信息也有订单信息
OrderUser.java

接口定义:
OrderMapper 返回第三个实体类


OrderMapper.xml中的定义

 <!-- 查询订单,并且查询出下单人的信息 --><select id="queryOrderUserByNumber" resultType="OrderUser">SELECT*FROMtb_orderLEFT JOIN tb_user ON tb_order.user_id = tb_user.idwhere tb_order.order_number = #{orderNumber}</select>

测试类

一对一查询实现2

核心思想:面向对象的思想,在Order对象中添加User对象。 用这个

接口方法: 返回的对象是Order

使用resultType不能完成自动映射,所以需要手动完成结果集的映射,需要使用resultMap实现。
其中user里面的id 和order里面的id 一样。哪个id是属于谁了

测试


测试结果:

一对多查询

一对多查询:查询订单,查询出下单人信息并且查询出订单详情。
一个定单可以有多个定单详情

sql:

select *,o.id as order_id,u.id as user_id,d.id as detail_id from tb_order as oLEFT JOIN tb_user as u on o.user_id = u.id LEFT JOIN tb_orderdetail as d on d.order_id = o.idwhere o.order_number = '20140921003';

定义接口
接口定义:

Order类:
提供getter,setter 方法

编写mapper


测试用例
用debug测试

多对多查询

定单和商品表 是多对多的对应关系
多对多查询:查询订单,查询出下单人信息并且查询出订单详情中的商品数据。

Sql分析

  SELECT*,o.id as order_id,u.id as user_id,d.id as detail_idFROMtb_order as o LEFT JOIN tb_user as u ON o.user_id = u.idleft join tb_orderdetail as d on  d.id = o.idleft join tb_item as i on i.id = d.item_idwhere o.order_number = #{OrderNumber};

定义接口
java对象的实现:


接口:
返回order对象,里面包含了用户,订单详情,商品

编写mapper.xml
这里面就不用给itema_id起别名,因为在订单详情表中的名字就是item_id

编写测试用例

resultMap的继承

高级查询整理

resutlType无法帮助我们自动的去完成映射,所以只有使用resultMap手动的进行映射
type 结果集对应的数据类型 id 唯一标识,被引用的时候,进行指定

<!—定义pojo中的单个对象的 property 定义对象的属性名, javaType 属性的类型,

<!— 如果属性是集合使用collection ,javaType 集合的类型,ofType 表示集中的存储的元素类型

13.分页插件

实现通用分页组件

Mybatis的plugin实现原理

使用PageHelper实现分页

导入依赖

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>3.7.5</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>0.9.1</version></dependency>

配置插件

这个拦截器插件放在配置环境的上面

在执行查询时设置分页参数

可以通过Pageinfo获取分页的信息
Pageinfo.getpages :总页数

14.mybatis和spring整合

导入依赖


共22个jar包

配置spring文件

1、创建spring的配置文件applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

配置资源文件替换器
applicationContext.xml

<!-- 使用spring自带的占位符替换功能 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><!-- 配置资源文件 --><property name="locations"><list><value>classpath:jdbc.properties</value></list></property></bean>

jdbc.properties

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springdata
username=root
password=root

配置连接池:
applicationContext.xml

<!-- 配置连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><property name="driverClass" value="${c3p0.driverClass}"></property><property name="jdbcUrl" value="${c3p0.url}"></property><property name="user" value="${c3p0.user}"></property><property name="password" value="${c3p0.password}"></property></bean>

配置SqlSessionFactory

<!-- 配置SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><!--引入mybatis的总配置  --><property name="configLocation" value="classpath:mybatis-config.xml"></property></bean>

配置mapper

<!-- 配置mapper --><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><!-- 配置mapper接口  (这种方式太麻烦)--><property name="mapperInterface" value="cn.yanqi.mybatis.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean>

使用1

配置mapper接口扫描器

<!-- 配置mybatis mapper接口扫描器 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 如果配置多个mapper的路径,可以使用,多个包使用逗号分割即可:                  value="cn.yanqi.mybatis.mapper,cn.yanqi.mybatis.mapper" --><property name="basePackage" value="cn.yanqi.mybatis.mapper" /></bean>

在Spring配置文件中指定别名包

Mapper.xml和java代码分离

全部配置

测试整合是否通过:

mapper整合servcie

servcie方法:

测试:

mybatis文档笔记相关推荐

  1. Vue官网2文档笔记

    文章目录 $event $on Class 与 Style 绑定 对象语法 列表渲染 v-for 中使用对象 事件处理 事件修饰符 插槽 具名插槽 解构插槽 prop 动态组件&异步组件 访问 ...

  2. NE40E华为产品文档-----笔记(2022.9.28)

    ** NE40E华为产品文档-----笔记(2022.9.28) ** P34开始 全连接full Mesh 中文解释:全网状 英文来历:Full Mesh表示网络的一种连接形式,即所有结点之间都直接 ...

  3. HOOMD Blue 文档笔记

    HOOMD Blue文档笔记 基于hoomd 1.0.2 userdoc http://codeblue.umich.edu/hoomd-blue/doc/index.html 3. 快速开始 例程: ...

  4. 这几款文档笔记工具,你习惯用哪个?

    前言 俗话说的好:"好记性不如烂笔头",平时工作记录笔记的确是一个良好的习惯,做文档笔记可以在我们遗忘时进行回看,方便查找,代替人的大脑.有时程序写多了,很不愿意去强制记忆一些东西 ...

  5. 文档笔记----nodejs菜鸟教程

    <html><head><meta charset="utf-8"><title>文档笔记----nodejs菜鸟教程</ti ...

  6. 文档 笔记 我全都要

    不知道你在平时工作或学习中,会不会经常写文档.记笔记 ~~ 笔者建议大家试着多写写文档 多记记笔记.把自己工作学习中遇到的问题,解决的方法都记录下来,别人写的好的文章也可以保存一下.长期下来 你会发现 ...

  7. html5教学文档笔记,4.HTML 教程- (HTML5 基础)

    HTML 教程- (HTML5 基础) 1.HTML 标题 HTML 标题(Heading)是通过 - 标签来定义的. 2.HTML 段落 HTML 段落是通过标签 来定义的. 3.HTML 链接 H ...

  8. 华为技术官又出神作,鸿蒙操作系统完整文档笔记现已疯传

    操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,用户和计算机的接口,同时也是计算机硬件和其他软件的接口. 其能管理计算机系统的硬件.软件及数据资源, ...

  9. Apple Developer文档笔记(一)AppKit App Structure

    导语 这篇文章是方便自己学习理解苹果开发者的文档的笔记,希望能给有需要的同学一些帮助,因为自己翻译理解的内容, 必然存在一些不足,还望指出. Apple Developer (https://deve ...

最新文章

  1. [学习笔记]数字电路技术
  2. Leetcode 18. 四数之和 (每日一题 20211011)
  3. 1.11 多异常捕获
  4. C#中怎样获取System.Drawing.Color的所有颜色对象并存到数组中
  5. 无代码调整聚类热图分支顺序
  6. linux 每天_每天使用Linux的11种惊人方式
  7. Java c语言词法,c语言写的Java词法分析
  8. java面向对象笔试_Java面向对象笔试题.doc
  9. 学习日志---hbase学习(最大版本查询)
  10. 扩展欧几里得算法的讲解
  11. 【等保常见问题解答】等保测评机构能帮忙做等保整改吗?
  12. cocoscreator修改图标
  13. 计算机的奇迹英语作文,高中英语作文范文:奇迹
  14. Microsoft Store连不上网解决办法
  15. 机器学习中的数学——拟牛顿法(Quasi-Newton Methods)
  16. 复旦校长官宣:复旦大学即将推出“不升也能留”计划!
  17. 旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解
  18. free Code Camp Slasher Flick(截断数组)
  19. AudioPlayer-简易音频播放器
  20. Silverlight书籍推荐阅读排行榜

热门文章

  1. 上线数据导入的几个注意事项
  2. 通过销售订单领用到成本中心,FI替代实现不同成本中心记账科目不同
  3. Four ugliness
  4. ALV的SAP自带标准程序实例
  5. 买淘宝特价版,产业升级的证明
  6. php管理用户名和密码,管理员用户名/密码不适用于PHP
  7. pilt图像处理_详解python opencv、scikit-image和PIL图像处理库比较
  8. python语言做法_python学习笔记(十六)
  9. java 抛出异常 返回值_java通过抛异常来返回提示信息
  10. python 最小二乘回归 高斯核_最经典的回归模型参数估计算法—最小二乘