03.Mybatis优化

对动态代理方式的代码进行进一步优化:

1.将conf.xml文件中对数据库的配置信息以db.properties的形式抽离出来

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/person?serverTimezone=UTC
username=root
password=root
<configuration> <properties resource="db.properties" />      //把抽离出去的properties文件加载进来<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/>   //用类似el表达式的方式进行引用<property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="com/offcn/mapper/personMapper.xml"/></mappers>
</configuration>

2.配置全局参数:(作为入门一般不对全局参数进行设置)

<configuration><properties resource="db.properties" /><!-- 设置全局参数<settings><setting name="cacheEnabled" value="false" /><setting name="lazyLoadingEnabled" value="false" /></settings> 

所有的全局参数:

设置参数描述有效值默认值
cacheEnabled该配置影响的所有映射器中配置的缓存的全局开关。true | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。true | falsefalse
aggressiveLazyLoading当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods).true | falsefalse (true in ≤3.4.1)
multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动)。true | falsetrue
useColumnLabel使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。true | falsetrue
useGeneratedKeys允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehavior指定发现自动映射目标未知列(或者未知属性类型)的行为。
  • NONE: 不做任何反应
  • WARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为 WARN)
  • FAILING: 映射失败 (抛出 SqlSessionException)
NONE, WARNING, FAILINGNONE
defaultExecutorType配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。SIMPLE REUSE BATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数。任意正整数Not Set (null)
defaultFetchSize为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。任意正整数Not Set (null)
safeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。true | falseFalse
safeResultHandlerEnabled允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false。true | falseTrue
mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。true | falseFalse
localCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。SESSION | STATEMENTSESSION
jdbcTypeForNull当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。JdbcType enumeration. Most common are: NULL, VARCHAR and OTHEROTHER
lazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载。A method name list separated by commasequals,clone,hashCode,toString
defaultScriptingLanguage指定动态 SQL 生成的默认语言。A type alias or fully qualified class name.org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandlerSpecifies the TypeHandler used by default for Enum. (Since: 3.4.5)A type alias or fully qualified class name.org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。true | falsefalse
returnInstanceForEmptyRow当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始)true | falsefalse
logPrefix指定 MyBatis 增加到日志名称的前缀。Any StringNot set
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGINGNot set
proxyFactory指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。CGLIB | JAVASSISTJAVASSIST (MyBatis 3.3 or above)
vfsImpl指定VFS的实现自定义VFS的实现的类全限定名,以逗号分隔。Not set
useActualParamName允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始)true | falsetrue
configurationFactory指定一个提供Configuration实例的类. 这个被返回的Configuration实例是用来加载被反序列化对象的懒加载属性值. 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始)类型别名或者全类名.Not set

3.多参数的几种处理方式:

接口:

1    Student queryStudentByNameAndAge(String name,int age);
2     Student queryStudentWithHashMap(Map<String, Object> map);
3     Student queryStudentWithParam(@Param("sname") String sname,@Param("age") int age);
4     Student queryStudentWithObject(Student student);

映射文件:

 1 <!-- sql片段 -->
 2     <sql id="queryStudent">
 3         select sid,sname,sex,age from student
 4     </sql>
 5     <!-- 多参数 -->
 6     <!--1. 通过下标的方式进行传参 -->
 7   <select id="queryStudentByNameAndAge" resultType="student">
 8       <include refid="queryStudent" /> where sname = #{0} and age = #{1}
 9   </select>
10     <!--   2.通过HashMap进行传参 -->
11   <select id="queryStudentWithHashMap" resultType="student">
12      <include refid="queryStudent" /> where sname = #{sname} and age = #{age}
13  </select>
14  <!--   3.通过注解的方式进行传参 ,同时注解也能对对象进行注解,取值的时候用别名点属性名-->
15   <select id="queryStudentWithParam" resultType="student">
16      <include refid="queryStudent" /> where sname = #{sname} and age = #{age}
17  </select>
18  
19  <!--   4.通过对象的方式进行传参 -->
20   <select id="queryStudentWithObject" parameterType="student" resultType="student">
21      <include refid="queryStudent" /> where sname = #{sname} and age = #{age}
22  </select>

测试类:

 1 public static void queryStudentByNameAndAge() throws IOException {
 2         //读取配置文件
 3         Reader reader = Resources.getResourceAsReader("conf.xml");
 4         //创建sqlSessionFactory
 5         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 6         //创建session
 7         SqlSession session = sessionFactory.openSession();
 8         //定位映射文件
 9         studentMapper studentMapper = session.getMapper(studentMapper.class);
10         //定位sql语句并执行sql语句
11         Student student = studentMapper.queryStudentByNameAndAge("馒头",22);
12         System.out.println(student);
13         //提交事务
14         session.commit();
15         session.close();
16     }
17     public static void queryStudentWithHashMap() throws IOException {
18         //读取配置文件
19         Reader reader = Resources.getResourceAsReader("conf.xml");
20         //创建sqlSessionFactory
21         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
22         //创建session
23         SqlSession session = sessionFactory.openSession();
24         //定位映射文件
25         studentMapper studentMapper = session.getMapper(studentMapper.class);
26         //定位sql语句并执行sql语句
27         Map<String, Object> map = new HashMap<String, Object>();
28         map.put("sname", "馒头");
29         map.put("age", 23);
30         Student student = studentMapper.queryStudentWithHashMap(map);
31         System.out.println(student);
32         //提交事务
33         session.commit();
34         session.close();
35     }
36     public static void queryStudentWithParam() throws IOException {
37         //读取配置文件
38         Reader reader = Resources.getResourceAsReader("conf.xml");
39         //创建sqlSessionFactory
40         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
41         //创建session
42         SqlSession session = sessionFactory.openSession();
43         //定位映射文件
44         studentMapper studentMapper = session.getMapper(studentMapper.class);
45         //定位sql语句并执行sql语句
46         Student student = studentMapper.queryStudentWithParam("馒头",22);
47         System.out.println(student);
48         //提交事务
49         session.commit();
50         session.close();
51     }
52     public static void queryStudentWithObject() throws IOException {
53         //读取配置文件
54         Reader reader = Resources.getResourceAsReader("conf.xml");
55         //创建sqlSessionFactory
56         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
57         //创建session
58         SqlSession session = sessionFactory.openSession();
59         //定位映射文件
60         studentMapper studentMapper = session.getMapper(studentMapper.class);
61         //定位sql语句并执行sql语句
62         Student stu = new Student();
63         stu.setSname("馒头");
64         stu.setAge(22);
65         Student student = studentMapper.queryStudentWithObject(stu);
66         System.out.println(student);
67         //提交事务
68         session.commit();
69         session.close();
70     }

 

转载于:https://www.cnblogs.com/man-tou/p/11335048.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​从ASML年报看半导体产业的未来

来源&#xff1a;半导体行业观察在前几天的文章《光刻机巨头ASML的十年变迁》中&#xff0c;笔者梳理了ASML近10年来的财报数据&#xff0c;介绍了其EUV/DUV光刻机出货量、年销售额、研发投入以及各地区的销售情况等。近日&#xff0c;ASML又公布了2021年年报&#xff0c;我们一…

04.MyBatis别名的设置和类型转换器

别名的设置:(别名不区分大小写): 设置单个别名: <configuration><properties resource"db.properties" /><typeAliases><!-- 设置单个别名 --><typeAlias type"com.offcn.entity.Person" alias"person"/><type…

史上首次,强化学习算法控制核聚变登上Nature:DeepMind让人造太阳向前一大步...

来源&#xff1a;机器之心过去三年&#xff0c;DeepMind 和瑞士洛桑联邦理工学院 EPFL 一直在进行一个神秘的项目&#xff1a;用强化学习控制核聚变反应堆内过热的等离子体&#xff0c;如今它已宣告成功。DeepMind研究科学家David Pfau在论文发表后感叹道&#xff1a;「为了分享…

Memcached 使用 及.NET客户端调用

memcached安装: 1 解压缩文件到c:\memcached 2 命令行输入 c:\memcached\memcached.exe -d install 3 命令行输入 c:\memcached\memcached.exe -d start &#xff0c;该命令启动 Memcached &#xff0c;默认监听端口为 11211 注&#xff1a; 如果出现如下错误 “ failed to in…

机器人流程自动化技术的新发展

来源&#xff1a;学习时报作者&#xff1a;李蕾蓬勃发展的数字经济&#xff0c;是全球新一轮科技进步的产物&#xff0c;直接受到新兴数字技术与智能技术的驱动。机器人流程自动化技术&#xff08;简称“RPA”&#xff09;&#xff0c;是近些年获得快速发展与广泛应用的重要智能…

运算符 优先级 结合性

&#xff23;语言的运算符可分为以下几类&#xff1a; 1. 算术运算符:用于各类数值运算。包括加()、减(-)、乘(*)、除(/)、求余(或称模运算&#xff0c;%)、自增()、自减(--)共七种。 2. 关系运算符:用于比较运算。包括大于(>)、小于(<)、等于()、 大于等于(&g…

05.MyBtais两种取值符号以及输入参数和输出参数

输入参数&#xff1a;parameterType 两种取值符号的异同 1.类型为简单类型(8个基本类型string) 不同点: a.#{任意值}&#xff0c;${value} 其中的标识符只能是value b. #{}自动给String类型加上单引号(‘’) (自动类型转换) ${} 原样输出&#xff0c;适合于动态排序 &#xff0…

论人工智能历史、现状与未来发展战略

来源&#xff1a;《学术前沿》作者&#xff1a;郭毅可人工智能问世60多年来&#xff0c;承载着人类对自己的智慧的无限自信。在这样的自信下&#xff0c;人工智能发展到了今天&#xff0c;人们在追求机器从事尽可能多的智力劳动的路上走得很快&#xff0c;也很远。今天人工智能…

PHP 开发者大会

PHPCON 2019 开发者大会(上海)2019.8.10-8-11 郭新华,和陈雷给我留下的影响很大 再看下天气,利奇马台风,都坐满了,来的都是真爱. Swoole 的韩天峰开始演讲,感觉是程序员标准的样子,哈哈哈 2345 的高旭 讲公司用swoole 的架构 鸟哥因为台风问题没来成,搞了个直播,哈哈哈,感觉很…

IEEE Fellow杨铮:打破「视觉」垄断,无线信号为 AI 开启「新感官」

来源&#xff1a;AI科技评论作者&#xff1a;陈彩娴编辑&#xff1a;岑峰2020年年初疫情刚开始时&#xff0c;清华大学的官方号曾祭出一篇题为《清华教师升级「十大神器」&#xff0c;上课力满格》的推文&#xff0c;讲述了软件学院某老师如何居家办公、探索出一套防止学生偷懒…

对于量子计算来说,99%的准确度足够吗?

UNIVERSITY OF NEW SOUTH WALES来源&#xff1a;IEEE电气电子工程师来自荷兰代尔夫特理工大学&#xff08;Delft University of Technology&#xff09;、日本理化学研究所&#xff08;Riken&#xff09;和悉尼新南威尔士大学&#xff08;UNSW&#xff09;的研究团队在硅中开发…

JavaScript每日学习日记(1)

8.11.2019 1. lastIndexOf() 方法从尾到头进行检索。 2. 有三种提取部分字符串的方法&#xff1a; 2.1 slice(start, end) 如果某个参数为负&#xff0c;则从字符串的结尾开始计数。如果省略第二个参数&#xff0c;则该方法将裁剪字符串的剩余部分。 2.2 substring(start, end…

人工智能将如何改变芯片设计

来源&#xff1a;ScienceAI编译&#xff1a;绿萝摩尔定律的终结正在逼近。工程师和设计师只能将晶体管小型化并尽可能多地封装到芯片中。因此&#xff0c;他们正在转向其他芯片设计方法&#xff0c;将 AI 等技术融入到设计过程中。例如&#xff0c;三星正在将人工智能添加到其内…

网络编程 总结

软件开发架构 c/s client/server b/s broswer/server ps:b/s本质上也是c/s架构 OSI七层协议 应用层 表示层 会话层 传输层 网络层 数据链路层 物理连接层 物理连接层 传输二进制的数据 数据链路层(以太网协议) 1.规定了二进制数据的分组依据 2.规定了每台计算机都必须有一块网…

计算机科学家证明,为什么更大的神经网络可以做得更好

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮我们的物种很大程度上归功于对生的拇指。但如果进化给了我们额外的拇指&#xff0c;事情可能不会有太大改善。每只手一个拇指就足够了。神经网络并非如此&#xff0c;这是执行类人任务的领先人工智能系统。随着他们变得更大&am…

解决安装IIS时提示找不到zClientm.exe文件的问题

今天在安装IIS出现找不到zClientm.exe文件&#xff0c;还以为是下载IIS有问题&#xff0c;头大了。以下是解决方案。在组件安装向导中顺着[附件和工具]--[游戏]一路点击下去,惊喜地发现里面有一栏[Internet游戏]&#xff0c;把勾去掉&#xff0c;重新安装IIS就OK。但是有网友提…

生命,到底是什么?

来源&#xff1a;腾讯研究院作者&#xff1a;Mark A. Bedua译者&#xff1a;宋词、范星辰令人着迷的生命地球表面布满了生命&#xff0c;而且通常很容易辨认。猫、胡萝卜、细菌都是活的&#xff0c;桥、肥皂泡、沙粒都是死的。但众所周知&#xff0c;生物学家们却没有关于生命的…

MyBatis中SQL语句相关内容

MyBatis模糊查询 使用 ${...} 代替 #{...} SELECT * FROM tableName WHERE name LIKE %${text}%; 在MyBatis中写SQL语句时不等于用 <> 代替 <> 多个条件中的模糊查询 SELECT * FROM 表名 WHERE (字段1 <> "" 字段2 <> "") and (字…

2022图机器学习必读的11大研究趋势和方向: 微分方程/子图表示/图谱理论/非对称/动态性/鲁棒性/通用性/强化学习/图量子等...

来源&#xff1a;机器学习研究组订阅作者&#xff1a;Michael Bronstein 牛津大学DeepMind人工智能教授、Twitter图机器学习负责人编译&#xff1a;熊宇轩一、要点概述几何在机器学习中变得越来越重要。微分几何和同源场为机器学习研究引入了新的思想&#xff0c;包括利用了对…

day31 线程

01 进程间通信 """ 队列:先进先出 堆栈:先进后出 """ from multiprocessing import Queue q Queue(5) # 括号内可以传参数 表示的是这个队列的最大存储数 # 往队列中添加数据 q.put(1) q.put(2) print(q.full()) # 判断队列是否满了 q.put(3)…