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); }