Mybatis入门操作

x33g5p2x  于2021-09-24 转载在 其他  
字(8.1k)|赞(0)|评价(0)|浏览(274)

Mybatis入门案例

准备工作

@Beforeeach

抽取生成sqlsessionfactory的方法         测试API中的注解,在执行@Test之前 先执行

实现代码:

public class TestMybatis2 {
    SqlSessionFactory sqlSessionFactory;

    @Test
    @BeforeEach
    public void init() throws IOException {
    //1.指定资源文件
    String resource="mybatis/mybatis-config.xml";
        InputStream inputstream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    }
    @Test
    public void testMybatis01(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        List<DemoUser> list = mapper.findAll();
        System.out.println(list);
}

为什么不提取sqlSession???

** 练习Mybatis的基本操作**

1.查询name为王昭君的用户

@Test
    @BeforeEach
    public void init() throws IOException {
    //1.指定资源文件
    String resource="mybatis/mybatis-config.xml";
        InputStream inputstream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    }

 @Test/*查询name为王昭君的用户*/
    public void testMybatis02(){
        /*保证每个线程都能获取一次链接*/
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        String name="王昭君";
//        如果不能把凭证结果唯一 使用集合!
        List<DemoUser> one = mapper.findOne(name);
        System.out.println(one);
        sqlSession.close();
    }

注意:如果不能把凭证结果唯一 使用集合!

2.查询sex为女 age>18的数据

以下映射文件对应三种方式的mapper接口方法

List <DemoUser> findSed(DemoUser demoUser);

    List<DemoUser> find1(Map<String, Object> map);

    List<DemoUser> find2(@Param("sex") String sex, @Param("age") int age);
}

方式一

@Test
    @BeforeEach
    public void init() throws IOException {
    //1.指定资源文件
    String resource="mybatis/mybatis-config.xml";
        InputStream inputstream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    }

  @Test/*查询sex为女 age>18的数据*/
    public void testMybatis03(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        /*1.方式1*/
        DemoUser demoUser=new DemoUser(null,null,18,"女");
        /*2.方式2*/
        DemoUser demoUser1=new DemoUser();
        demoUser1.setSex("女").setAge(18);
        /*面向对象开发*/
        List <DemoUser> de = mapper.findSed(demoUser);
        System.out.println(de);
        sqlSession.close();
    }

sql   /#{属性}

<select id="findSed"  resultType="com.jt.pojo.DemoUser" >
        select * from demo_user where sex=#{sex} and age >#{age}
    </select>

方式2:

@Test/*方式2*/
    public void testMybatis04(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        Map<String, Object> map=new HashMap<>();
        map.put("sex", "女");
        map.put("age", 18);
        List<DemoUser> mapper1 = mapper.find1(map);
        System.out.println(mapper1);
        sqlSession.close();
    }

映射文件

<select id="find1"  resultType="com.jt.pojo.DemoUser" >
        select * from demo_user where sex=#{sex} and age >#{age}
    </select>

方式3:

@Test/*方式3*/
    public void testMybatis05(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        String sex="女";
        int age=18;
        List<DemoUser> mapper2 = mapper.find2(sex, age);
        System.out.println(mapper2);
        sqlSession.close();

    }
<select id="find2"  resultType="com.jt.pojo.DemoUser" >
        select * from demo_user where sex=#{sex} and age >#{age}
    </select>

关于参数的总结:

MyBatis遇到多值传参时,默认采用下标的方式取值,MyBatis只支持单值传参,多值的话需要封装成单值
封装策略:

1.封装为实体对象  可以通过/#{属性}格式直接获取属性值

2.更为常用的方式 Map集合 可以通过/#{属性}格式直接获取属性值

3.非要多值传参 使用注解 @Param("key")-----将多值封装成map集合

3.以age order by升序排列

/#与$用法

使用/#{} 有预编译的效果,防止sql攻击

mybatis默认给参数添加引号

使用字段为参数时,使用${},慎用,可能出现sql攻击问题

代码实现

Test层

@Test
    @BeforeEach
    public void init() throws IOException {
    //1.指定资源文件
    String resource="mybatis/mybatis-config.xml";
        InputStream inputstream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    }
@Test/*以age order by升序排列*/
    public void testMybatis06(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        String column="age";
        List <DemoUser> list=mapper.order(column);
        System.out.println(list);
        sqlSession.close();
    }

mapper映射文件

<select id="order"  resultType="com.jt.pojo.DemoUser" >
        select * from demo_user order by ${column}
    </select>

mapper接口

List<DemoUser> order(String column);

4.常规CURD操作

关于事务的说明

mybatis中的更新事务默认开启,需要手动提交事务

//自动提交事务 aqlSessionFactoty.openSession(true)//

不提交无需回滚,因为默认不成功自动回滚

 4.1新增操作

代码实现

@Test
    public void testMybatis07(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser demoUser=new DemoUser(null,"康娜",8000,"女");
        int h=mapper.insert1(demoUser);
        System.out.println("影响行数"+h);
        if(h>0){
            sqlSession.commit();
        }
        sqlSession.close();
    }
@Test
    @BeforeEach
    public void init() throws IOException {
    //1.指定资源文件
    String resource="mybatis/mybatis-config.xml";
        InputStream inputstream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
    }
int insert1(DemoUser demoUser);
<insert id="insert1">
        insert into demo_user value (null,#{name},#{age},#{sex})
    </insert>

4.2删除操作

代码实现

@Test/*删除name=康娜的数据*/
    public void testMybatis09(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        String name="康娜";
        int h=mapper.delete1(name);
        if(h>0){
            sqlSession.commit();
        }
        sqlSession.close();
    }
<delete id="delete1">
        delete from demo_user where name=#{name}
    </delete>
int delete1(String name);

4.3修改操作

代码实现

@Test/*把id=1 的数据name改为“守善大师” age=5000*/
    public void testMybatis08(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser demoUser=new DemoUser(1,"守善大师",500,null);
        int h=mapper.update1(demoUser);
        System.out.println("影响行数"+h);
        if(h>0){
            sqlSession.commit();
        }
        sqlSession.close();
    }
<update id="update1">
        update demo_user set age=#{age}, name=#{name} where id=#{id}

    </update>
int update1(DemoUser demoUser);

5.MyBatis的转义字符

xml文件中的转义字符

> 大于 < 小于

& &

<![CDATA[........................]]>

<!--根据age查询数据
    xml文件中的转义字符
    &gt; 大于
    &lt; 小于
    &amp; &
    如果sql中含有大量的转义字符  建议使用转义标签体
    语法:<![CDATA[.....]]>
    -->
    <select id="findage" resultType="com.jt.pojo.DemoUser">
    <![CDATA[select * from demo_user where age > #{minage} and age < #{maxage}]]>
    </select>

6.MyBatis的集合用法

6.1使用array

/*批量删除id为227、228、229的数据
    需要删除相同的多个数据 封装方法:
    1.array
    2.list
    3.map
    */
    @Test
    public void test2(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        int [] ids={227,228,229};
        mapper.deleteids(ids);

        System.out.println("删除成功");

    }
<delete id="deleteids">
        delete from demo_user where id in(
        <foreach collection="array" item="id" separator=",">
            #{id}
        </foreach>
        )
    </delete>
void deleteids(int[] ids);

关于foreach标签的用法 

1.collection表示集合名称
数组→array  List集合→list  Map集合→map的key
2.item 为每次遍历的数据的形参变量
3.open 循环开始的标签
4.close 循环结束的标签
5.index 循环遍历的下标
6.separator 循环遍历的分割符

6.2使用List集合

代码实现

@Test/*2.List   删除id 为182  194  196的数据*/
    public void test3(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        List list=new ArrayList();
        list.add(182);
        list.add(194);
        list.add(196);
        mapper.deleteids2(list);
        System.out.println("删除成功");

    }
void deleteids2(List list);
<delete id="deleteids2">
        delete from demo_user where id in(
            <foreach collection="list" item="id" separator=",">
                #{id}
            </foreach>

            )
    </delete>

6.3使用map集合套list

代码实现

@Test
    /*3.map 有时业务需求导致需要使用map封装list */
    public void test4(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        List list=new ArrayList();
        list.add(182);
        list.add(194);
        list.add(196);
        Map map=new HashMap();
        map.put("ids",list);
        mapper.deleteids3(map);
        System.out.println("删除成功");

    }
void deleteids3(Map map);
<delete id="deleteids3">
        delete from demo_user where id in(
            <foreach collection="ids" separator=",">
                #{id}
            </foreach>
            )
    </delete>

相关文章