MyBatis | 您所在的位置:网站首页 › companyname是什么公司 › MyBatis |
要完成的功能列表清单: 1、查询 查询所有数据查看详情条件查询2、添加 3、修改 修改全部字段修改动态字段4.删除 删除一个批量删除 一、准备环境 数据库表tb_brand实体类Brand测试用例安装MyBatisX插件 (一)数据库表tb_brand
1、MybatisX MybatisX是一款基于IDEA的快速开发插件,为效率而生。 (1)主要功能: XML和接口方法相互跳转 根据接口方法生成statement (2)MybatisX下载 点小鸟可以自动切换。在接口中写一个返回值类型和id,会自动在SQL映射文件中创建 1、编写接口方法: Mapper接口;参数:无; 结果:List< Brand> selectAll() public interface BrandMapper { /** * 查询所有 * @return */ List selectAll(); }2、编写SQL语句: SQL映射文件 select * from tb_brand;3、执行方法,测试 public class MyBatisNO1Test { /** * * 查询所有 */ @Test public void testSelectAll() throws IOException { //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 List brands = brandMapper.selectAll(); System.out.println(brands); //4、释放资源 sqlSession.close(); } }执行结果: [Brand{id=1, brandName=‘null’, companyName=‘null’, ordered=5, description=‘好吃不上火’, status=0}, Brand{id=2, brandName=‘null’, companyName=‘null’, ordered=100, description=‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’, status=1}, Brand{id=3, brandName=‘null’, companyName=‘null’, ordered=50, description=‘i’m fine’, status=1}] 会发现brandName=‘null’, companyName='null’显示null,并没有查出结果,这是因为数据库中表的字段名为brand_name和company_name,而实体类中定义的属性名称brandName和companyName与数据库的字段名不一样,则不能自动封装数据 解决方法: (1)起别名 在SQL映射文件中的查询语句中,不写成select * from,而是把所有属性都列出来,把不一样的名称后加as起别名,别名要与实体类中属性的名称一致。 select id, brand_name as brandName, company_name as companyName, ordered, description, status from tb_brand;缺点:每次查询都要定义,不方便。 所以我们希望只定义一次,出现就引用 (2)定义SQL片段 把所有属性(需要起别名的起别名)放到< sql>中,并起一个id,那么这个id就代表这一串属性。在引用的时候,需要使用include标签,把id放进去。 id, brand_name as brandName, company_name as companyName, ordered, description, status select from tb_brand;注意:这里id爆红,需要修改sql dialect 方法1:alt+enter 缺点:定义SQL片段方法不灵活 (3)resultMap(最重要) resultMap的id自己随便起名,当前type类型要与brand类型映射; 中间有两个值,一个是id,一个是result,id标签是完成主键字段映射,result标签是完成一般字段的映射; 将select标签后的resultType改为resultMap加id. select * from tb_brand;【查询结果】 [Brand{id=1, brandName=‘三只松鼠’, companyName=‘三只松鼠股份有限公司’, ordered=5, description=‘好吃不上火’, status=0}, Brand{id=2, brandName=‘华为’, companyName=‘华为技术有限公司’, ordered=100, description='华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界 ', status=1}, Brand{id=3, brandName=‘小米’, companyName=‘小米科技有限公司’, ordered=50, description=‘i’m fine’, status=1}] (二)查看详情![]() 2、编写SQL语句:SQL映射文件 select * from tb_brand where id = #{id};参数占位符: #{}:会将其替换为?,为了防止SQL注入${}:拼字符串,会存在SQL注入问题参数类型: 使用 parameterType=" "指定参数类型,比如id 是int类型就可以写成parameterType="int "; 可以省略!!! 特殊字符处理: 比如在sql查询语句中要写一个where id < 5;而这个小于号跟标签开始相同,所以容易出错。 转义字符:特殊字符少的时候方便CDATA区:特殊字符多的时候方便3、执行方法,测试 /** * 查看详情 * */ @Test public void testSelectById() throws IOException { //接受参数 int id = 1; //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 Brand brand = brandMapper.selectById(id); System.out.println(brand); //4、释放资源 sqlSession.close(); } (三)条件查询
参数接收方法: 方法1:散装接收 List selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);使用@Param注解标注哪个值映射哪个,@Param(“参数占位符名称”),如: @Param(“status2”)int status1是指将传进来的status1的值,映射给status2,status2是SQL语句中占位符名称。 方法2:封装成一个对象 List selectByCondition(Brand brand);如果多个参数属于同一个对象,那么可以把它们封装成一个对象,直接把这个对象传递到方法中去。 此时需要注意SQL占位符名称要与brand属性名称一致,否则找不到对应的get方法。 方法3:map集合 List selectByCondition(Map map);SQL占位符名称要与map键的名称一样 2、编写SQL语句:SQL映射文件 需要注意,status是等值连接,而company_name和brand_name要用模糊查询like。 select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName}占位符#{}里的名称就不能随便写了: 若用散装接收,则要与@Param注解里的名称一样; 若用对象或Map集合,则要跟属性名或者map键的名称一样。 3、执行方法,测试 因为是模糊查询,这里要对数据进行处理。 //接受参数 int status = 1; String companyName ="华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%";(1)接收参数使用散装接收@Param注解时,需要将每个参数都传进去: 返回值是一个集合 //3.2 调用对应方法完成sql的执行 List brands = brandMapper.selectByCondition(status,companyName,brandName);测试代码: /** * 多条件查询 * */ @Test public void testSelectByCondition() throws IOException { //接受参数 int status = 1; String companyName ="华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 List brands = brandMapper.selectByCondition(status,companyName,brandName); System.out.println(brands); //4、释放资源 sqlSession.close(); }(2)接收参数使用封装对象时,需要在测试中把三个参数封装成一个对象 //封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName);然后把brand对象传进去 List brands = brandMapper.selectByCondition(brand);测试代码: //接受参数 int status = 1; String companyName ="华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName); //1、加载核心配置文件,获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; //定义配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、获取SqlSession对象,执行SQL语句 SqlSession sqlSession = sqlSessionFactory.openSession(); //3、执行sql //List users = sqlSession.selectList("test.selectAll"); //3.1 通过SqISession的getMapper方法获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //3.2 调用对应方法完成sql的执行 //List brands = brandMapper.selectByCondition(status,companyName,brandName); List brands = brandMapper.selectByCondition(brand); System.out.println(brands); //4、释放资源 sqlSession.close();(3)接收参数时使用map集合,需要在测试中把三个参数封装成一个map集合: //Map集合 Map map = new HashMap(); map.put("status",status); map.put("companyName",companyName); map.put("brandName",brandName);把map集合传进去 List brands = brandMapper.selectByCondition(map);多条件查询,需要把所有条件参数都输入才能查询出结果,而如果只想通过其中一个条件查询,就会出问题,很不灵活。 (四)动态条件查询SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL MyBatis 对动态SQL有很强大的支撑: ifchoose (when, otherwise)trim (where, set)foreach 多条件——动态条件查询if:条件判断 test后跟逻辑表达式,注意test后面比较的是用户输入的参数,而不是表中的,所以区分参数名和表中字段名; int类型直接比较是否等于空 String类型除了比较是否为空,还要比较是否为空字符串。 select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName}如果不传入一个参数(这里是brandName),可以根据传入的status和companyName查出结果
(1)恒等式过渡,使每个语句结构都相同 在每一个if标签内的语句都加上and,在where后面加一个恒等式,无论后面第几个参数为空,就会出现where 1=1 and …的情况。 where 1=1 and status = #{status} and company_name like #{companyName} and brand_name like #{brandName}(2)< where>替换where关键字(常用) select * from tb_brand and status = #{status} and company_name like #{companyName} and brand_name like #{brandName}会自动把不需要的and去掉 从多个条件中选择一个 choose (when, otherwise):选择,类似于Java中的 switch语句 只能有一个条件成立 如果一个参数都没有,那么会执行otherwise(相当于default),里面是恒等式 select * from tb_brand where status = #{status} company_name like #{companyName} brand_name like #{brandName} 1 = 1 ;而在上面学到< where>标签会自动修正SQL语法,所以可以把上述otherwise去掉,直接用< where>标签代替where |
CopyRight 2018-2019 实验室设备网 版权所有 |