MyBatis的单表CRUD操作(基于代理Dao)
简要概括:我们使用MyBatis的目的就是简化CRUD操作的,使我们开发中只用注重sql的编写,其余的都交给MyBatis来处理就好。
1.MyBatis实现增加一条数据
-
持久层接口中编写增加一套数据的方法
public interface UserDao { //保存用户 void save(User user); }
-
在接口的映射配置文件中配置
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--保存用户--> <insert id="save" parameterType="com.wang.pojo.User"> insert into user(username,password) values(#{username},#{password}) </insert> </mapper>
(1)这里第一次见的小伙伴,注意一下
parameterType
这个属性,这是表示方法中的参数类型,这里传入的参数是User类型,所以我这里写的是全类名。(2)之后还会有一些属性,遇到我都解释一下,这里不好举例子,下面的例子会一一说明。
(3)这里还涉及到一个新的东西,
#{ }
,这个代表的是占位符,就相当于我们之前学jdbc时候的?,这个其实就是著名的ognl表达式,这里就不介绍了。 -
测试类中编写测试程序检验一下
由于后面都是测试方法,这里将公共的代码抽离出来
wInputStream in=null; SqlSessionFactory factory = null; SqlSession session = null; @Before public void init(){ //读取配置文件 try { in = Resources.getResourceAsStream("SqlMapConfig.xml"); } catch (IOException e) { e.printStackTrace(); } //创建工厂对象 factory = new SqlSessionFactoryBuilder().build(in); //用SqlSessionFactory对象来创建SqlSession对象 session = factory.openSession(); } @After public void destroy(){ session.commit();//事务提交 session.close(); try { in.close(); } catch (IOException e) { e.printStackTrace(); } }
保存方法的测试程序如下:
@Test public void test03(){ UserDao dao = session.getMapper(UserDao.class); User user = new User(); user.setUsername("wang"); user.setPassword("123"); dao.save(user); }
2.MyBatis中修改一条数据(根据id)
-
持久层接口中编写修改的方法
public interface UserDao { //根据id来修改对应的用户 int updateUser(User user); }
-
在接口的映射配置文件中配置
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--更新用户--> <update id="updateUser" parameterType="com.wang.pojo.User"> update user set username=#{username},password=#{password} where id=#{id} </update> </mapper>
-
测试类中编写测试程序检验一下
@Test public void test04(){ UserDao dao = session.getMapper(UserDao.class); User user = dao.findById(6); user.setUsername("来哥"); dao.updateUser(user); }
3.MyBatis中删除一条数据(根据id)
-
持久层接口中编写删除的方法
public interface UserDao { //根据id来删除对应的用户 int deleteUser(int id); }
-
在接口的映射配置文件中配置
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--删除用户--> <delete id="deleteUser" parameterType="int" > delete from user where id=#{id} </delete> </mapper>
-
测试类中编写测试程序检验一下
@Test public void test05(){ UserDao dao = session.getMapper(UserDao.class); dao.deleteUser(7); }
4.MyBatis的常用查询
这一块很重要,所有就放在博客的最后演示,这里涉及查询所有,查询一条数据,模糊查询三个部分,又会涉及到上面没有用的属性和方法。
-
查询表中的所有数据
-
持久层接口中编写查询所有的方法
public interface UserDao { //查询所有 List<User> findAll(); }
-
在接口的映射配置文件中配置
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--查询所有--> <select id="findAll" resultType="com.wang.pojo.User"> select * from user </select> </mapper>
这里有出现了一个新的属性
resultType
,这个属性用于指定结果集的类型,就是我们返回的类型。要是方法中有返回值,这里就要注明。 -
测试类中编写测试程序检验一下
@Test public void test01() throws Exception { //用SqlSession创建dao接口的代理对象 UserDao dao = session.getMapper(UserDao.class); //用代理对象来调用查询所有方法 List<User> all = dao.findAll(); for (User user : all) { System.out.println(user); } }
-
-
根据id查询一条数据
-
持久层接口中编写查询所有的方法
public interface UserDao { //根据id查询用户 User findById(int id); }
-
在接口的映射配置文件中配置
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--根据id查询所有--> <select id="findById" resultType="com.wang.pojo.User" parameterType="int"> select * from user where id = #{id} </select> </mapper>
-
测试类中编写测试程序检验一下
@Test public void test02(){ UserDao dao = session.getMapper(UserDao.class); User user = dao.findById(1); System.out.println(user); }
-
-
模糊查询
-
持久层接口中编写查询所有的方法
public interface UserDao { //根据用户名来模糊查询 List<User> findByname(String name); }
-
在接口的映射配置文件中配置
第一种:
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--对用户名进行模糊查询--> <select id="findByname" parameterType="string" resultType="com.wang.pojo.User"> select * from user where username like '%${value}%' </select> </mapper>
这是第一种写法,
'%${value}%'
,这又是本博客中第一次出现的新的知识点,这里就简单介绍一下,${}
表示的是拼接sql串,在这里就是将parameterType传入的参数拼接在sql中且不进行jdbc类型转换,这里特别强调一下:如果parameterType传入的是单个简单类型值,${ }
中只能写value
,这又是我这里为什么写的是value了。这个对应的下面的测试第一种
第二种:
<?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"> <mapper namespace="com.wang.dao.UserDao"> <!--对用户名进行模糊查询--> <select id="findByname" parameterType="string" resultType="com.wang.pojo.User"> select * from user where username like #{username} </select> </mapper>
这是站位符的方式,对应的测试是下面的第二种
-
测试类中编写测试程序检验一下
第一种:
@Test public void test06(){ UserDao dao = session.getMapper(UserDao.class); List<User> list = dao.findByname("泰"); for (User user : list) { System.out.println(user); } }
第二种:
@Test public void test06(){ UserDao dao = session.getMapper(UserDao.class); List<User> list = dao.findByname("%泰%"); for (User user : list) { System.out.println(user); } }
-
总结:上面的是使用MyBatis的dao代理方式写单表的CRUD,后面我会更新多表的操作,觉得有帮助的给个关注+点赞。