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>

这里提供两种方案

  1. 在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>
  2. 对于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需要注意的细节的更多相关文章

  1. Mybatis学习的一些细节

    一.mybatis 基本配置 最近几天一直在学习mybatis,看了一些源码,本文讲述mybatis的一些基本配置和基本的用法和注意到一些细节.个人时间和精力有限,本文属于流水账类型,不成体系,算是自 ...

  2. mybatis不可忽略的细节

    自我总结,欢迎拍砖! 目的:在需要返回int,long等基础类型数据的情况下,尽量在mybatis的Mapper中用基础类型的包装类. 原因:当查询的字段为空值时,mybatis会返回null,用基础 ...

  3. mybatis使用注意的细节

    1.mybatis对sql执行后会对结果进行封装,如果没有返回任何记录,只是封装后的对象没有值,而对象并不为空null: (这个问题疏忽坑了两次,在对返回数组结果进行判断的时候,我用的if(Array ...

  4. mybatis的一些小细节

    Mybatis要解决的问题: 1. 将sql语句硬编码到java代码中,如果修改sql语句,需要修改java代码,重新编译.系统可维护性不高. 设想如何解决? 能否将sql单独配置在配置文件中. 2. ...

  5. IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis 自动部署的细节问题

    一.加载pom依赖包 <!--spring-boot开发热部署--> <dependency> <groupId>org.springframework.boot& ...

  6. MyBatis中的特殊符号[20160713]

    今天中午回到工位已经是12:20多了,没有时间睡觉了,本想着还能提前开始,结果看了点新闻之后,又是12:40了,所以新闻坚决不能看,执行力. 今天主要记录一下MyBatis中的特殊符号的问题,这个问题 ...

  7. 6、SpringBoot+Mybatis整合------参数传递

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis/tree/7892801d804d2060774f3720f8 ...

  8. 图解Mybatis框架原理及使用

    1.前言 努力学习完ssm框架之后,终于也成功的把三大框架的使用以及配置文件细节忘得一干二净.为了努力捡起来以及方便今后的复习,决定写一篇博客记录一下. 本博客的所有分析都是在持久层接口以及接口中的方 ...

  9. mybatis框架的第二天

    一.mybatis的基础crud的操作 先在接口中,写对应的方法名称,返回类型,访问符. 之后在映射配置文件中,写具体的实现 二.mybati中crud的细节 1.模糊查询 这是接口中 这是xml中 ...

随机推荐

  1. Robot Framework自动化测试环境搭建

    robotFramework是一个通用的自动化测试框架来进行验收测试和验收测试驱动开发模式,它具有易于使用的表格的测试数据和关键字测试驱动方法,其测试功能可通过实现与python或java的测试库进行 ...

  2. ZeroC ICE的远程调用框架 AMI与AMD -Why?

    在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...

  3. selenium针对浏览器滚动条的操作

    我们在实际自动化测试过程中,肯定会遇到当前页面显示不到我们定位的元素.这就需要下拉滚动条才能显示出我们的元素: 而滚动条的按钮又是我们定位不到的,所以需要使用js脚本来完成: 1.先来说我们的下拉滚动 ...

  4. 像黑客一样写博客–Pelican快速搭建静态博客

    "像黑客一样写博客",通过文本编辑器(Markdown编辑器)即可实现写博客,而且是静态的,很神奇吧,这里的方案是Pelican. 为啥叫 Pelican 这么奇怪的名字 &quo ...

  5. 2019-11-20:xss学习笔记

    xxe漏洞防御使用开发语言提供的禁用外部实体的方法phplibxml_disable_entity_loader(true); 卢兰奇对象模型,bom由于现代浏览器实现了js交互性方面的相同方法和属性 ...

  6. 2019-10-16:maccms10后门复现利用,解析

    该文章仅供学习,利用方法来自网络文章,仅供参考 Maccms10基于php+mysql的maccms,是苹果的内容管理,方便使用,功能良好,适用范围广 后门网站下载网址,是假官网:http://www ...

  7. WPF之路由事件的理解

    博客园上讲解路由事件的文章很多,在此转其中之一供学习参考: https://www.cnblogs.com/zhili/p/WPFRouteEvent.html 网上流传的文章中都对冒泡进行了说明,但 ...

  8. JAVA中数组Arrays类的常见用法

    import java.util.Arrays; int[] array1={7,8,3,2,12,6,5,4}; 1.  //克隆clone  int[] array2=array1.clone() ...

  9. 使用python2连接操作db2

    在python2.6下连接db2,步骤: 1.安装python2.6. (注:目前db2的驱动还不支持2.7) 2.安装setuptools,下载地址http://pypi.python.org/py ...

  10. 04-kubernetes 资源清单定义入门

    目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...