当前位置: 首页 > news >正文

东莞市建设网站培训免费seo软件

东莞市建设网站培训,免费seo软件,北京网页制作教程,软件测试需要掌握的技能目录 1 使用MyBatis对数据库的增删改查操作 1.1 保存操作 1.2 修改操作 1.3 删除操作 1.4 查询操作 2 MyBatis中参数的深入详解 2.1 实体类包装对象作为查询条件 2.2 实体类属性和数据库列名不对应的解决 本博文总结下使用MyBatis的CRUD操作及参数的深入,关…

目录

1 使用MyBatis对数据库的增删改查操作

1.1 保存操作

1.2 修改操作

1.3 删除操作

1.4 查询操作

2 MyBatis中参数的深入详解

2.1 实体类包装对象作为查询条件

2.2 实体类属性和数据库列名不对应的解决


本博文总结下使用MyBatis的CRUD操作及参数的深入,关于MyBatis的环境搭建就不再赘述了,可以回顾下以前的博文,本次也是在这个工厂的基础上进行的。

1 使用MyBatis对数据库的增删改查操作

1.1 保存操作

需求:保存一个用户对象,并获取保存数据的id值。

1)UserDao接口中定义好保存操作方法

//用户持久层接口
public interface UserDao {//保存用户void saveUser(User user);
}

2)映射配置文件中增加配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.winter.dao.UserDao">
<!--    保存用户--><insert id="saveUser" parameterType="com.winter.domain.User">
--         配置插入后获取插入数据的id<selectKey keyProperty="id" keyColumn="id" resultType="Integer" order="AFTER">select last_insert_id();</selectKey>insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday});</insert>
</mapper>

【注意】:

  • parameterType属性,代表的是参数的类型,我们写要传入类的全名称;
  • sql中用#{}表示占位符,类似于前面学习JDBC中的?,用来替换实际的数据;

3)添加测试类中的保存测试方法

【注意】:

  • 获取dao代理对象和释放资源封装在了两个方法中,并通过@before和@after注解执行;
  • 在释放资源方法中,释放资源前要进行commit事务提交,因为其默认是手动提交的,否则执行保存用户方法后不会插入数据;
  • 关于执行testSave方法后插入了两条数据,怀疑是使用maven构建,此处又使用@Test运行,可能是运行了两次导致实际插入两次数据,在File-Settings-Maven-Runner 中勾选skip Tests即可解决。
//测试MyBatis的CRUD
public class MyBatisTest {private InputStream in;private SqlSession sqlSession;private UserDao userDao;@Before  //在测试方法执行前执行public void init() throws Exception{//1、读取配置文件,生成字节输入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2、获取SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//3、获取SqlSession对象sqlSession = factory.openSession();//4、获取dao的代理对象userDao = sqlSession.getMapper(UserDao.class);}@After //测试方法执行后执行public void destroy() throws Exception{//提交事务sqlSession.commit();//6、释放资源sqlSession.close();in.close();}//测试保存@Testpublic void testSave(){User user = new User();user.setUsername("MyBatis new insert");user.setAddress("BJ");user.setSex("男");user.setBirthday(new Date());System.out.println("保存前:"+user);//5.执行保存方法userDao.saveUser(user);System.out.println("保存后:"+user);}
}

1.2 修改操作

1)UserDao接口中定义好修改操作方法

//用户持久层接口
public interface UserDao {//修改用户void updateUser(User user);
}

2)映射配置文件中增加配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.winter.dao.UserDao">
<!--    修改用户--><update id="updateUser" parameterType="com.winter.domain.User">update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};</update>
</mapper>

3)添加测试类中的保存测试方法

    //测试修改@Testpublic void testUpdate(){User user = new User();user.setId(25);user.setUsername("MyBatis_Update");user.setAddress("DQ");user.setSex("女");user.setBirthday(new Date());//5.执行修改方法userDao.updateUser(user);}

1.3 删除操作

1)UserDao接口中定义好删除操作方法

//用户持久层接口
public interface UserDao {//删除用户,根据IDvoid deleteUser(Integer userId);
}

2)映射配置文件中增加配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.winter.dao.UserDao">
<!--    删除用户--><delete id="deleteUser" parameterType="Integer">delete from user where id = #{userId}</delete>
</mapper>

3)添加测试类中的删除测试方法

    //测试删除@Testpublic void testDelete(){//5.执行删除方法userDao.deleteUser(24);}

1.4 查询操作

这里实现两个功能,一个根据id查询用户,另一个是根据名字模糊查询。
1)UserDao接口中定义好查询操作方法
//用户持久层接口
public interface UserDao {//根据id查询用户User findById(Integer userId);//模糊查询List<User> findByName(String username);
}

2)映射配置文件中增加配置

3)添加测试类中的查询测试方法

//测试查询一个用户@Testpublic void testFindById(){//5.执行查询User user = userDao.findById(25);System.out.println(user);//User{id=25, username='MyBatis_Update', address='DQ', sex='女', birthday=Mon Sep 14 17:01:09 CST 2020}}//测试模糊查询@Testpublic void testFindByName(){//5.执行查询List<User> users = userDao.findByName("%王%");for (User user : users) {System.out.println(user);}}

【注意】:模糊查询还有另外一种配置方式,对应的测试类中的方法参数也要变更,去掉%

    <select id="findByName" parameterType="String" resultType="com.winter.domain.User"><!--select *from user where username like #{username}-->select *from user where username like '%${value}%'</select>
        //5.执行查询
//        List<User> users = userDao.findByName("%王%");List<User> users = userDao.findByName("王");

这种配置方式,value名字是固定的,不能改为其他的,且这种相对于前一种,虽然效果一样,但是执行的sql语句不同:

由此,我们可以发现,#{}用的是PreparedStatement的参数占位符,可以有效防止sql注入问题,而${}用的是Statement对象的字符串拼接SQL。实际开发中我们使用#{}比较靠谱。

2 MyBatis中参数的深入详解

2.1 实体类包装对象作为查询条件

首先了解下ognl表达式,MyBatis使用ognl表达式解析对象字段的值,什么是ognl表达式?

  • OGNL表达式,是Apache开发的,全称为Object Graphic Navigation Language,对象图导航语言;
  • 它通过对象的取值方法来获取数据,在写法上把get给省略了,比如获取对象名称,类写法:user.getUsername(),OGNL表达式的写法:user.username。MyBatis中之所以能直接写username,而不是user.username,是因为在parameterType中已经提供了属性所属的类。

我们在第一部分的内容,查询条件都比较单一,若是比较综合的查询,需要把查询条件封装一个对象传递,这时该怎么做?还是举个栗子说明具体实现步骤吧:

1)UserDao接口中定义好查询操作方法findUserByVo

//用户持久层接口
public interface UserDao {//根据QueryVo查询条件查询用户List<User> findUserByVo(QueryVo vo);
}

2)映射配置文件中增加配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.winter.dao.UserDao">
<!--    根据QueryVo条件查询用户--><select id="findUserByVo" parameterType="com.winter.domain.QueryVo" resultType="com.winter.domain.User">select *from user where username like #{user.username}</select>
</mapper>

3)添加测试类中的查询测试方法

    //测试使用QueryVo作为查询条件@Testpublic void testFindUserByVo(){QueryVo vo = new QueryVo();User user = new User();user.setUsername("%王%");vo.setUser(user);//5.执行查询List<User> users = userDao.findUserByVo(vo);for (User user1 : users) {System.out.println(user1);}}

2.2 实体类属性和数据库列名不对应的解决

我们前面的练习都是让实体类属性和数据库列名严格保持一致的(这里注意,MySQL在windows下是不区分大小写的,即把userName写成username,windows环境下都认为是一样的,但是在Linux环境下是严格区分大小写的),不保持一致是不能进行增删改查操作的,但是不对应的情况下有没有办法解决呢?

【方法一】:起别名,效率是最高的,在SQL语句层面上解决的

比如,你的数据库列名为id、username、address、sex,而你的类属性名为userId、userName、userAddress、userSex,此时在映射配置文件中可以这么写:

<!--    查询所有--><select id="findAll" resultType="com.winter.domain.User">select id as userId,username as userName,address as userAddress,sex as userSex from user;</select>

【方法二】:配置方式,使用resultMap配置实体类属性名和查询结果的列名对应关系,此时需要注意的查询所有对应的配置中resultType要换为resultMap,即resultMap="userMap"。这种方式开发效率高,但是多了一步解析,所以运行效率低了些。

<!--    查询所有--><resultMap id="userMap" type="com.winter.domain.User"><!--主键字段 --><id property="userId" column="id"></id><!--非主键字段 --><result property="userName" column="name"></result><result property="userAddress" column="address"></result><result property="userSex" column="sex"></result></resultMap><select id="findAll" resultType="com.winter.domain.User">select * from user;</select>

需要源码的传送门在此。

作于202009151210,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

http://www.lbrq.cn/news/2443771.html

相关文章:

  • 做任务有奖励的网站长沙快速排名优化
  • wordpress 头像地址西安seo按天收费
  • 网站制作网站设计营销网站推荐
  • 莆田外贸专业建站关键词排名网站
  • 网站制作的方法网站推广方法有哪些
  • 最大网站建设公司郑州网站建设用户
  • 网站建设和网络搭建是一回事吗系统优化的意义
  • 徐州 网站建设如何做好百度推广
  • 成都锦江建设局网站b2b平台排名
  • 网站开发税点开户推广竞价开户
  • 汽车网站推广策略乐陵seo优化
  • 上海做得好的网站建设公司免费的舆情网站app
  • 兰州展柜公司网站建设线上销售平台有哪些
  • 百货商城网站建设网络营销是什么意思
  • wordpress和站点网页制作软件dreamweaver
  • 莱西网站建设公司企业网站建设方案
  • 历史价格查询百度seo关键词排名优化教程
  • 珠宝静态网站模板茂名seo顾问服务
  • 成都网上商城网站建设互联网推广招聘
  • 本网站建设广州网页推广公司
  • 网站设计方案及报价单湖南百度推广公司
  • 全球网站排名查询外贸软件
  • 算命网站建设开发沈阳seo按天计费
  • 织梦做的网站打包在dw修改友情链接的四个技巧
  • wordpress主题更改首页贵州seo技术查询
  • 网站标题写什么作用是什么网站推广优化价格
  • 网站建设合同封面网络营销是指
  • 个人网站免费模板seo外链友情链接
  • 学校网站模板html下载女孩子做运营是不是压力很大
  • 昆明定制化网站建设天津seo推广软件
  • 特产|基于SSM+vue的南阳特产销售平台(源码+数据库+文档)
  • MySQL 中 VARCHAR(50) 和 VARCHAR(500) 的区别
  • ARM SMMUv3控制器注册过程分析(八)
  • 协作机器人掀起工厂革命:码垛场景如何用数据重塑制造业命脉?
  • 渗透高级-----测试复现(第三次作业)
  • 【C++】二叉搜索数