博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
接口 和xml 中的知识
阅读量:5119 次
发布时间:2019-06-13

本文共 6612 字,大约阅读时间需要 22 分钟。

三、MyBatis-全局配置文件	MyBatis 的配置文件包含了影响 MyBatis 行为甚深的 设置(settings)和属性(properties)信息。文档的 顶层结构如下:	configuration 配置	properties 属性	settings 设置	typeAliases 类型命名	typeHandlers 类型处理器	objectFactory 对象工厂	plugins 插件	environments 环境	environment 环境变量	transactionManager 事务管理器	dataSource 数据源	databaseIdProvider 数据库厂商标识	mappers 映射器  1.为全局配置文件绑定dtd约束:	 1)联网会自动绑定	 2)没网的时候【/org/apache/ibatis/builder/xml/mybatis-3-config.dtd】:解压mybatis 的jar包然后在eclipse中绑定	   2. properties属性	  
3.settings包含很多重要的设置项 setting:用来设置每一个设置 name:设置项名 value:设置项取值 举例:驼峰式命名
4.typeAliases 作用:A type alias is simply a shorter name for a Java type
虽然有这么多的别名可以使用:但是建议大家还是使用全类名,看SQL语句是怎么被封装为JAVA 对象的时候简单! 5.typeHandlers:类型处理器 类型处理器:负责如何将数据库的类型和java对象类型之间转换的工具类 6.environments
7.databaseIdProvider环境 MyBatis is able to execute different statements depending on your database vendor. The ? MyBatis 可以根据不同的数据库厂商执行不同的语句
Type: DB_VENDOR –使用MyBatis提供的VendorDatabaseIdProvider解析数据库 厂商标识。也可以实现DatabaseIdProvider接口来自定义。 Property-name:数据库厂商标识 Property-value:为标识起一个别名,方便SQL语句使用 在mybatis的全局配置文件配置了这个之后,我们只需要在sql映射文件中通过在执行语句的标签上加一个属性databaseId即可! 这样在执行不同数据库的时候,就会执行不同数据库的语句了!当然如上所示:当有指定 了databaseId属性的和没有指定databaseId属性的,都有的情况下那就按着有指定databaseId属性的sql语句执行!
8.mapper映射
9.最后就是全局配置文件中标签实际上是有顺序的! 四、MyBatis-映射文件 映射文件指导着MyBatis如何进行数据库增删改查, 有着非常重要的意义; ?cache –命名空间的二级缓存配置 ?cache-ref – 其他命名空间缓存配置的引用。 ?resultMap – 自定义结果集映射 ?parameterMap – 已废弃!老式风格的参数映射 ?sql –抽取可重用语句块。 ?insert – 映射插入语句 ?update – 映射更新语句 ?delete – 映射删除语句 ?select – 映射查询语句 1.先看增删改查标签 接口类: public interface EmployeeMapper { public Employee getEmployeeById(Integer id); public void addEmp(Employee employee); public void updateEmp(Employee employee); public void deleteEmp(Integer id); } 在其对应的sql映射文件中:
insert into tbl_employee(last_name,email,gender) values(#{lastName},#{gender},#{email})
update tbl_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id = #{id}
delete from tbl_employee where id = #{id}
编写测试单元: /** * 测试增删改 * 1.mybatis允许增删改直接定义以下类型返回值 * Integer、Long、Boolean * 增删改返回的是影响的多少行,只要影响0行以上就会返回true,0行以下就会返回false! * 直接在接口上写这些包装类或者基本类型就好, * 没必要在sql映射文件中写resultType,而且在sql映射文件中也没有resultType标签! * 2.我们需要手动提交数据 *sqlSessionFactory.openSession();===>手动提交 *sqlSessionFactory.openSession(true);===>自动提价 */ @Test public void test02() { String resource = "mytabis-config.xml"; InputStream inputStream; SqlSession openSession = null; try { inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //1.获取到的sqlSession不会自动提交数据,需要手动提交 openSession = sqlSessionFactory.openSession(); EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); mapper.addEmp(new Employee(null,"hah","email","1")); //手动提交 openSession.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //关闭会话 openSession.close(); } } 2.获取自增主键值
insert into tbl_employee(last_name,email,gender) values(#{lastName},#{gender},#{email})
五:参数处理 单个参数:mybatis不会做特殊处理 #{参数名}: 取出参数值 多个参数:mybatis会做特殊处理 多个参数会被封装成一个map, key:param1...paramN,或者参数的索引也可以 value:传入的参数值 #{}就是从map中获取指定的key的值 异常: org.apache.ibatis.binding.BingdingException: Parameter 'id' not found. Available parameters are [1,0,param1,param2] 操作: 方法:public Employee getEmployeeAndLastName(Integer id,String lastName); 取值:#{id},#{lastName} 命名参数:明确指定封装参数时map的key:@param("id") 多个参数会被封装成一个map, key:使用@Param注解指定的值 value:参数值 #{指定的key}取出对应的参数值 POJO: 如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo; #{属性名}:取出传入的pojo的属性值 Map: 如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map #{key}:取出map中对应的值 List、Set #这里面的值也会被封装到map集合中: key:collection 值:对应的参数值 #{collection[0]}或#{list[0]} 六、参数值的获取 #{}:可以获取map中的值或者pojo对象属性的值 ${}: 可以获取map中的值获取pojo对象属性的值 select * from tbl_employee where id = ${id} and last_name = #{lastName} preparing:select * from tbl_employee where id = 2 and last_name = ? 区别: #{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement;防止sql注入 ${}:取出的值直接拼装在sql语句中,会有安全问题; 大多情况下,我们取参数的值都应该去使用#{}; 原生JDBC不支持占位符的地方我们就可以使用${}进行取值 比如分表、排序;按照年份分表拆分 select * from ${year}_salary where xxx;[表名不支持预编译] select * from tbl_employee order by ${f_name} ${order} :排序是不支持预编译的! select元素 ? Select元素来定义查询操作。 ? Id:唯一标识符。 – 用来引用这条语句,需要和接口的方法名一致 ?parameterType:参数类型。 –可以不传,MyBatis会根据TypeHandler自动推断 ?resultType:返回值类型。 – 别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能和resultMap同时使用 1.返回类型为一个List eg:public List
getEmpsByLastNameLike(String lastName);
select * from tbl_employee where lastName like #{lastName} 2.返回记录为一个Map
public Map
getEmpByIdReturnMap(Integer id);
3.返回为一个ResultMap:
public Employee getEmployeById(Integer id);
<!--只需要在映射的地方映射一下就可以了 --》

  

转载于:https://www.cnblogs.com/zhaosong-0102/p/7475249.html

你可能感兴趣的文章
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>