目录
namespace:命名空间 必须绑定一个对应Mapper接口
使用全限定名: com.yuqu.Dao.UserMapper
id:对应上面的Mapper接口下面的某一方法名
resultType:表示返回结果类型 如:com.yuqu.pojo.User
parameterType:参数类型,基本数据类型通常忽略不写
CRUD增删改查
增删改切记提交事务:sqlSession.commit();
在确保已经配置好了mybatis-config.xml核心配置文件之后,我们每次需要操作sql时,就只需要操作接口UserMapper和UserMapper.xml配置文件即可
示例代码
UserMapper.xml
<mapper namespace=\"com.yuqu.dao.UserMapper\"> <select id=\"getUserList\" resultType=\"com.yuqu.pojo.User\"> select * from testmybatis.tb_user; </select> <select id=\"getUserById\" parameterType=\"int\" resultType=\"com.yuqu.pojo.User\"> select * from testmybatis.tb_user where id = #{id}; </select> <insert id=\"insertUser\" parameterType=\"com.yuqu.pojo.User\"> insert into testmybatis.tb_user (id,username,password,gender,addr) values(#{id},#{username},#{password},#{gender},#{addr}); </insert> <update id=\"updateUser\" parameterType=\"com.yuqu.pojo.User\"> update testmybatis.tb_user set username=#{username},password=#{password},gender=#{gender},addr=#{addr} where id = #{id}; </update> <delete id=\"deleteUser\" parameterType=\"int\"> delete from testmybatis.tb_user where id = #{id}; </delete> </mapper>
Test代码(仅以添加为例)
@Test public void testInsertUser(){ // 获取SqlSession SqlSession sqlSession = MyBatisUtils.getSqlSession(); // 执行sql UserMapper mapper = sqlSession.getMapper(UserMapper.class); int res = mapper.insertUser(new User(4, \"赵六\", \"1234\", \'妖\', \"郑州\")); if (res > 0){ System.out.println(\"插入成功!\"); // 增删改必须提交事务 sqlSession.commit(); } }
Map传参
上述UserMapper.xml所示,如果参数过多时,当我们进行添加操作或者修改操作就会非常麻烦。所以,可以优化采用Map来进行可选参数。以查询用户selectUser为例:
// UserMapper接口 // 查询用户 Map入参 简单实现模糊查询 int selectUser2(Map<String,Object> map); // UserMapper.xml <select id=\"selectUser2\" parameterType=\"map\" resultType=\"com.yuqu.pojo.User\"> select * from testmybatis.tb_user where username = #{helloName}; </select> // @Test @Test public void testSelectUser2(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<String, Object>(); map.put(\"helloName\",\"顺子\"); User user = mapper.selectUser2(map); System.out.println(user); sqlSession.close(); }
map传递参数,可以直接在sql中获取key,实现定制化参数
对象传递参数,直接在sql中取出sql的对象属性。但要保证字段名相同
基本数据类型时直接在sql中获取
模糊查询
// UserMapper // 模糊查询用户 List<User> getUserLikeList(String value); // UserMapper.xml <select id=\"getUserLikeList\" resultType=\"com.yuqu.pojo.User\"> select * from testmybatis.tb_user where username like #{value}; </select>
还有一种方式就是直接把sql固定写死,获取用户输入的一个稳定的值
select * from testmybatis.tb_user where username like \"%\"#{value}\"%\";
MyBatis配置解析
核心配置文件mybatis-config.xml
参考mybatis官网给出的配置信息:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
环境变量(Environments)
mybatis可以配置多种环境,但每个sqlSessionFactory智能选择一个环境
一个数据库对应一个SqlSessionFactory
我们可以在environments
元素下配置多个环境environment
,每个环境都需要设置单独的id,当我们需要用到哪一个的时候就需要将default设置为哪一个环境的id
<environments default=\"development\"><environments>
environments下包含
事务管理器transactionManger
<transactionManager type=\"JDBC\"> <property name=\"skipSetAutoCommitOnClose\" value=\"true\"/> </transactionManager>
事务管理器不仅有JDBC一种,还有一种 MANAGED
<transactionManager type=\"MANAGED\"> <property name=\"closeConnection\" value=\"false\"/> </transactionManager>
MyBatis官网提示: 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为Spring 模块会使用自带的管理器来覆盖前面的配置
数据源DataSource
之前学过的比如dbcp、c3p0、druid等等。用于连接数据库
mybatis内置了三种数据源:type="[UNPOOLED|POOLED|JND]"
UNPOOLED:表示无池连接,用完即销毁
POOLED:有池连接,用完后回收等待下次使用。(默认情况使用)
JND:表示正常连接
属性(Properties)
属性可以通过外部文件配置,也可以在Properties的子元素当中配置,在Properties子元素配置如下示例:
<environments default=\"development\"> <environment id=\"development\"> <transactionManager type=\"JDBC\"/> <dataSource type=\"POOLED\"> <property name=\"driver\" value=\"com.mysql.jdbc.Driver\"/> <property name=\"url\" value=\"jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC\"/> <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"123456\"/> </dataSource> </environment> </environments>
也可以通过典型的Java属性文件进行配置,比如db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&;useUnicode=true&;characterEncoding=UTF-8&;serverTimezone=UTC
username=root
password=123456
最后价格文件用properties标签引入到mybatis-config.xml中,环境则更改为初始形式
<!-- 引入外部资源 --> <properties resource=\"db.properties\" /> <environments default=\"development\"> <environment id=\"development\"> <transactionManager type=\"JDBC\"/> <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>
通过官网可以知道,我们也可以将db.properties中的配置信息只写一半,另一半在引入的同时用双标签闭合,在其中用properties的子标签property重新引入即可
<properties resource=\"db.properties\" > <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"123456\"/> </properties>
如果同时存在于外部文件和property中,优先使用外部文件的配置信息
类型别名(typeAliases)
typeAliases用于简化全限定名的书写,仅限于在xml中配置
指定全限定类名别名:
<typeAliases> <typeAlias type=\"com.yuqu.pojo.User\" alias=\"user\" /> </typeAliases>
type代表全限定名,将其映射为一个简化名称 user。如上所示在需要用到com.yuqu.pojo.User的地方就可以替换成user
指定包名配置
<typeAliases> <package name=\"com.yuqu.pojo\"/> </typeAliases>
经此配置后,mybatis会自动查找在com.yuqu.pojo下的所需Java Bean。
在没有对实体类添加注解用法:默认使用Bean的首字母小写的非限定类名来作为它的别名
添加注解的用法:
@Alias(\"hello\") public class User { //... }
接下来就可以在任何要用com.yuqu.pojo.User的地方使用hello代替
建议在实体类较少的情况下使用第一种指定全限定类名的别名
实体类较多时可以使用指定包名配置
其他的Java类型内建的别名可以参考MyBatis官网
映射器(mappers)
在定义sql映射语句之前,首先我们要告诉mybatis去哪里获取这些语句。这个时候就需要用到映射器mappers,mybatis根据映射的路径去找到对应的文件或者接口再去执行sql语句
映射器使用一:使用相对于类路径的资源引用(建议使用)
<mappers> <mapper resource=\"org/mybatis/builder/PostMapper.xml\"/> </mappers> // 如果将Mapper文件直接放在resource下就可以改成 <mappers> <mapper resource=\"PostMapper.xml\"/> </mappers>
映射器使用二:使用class文件的完全限定类名
<mappers> <mapper class=\"org.mybatis.builder.PostMapper\" /> </mappers>
- 接口和它的Mapper配置文件必须在同一包下!
- 接口和它的Mapper配置文件必须同名!
映射器使用使用三:将包内的映射器接口全部注册为映射器
<mappers> <package name=\"org.mybatis.builder\"/> </mappers>
- 接口和它的Mapper配置文件必须在同一包下!
- 接口和它的Mapper配置文件必须同名!
生命周期和作用域
错误的使用生命周期和作用域会导致非常严重的并发问题
SqlSessionFactoryBuilder:
- 创建SqlSessionFactory工厂使用,一旦创建了SqlSessionFactory就不再需要使用它
- 最佳作用域是方法域(局部方法变量)
SqlSessionFactory:
- SqlSessionFactory用于生产SqlSession实例
- 一旦创建就应该一直存在于程序的运行期间,不要丢弃或尝试重新创建另一个SqlSessionFactory
- 可以采用单例模式来保证唯一的SqlSessionFactory
- 最佳作用域是全局作用(应用作用域)
SqlSession:
- SqlSession用于执行已映射的sql指令
- 每个线程都有自己的SqlSession实例,因为它不是线程安全的不能被共享
- 最佳作用域是方法域或者请求域
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。