上一篇Blog了解了MyBatis的基本概念、用途并且简单构造了一个MyBatis的项目并进行了一些操作,本篇Blog就来学习下MyBatis的基本操作,也就是我们常用的CRUD增删改查,并且通过基本操作来深入理解下配置的解析流程。
基本操作
还是使用我们上篇Blog的项目做下面的一些操作,继续操作person表来完成基本的CRUD操作,回顾下上篇Blog我们创建的PersonDao对象:
package com.example.MyBatis.dao.mapper; import com.example.MyBatis.dao.model.Person; import java.util.List; public interface PersonDao { List<Person> getPersonList(); }
以及具体通过反射来实现对象实例化的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=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.MyBatis.dao.mapper.PersonDao"> <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person"> select * from person </select> </mapper>
注意如下几个标签:
- namespace:一个namespace对应一个Dao类,路径一定要准确,例如我们这里对应PersonDao
- id:就是对应的namespace中的方法名,例如我们这里对应PersonDao里的getPersonList方法
- resultType : SQL语句执行的返回值,也就是我们定义的数据对象
这里有一个select标签表明是select操作,其实我们不同的操作还会使用其它标签。
select操作
select标签是mybatis中最常用的标签之一,select语句有很多属性可以详细配置每一条SQL语句。
需求:依据pseron的id去查询person数据
1 调整PersonDao接口定义
首先我们可以在PersonDao接口中增加一个方法通过传入username和password获取数据,或者通过Map去获取,两种写法我们都列举下:
package com.example.MyBatis.dao.mapper; import com.example.MyBatis.dao.model.Person; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface PersonDao { List<Person> getPersonList(); Person getPersonByUsername(@Param("username")String username, @Param("password")String password); Person getPersonByMap(Map<String,Object> map); }
这里顺便回顾下注解,我们可以看到参数注解的作用时机是运行时,刚好和xml反射生成实例是同时的,如果通过参数查询的方式没有加注解,执行的时候就匹配不到对应的参数了:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package org.apache.ibatis.annotations; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER}) public @interface Param { String value(); }
2 编写personMapper.xml
其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:
<?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=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.MyBatis.dao.mapper.PersonDao"> <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person"> select * from person </select> <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" > select * from person where password=#{password} and username = #{username} </select> <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person" parameterType="map"> select * from person where password=#{password} and username = #{username} </select> </mapper>
3 编写单元测试实现
最后我们编写单元测试查看实现效果:
@Test public void testGetPerson() { //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //2.执行SQL PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person = personDao.getPersonByUsername("tml","123456"); System.out.println(person); Map<String, Object> map = new HashMap<>(); map.put("username","gcy"); map.put("password","2343443"); Person personMap = personDao.getPersonByMap(map); System.out.println(personMap); //关闭sqlSession sqlSession.close(); }
确实可以打印出:
insert操作
我们一般使用insert标签进行插入操作,它的配置和select标签差不多
1 调整PersonDao接口定义
首先我们可以在PersonDao接口中增加一个方法addPerson用来插入数据:
package com.example.MyBatis.dao.mapper; import com.example.MyBatis.dao.model.Person; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface PersonDao { List<Person> getPersonList(); Person getPersonByUsername(@Param("username")String username, @Param("password")String password); Person getPersonByMap(Map<String,Object> map); int addPerson(Person person); }
2 编写personMapper.xml
其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:
<?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=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.MyBatis.dao.mapper.PersonDao"> <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person"> select * from person </select> <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" > select * from person where password=#{password} and username = #{username} </select> <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person" parameterType="map"> select * from person where password=#{password} and username = #{username} </select> <insert id="addPerson" parameterType="com.example.MyBatis.dao.model.Person"> insert into person (id,username,password,age,phone,email) values (#{id},#{username},#{password},#{age},#{phone},#{email}) </insert> </mapper>
3 编写单元测试实现
最后我们编写单元测试查看实现效果:
@Test public void testAddPerson() { //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //2.执行SQL PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person=new Person(); person.setUsername("mhw"); person.setAge(22); person.setEmail("123234@qq.com"); person.setPassword("343444"); person.setPhone(1983499834); int result = personDao.addPerson(person); System.out.println(result); //3.提交事务 sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库 //关闭sqlSession sqlSession.close(); }
返回结果为:
可以看到数据库中多了一条数据:
操作起来比PrepareStatement方便了很多。
update操作
我们一般使用update标签进行更新操作,它的配置和select标签差不多
1 调整PersonDao接口定义
首先我们可以在PersonDao接口中增加一个方法updatePerson用来更新数据:
package com.example.MyBatis.dao.mapper; import com.example.MyBatis.dao.model.Person; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface PersonDao { List<Person> getPersonList(); Person getPersonByUsername(@Param("username")String username, @Param("password")String password); Person getPersonByMap(Map<String,Object> map); int addPerson(Person person); int updatePerson(Person person); }
2 编写personMapper.xml
其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:
<?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=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.MyBatis.dao.mapper.PersonDao"> <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person"> select * from person </select> <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" > select * from person where password=#{password} and username = #{username} </select> <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person" parameterType="map"> select * from person where password=#{password} and username = #{username} </select> <insert id="addPerson" parameterType="com.example.MyBatis.dao.model.Person"> insert into person (id,username,password,age,phone,email) values (#{id},#{username},#{password},#{age},#{phone},#{email}) </insert> <update id="updatePerson" parameterType="com.example.MyBatis.dao.model.Person"> update person set username=#{username},phone=#{phone} where id=#{id} </update> </mapper>
3 编写单元测试实现
最后我们编写单元测试查看实现效果:
@Test public void testUpdatePerson() { //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //2.执行SQL PersonDao personDao = sqlSession.getMapper(PersonDao.class); Person person=new Person(); person.setUsername("lisi"); person.setId(0); person.setPhone(133154637); int result = personDao.updatePerson(person); System.out.println(result); //3.提交事务 sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库 //关闭sqlSession sqlSession.close(); }
返回结果为:
数据库内的数据确实发生了变化:
delete操作
我们一般使用delete标签进行删除操作,它的配置和select标签差不多
1 调整PersonDao接口定义
首先我们可以在PersonDao接口中增加一个方法deletePerson:
package com.example.MyBatis.dao.mapper; import com.example.MyBatis.dao.model.Person; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface PersonDao { List<Person> getPersonList(); Person getPersonByUsername(@Param("username")String username, @Param("password")String password); Person getPersonByMap(Map<String,Object> map); int addPerson(Person person); int updatePerson(Person person); int deletePerson(@Param("id")int id); }
2 编写personMapper.xml
其次依据PersonDao接口中增加的方法我们可以在personMapper中进行sql语句编写来实现:
<?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=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.MyBatis.dao.mapper.PersonDao"> <select id="getPersonList" resultType="com.example.MyBatis.dao.model.Person"> select * from person </select> <select id="getPersonByUsername" resultType="com.example.MyBatis.dao.model.Person" > select * from person where password=#{password} and username = #{username} </select> <select id="getPersonByMap" resultType="com.example.MyBatis.dao.model.Person" parameterType="map"> select * from person where password=#{password} and username = #{username} </select> <insert id="addPerson" parameterType="com.example.MyBatis.dao.model.Person" > insert into person (id,username,password,age,phone,email) values (#{id},#{username},#{password},#{age},#{phone},#{email}) </insert> <update id="updatePerson" parameterType="com.example.MyBatis.dao.model.Person" > update person set username=#{username},phone=#{phone} where id=#{id} </update> <delete id="deletePerson" parameterType="int" > delete from person where id = #{id} </delete> </mapper>
3 编写单元测试实现
最后我们编写单元测试查看实现效果:
@Test public void testDeletePerson() { //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //2.执行SQL PersonDao personDao = sqlSession.getMapper(PersonDao.class); int result=personDao.deletePerson(0); System.out.println(result); //3.提交事务 sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库 //关闭sqlSession sqlSession.close(); }
打印结果为:
可以看到数据id为0的数据确实被从数据库中删除了: