Mybatis需要注意的细节
2019-12-18 16:06:59来源:博客园 阅读 ()
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'
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);
}
}
原文链接:https://www.cnblogs.com/yiyangyu/p/mybatis02.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:idea个性化配置
- MyBatis中的$和#,用不好,准备走人! 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- Mybaties简单实例测试及注意问题 2020-06-07
- 天哪!手动编写mybatis雏形竟然这么简单 2020-06-06
- MyBatis整合双数据源 2020-06-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash