Mybatis需要注意的细节
mybatis第二篇
1.${}和#{}的区别
- 1.#在传参的时候,会自动拼接单引号;$不能拼接单引号;
2.$传参时,一般不支持jdbcType指定类型的写法;#则可以;如:
#{name,jdbcType=VARCHAR}
3.$一般用于在sql中拼接表名,结果排序,模糊查询等操作;其他正常参数传递一般使用
4.因为${}使用后不会自动拼接单引号,所以可能还会导致sql攻击
select * from user where username=${username} and password=${username}
当输入值为" ttt' or '22'='22' 时,sql就被替换为
select * from user where username='ttt' or '22'='22' and password='ttt' or '22'='22'
在影射文件中结果类型的处理
<resultMap type="cn.sz.gl.pojo.DeptPlus" id="deptinfo">
<result column="deptno" property="deptno"/>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
<!--第一种,通过association 标签实现连表查询
<association column="deptno" property="dept"
select="cn.sz.gl.dao.DeptDao.findById"></association>-->
<!--第二种 连表查询,多对一模式
<collection property="emplist">
<id column="empno" property="empno"/>
<result column="ename" property="ename"/>
<result column="job" property="job"/>
<result column="hiredate" property="hiredate"/>
<result column="sal" property="sal"/>
<result column="comm" property="comm"/>
</collection>
-->
<!-- 方案3 联表查询下,一对多-->
<collection property="emplist" column="deptno"
ofType="cn.sz.gl.pojo.Emp" javaType="java.util.List"
select="cn.sz.gl.pojo.Emp.findByDeptno"></collection>
</resultMap>
<!--根据部门编号查看部门所有员工 1对多-->
<select id="findByIdlist" resultMap="deptinfo" parameterType="java.lang.String">
select deptno, dname, loc from dept where deptno=#{deptno}
</select>
定义接口方法
/**
* 根据部门编号查看部门所有员工
* @param deptno Integer
* @return DeptPlus 部门和员工的组合
*/
public DeptPlus findByIdlist(Integer deptno);
测试
@Test
public void testFindByIdlist() {
SqlSession sqlsession
=MySqlSessionFactory.getMySqlSession();
//通过工厂调用getMapper获取接口实例
DeptDao dao = sqlsession.getMapper(DeptDao.class);
System.out.println(dao.findByIdlist(10));
MySqlSessionFactory.closeSqlSession();
}
2.在插入数据时获取主键
<!-- 增加 -->
<insert id="insert" parameterType="cn.sz.gl.pojo.Users" >
insert into users(id,name,password)
values(users_seq.nextval, #{name,jdbcType=VARCHAR},
#{password,jdbcType=VARCHAR})
</insert>
这里提供两种方案
在oracle中,因为自身使用序列自增策略
我们在insert语句中加入selectKey 这样就会把主键,映射到实体类的主键上
<insert id="insert" parameterType="cn.sz.gl.pojo.Users" >
<selectKey order="AFTER" keyProperty="empno" resultType=" java.lang.Integer">
select emp_seq.currval from daul
</selectKey>
insert into users(id,name,password)
values(users_seq.nextval, #{name,jdbcType=VARCHAR},
#{password,jdbcType=VARCHAR})
</insert>
对于mysql和mssql的主键自增策略
先设置启用主键自增策略,将属性useGeneratedKeys="true,指定返回到实体类的属性名,设置对应列名keyColumn="empno",后就会映射到实体类之中
<!-- 增加 -->
<insert id="insert" parameterType="cn.sz.gl.pojo.Emp" useGeneratedKeys="true" keyColumn="empno" keyProperty="empno" >
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(emp_seq.nextval, #{ename,jdbcType=VARCHAR}, #{job,jdbcType=VARCHAR}, #{mgr,jdbcType=NUMERIC}, #{hiredate,jdbcType=DATE}, #{sal,jdbcType=NUMERIC}, #{comm,jdbcType=NUMERIC}, #{deptno,jdbcType=NUMERIC})
</insert>
3.ThreadLocal本地线程的使用
现编写工具类MySqlSessionFactory.java
public class MySqlSessionFactory {
private static final String RESOURCE = "mybatis_config.xml";
private static SqlSessionFactoryBuilder builder = null;
private static SqlSessionFactory factory = null;
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
static{
try {
InputStream is = Resources.getResourceAsStream(RESOURCE);
builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
} catch (IOException e) {
System.out.println("加载配置文件.....");
}
}
public static SqlSession getMySqlSession() {
SqlSession sqlSession = threadLocal.get();
if(sqlSession==null) {
sqlSession = factory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession() {
SqlSession sqlSession = threadLocal.get();
if(sqlSession!=null) {
sqlSession.close();
}
threadLocal.set(null);
}
}
使用在service中
public class UsersServiceImpl implements UsersService {
private static SqlSession sqlsession
=MySqlSessionFactory.getMySqlSession();
private UsersDao dao = null;
/**
* 查询全部
* @return
*/
public List<Users> findAll(){
try {
dao=sqlsession.getMapper(UsersDao.class);
return dao.findAll();
} catch (Exception e) {
System.out.println("findAll'查询列表失败!");
}
return Collections.EMPTY_LIST;
}
}
测试
public class UsersServiceImplTest {
private UsersService service=null;
@Before
public void init() {
service=new UsersServiceImpl();
}
@Test
public void testFindAll() {
service.findAll().forEach(System.out::println);
}
}
Mybatis需要注意的细节的更多相关文章
- Mybatis学习的一些细节
一.mybatis 基本配置 最近几天一直在学习mybatis,看了一些源码,本文讲述mybatis的一些基本配置和基本的用法和注意到一些细节.个人时间和精力有限,本文属于流水账类型,不成体系,算是自 ...
- mybatis不可忽略的细节
自我总结,欢迎拍砖! 目的:在需要返回int,long等基础类型数据的情况下,尽量在mybatis的Mapper中用基础类型的包装类. 原因:当查询的字段为空值时,mybatis会返回null,用基础 ...
- mybatis使用注意的细节
1.mybatis对sql执行后会对结果进行封装,如果没有返回任何记录,只是封装后的对象没有值,而对象并不为空null: (这个问题疏忽坑了两次,在对返回数组结果进行判断的时候,我用的if(Array ...
- mybatis的一些小细节
Mybatis要解决的问题: 1. 将sql语句硬编码到java代码中,如果修改sql语句,需要修改java代码,重新编译.系统可维护性不高. 设想如何解决? 能否将sql单独配置在配置文件中. 2. ...
- IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis 自动部署的细节问题
一.加载pom依赖包 <!--spring-boot开发热部署--> <dependency> <groupId>org.springframework.boot& ...
- MyBatis中的特殊符号[20160713]
今天中午回到工位已经是12:20多了,没有时间睡觉了,本想着还能提前开始,结果看了点新闻之后,又是12:40了,所以新闻坚决不能看,执行力. 今天主要记录一下MyBatis中的特殊符号的问题,这个问题 ...
- 6、SpringBoot+Mybatis整合------参数传递
开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis/tree/7892801d804d2060774f3720f8 ...
- 图解Mybatis框架原理及使用
1.前言 努力学习完ssm框架之后,终于也成功的把三大框架的使用以及配置文件细节忘得一干二净.为了努力捡起来以及方便今后的复习,决定写一篇博客记录一下. 本博客的所有分析都是在持久层接口以及接口中的方 ...
- mybatis框架的第二天
一.mybatis的基础crud的操作 先在接口中,写对应的方法名称,返回类型,访问符. 之后在映射配置文件中,写具体的实现 二.mybati中crud的细节 1.模糊查询 这是接口中 这是xml中 ...
随机推荐
- 队列+BFS(附vector初试)
优先队列的使用: include<queue>//关联头文件 struct node{ int x,y; friend bool operator < (node d1,node d ...
- PowerMock学习(四)之Mock static的使用
我们编写代码的时候,总会写一些工具类,为了方便调用喜欢使用static关键字来修饰对应方法. 那么现在举例说明,还是准备两个接口,第一个是查询学生总数,第二个是新增学生两个接口,具体示例代码如下: p ...
- node读取excel文件生成JSON
当前的目录结构 excel的数据如下: node识别excel,先得安装 node-xlsx,用npm或yarn都可以 npm install node-xlsx 或 yarn add node- ...
- 安装eclipse血泪史
从大一到大三,屡次卸掉eclipse又屡次安装上,每次都要卡壳,所以这里开帖贴出自己的血泪史,以帮助大家 首先找一篇安装教程,网上有很多,这里不再赘述.举例 https://blog.csdn.net ...
- Redux第一节
安装脚手架 npm i -g create-react-app 创建一个Dom create-react-app demo01 安装 Ant Design npm i antd --save 安装re ...
- 从零开始入门 | Kubernetes 中的服务发现与负载均衡
作者 | 阿里巴巴技术专家 溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...
- 勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创) 大部分的勾股数的题目很多人都是用for来便利,然后判断是不是平方数什么什么的,这样做的时候要对变量类型和很多细节都是要掌握好的 ...
- 2019-11-20:xss学习笔记
xxe漏洞防御使用开发语言提供的禁用外部实体的方法phplibxml_disable_entity_loader(true); 卢兰奇对象模型,bom由于现代浏览器实现了js交互性方面的相同方法和属性 ...
- 全排列(STL)
输入一个整数n,输出1~n的全排列(是不是很水) 在此记录stl做法 #include<bits/stdc++.h> using namespace std; ]; int main(){ ...
- IDEA启动tomcat报java.net.SocketExceptionsocket closed
IDEA启动tomcat报java.net.SocketException:socket closed.如图所示 解决方法:打开任务管理器,检查有没有java.exe进程. 关闭了重新启动就好了 ...