mybatis

Posted xfishs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis相关的知识,希望对你有一定的参考价值。

1.不创建mapper对应接口(selectOne(S))

    //不采用接口方式
    @Test
    public void selectPersonNoInterface() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        Person person = sqlSession.selectOne("com.xfishs.dao.PersonMapper.selectPerson",1);
//        Person person = sqlSession.selectOne(与Person.xml文件相对应,传入参数);
        System.out.println(person);
        sqlSession.close();
    }

 

2.列名与属性不一致的时候处理(与bean与数据库名不一致)

例如 :bean 中为userName, 数据库中为  name

解决方案一、使用别名

  

写全sql语句,如 select * from Person.   改写为 select `id`,`name` as userName,`age` from Person.

  

解决方案二、使用 ResaultMap(Person.xml)

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 对应接口类 -->


<mapper namespace="com.xfishs.dao.PersonMapper">


    <!-- 解决列名与属性名不一致 -->
    <resultMap id="personResultMap" type="Person">
        <!-- 不匹配的列名在这里配置-->
        <result column="name" property="userName"/>
    </resultMap>

    <!-- id 对应接口的方法名 parameterType 参数类型, resultType 返回值类型-->
    <select id="selectPerson" parameterType="int" resultType="Person">
        SELECT * FROM PERSON WHERE ID=#{id}
    </select>

</mapper>

 3.sql 语句中 #  和 $ 的区别与用法(模糊查询用到)

  #是占位符号 与? 等价

  $是字符串拼接。因此使用$的时候,如果参数是字符串类型,那么应当使用引号

  当参数表示表明 或者 列名的时候,只能使用$

  如:

    <select id="selectPerson" parameterType="int" resultType="Person">
        SELECT * FROM PERSON WHERE name like ‘%${value}%‘
    </select>

例如参数为列名时

  <select id="selectPersonSortByAge" parameterType="string" resultType="Person">
        select * from Person order by ${value}
    </select>

  

4.查询的时候 不区分大小写(全都转换为大写,或者小写)

select * from person where lower(name) like lower(‘%${value}%‘)

 

5.sql语句中传递参数

  ${value}   固定写法

  #{参数}  

    方法一、 接口方法中String function(String title);  那么可以写 #{title}

    方法二、#{0},#{1}....   (多参数时,按索引值植入),此时接口参数名任意写

    方法三、接口使用注解(@Param)

    mapper中

    <select id="selectPersonByPage" resultType="Person">
        select * from Person limit #{offset},#{pageSize}
    </select>

    接口中

List<Person> selectPersonByPage(@Param("offset") int offset,@Param("pageSize") int pageSize);

    方法四、使用map (常用) mapper 和方法三 一致   mapper中的占位符,要与 map中的key意义对应

    接口

List<Person> selectPersonByPage(Map<String,Object> map);

    使用时

@Test
    public void selectPersonByPage() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("offset",2);
        map.put("pageSize",2);
        List<Person> persons =  personMapper.selectPersonByPage(map);
        sqlSession.close();
        System.out.println(persons);
    }

 

6.插入数据时,返回自增id

方法一、在mapper中配置   useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

<insert id="insertPerson" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `person` (`name`, `age`) VALUES (#{name}, #{age})
    </insert>

  测试

@Test
    public void insertPerson() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
        Person person = new Person("nihao",18);
        mapper.insertPerson(person);
        sqlSession.commit();
        System.out.println(person);
    }

  这个时候 Person的id属性值已经被赋值为 数据库中的id值

方法二、在mybatis的全局配置中进行配置 useGeneratedKeys 属性(mybatis-config.xml)   还是需要在mapper中指定keyProperty的属性

  <settings>
        <setting name="useGeneratedKeys" value="true"/>
    </settings>

 7.sql更新操作 

<update id="updatePerson" parameterType="Person">
        UPDATE `person` SET `name` = #{name} ,`age`=#{age} WHERE (`id`=#{id})
    </update>

测试

@Test
    public void updatePerson() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
        //先查询
        Person person = mapper.selectPerson(1);
        //修改
        person.setAge(35);
        //更新
        int count = mapper.updatePerson(person);
        sqlSession.commit();
        sqlSession.close();
        System.out.println("修改记录 count = " + count);
        System.out.println(person);
    }

 

8.sql删除操作

<delete id="deletePerson" parameterType="int">
        delete from `person` where `id` = #{id}
    </delete>

测试

@Test
    public void deletePerson() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
        int count = mapper.deletePerson(1);
        sqlSession.commit();
        sqlSession.close();
        System.out.println("删除记录 count = " + count);
    }

  

 

  

  

 

  

 

 

 

 

以上是关于mybatis的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段