Mybatis初探
之前已经用利用mybatis实现链接数据库查询所有用户的信息(用的是在resources下建立和Dao层一样目录的xml实现的)。这次再来看一下增删改查等其它的操作。
利用Mybatis我们可以不用写Dao层的实现类。让代理对象去帮我们去做这件事。
注解的方式:和servlet一样不仅可以通过xml进行配置还可以用注解。下面主要展示注解方式实现。
直接在UserDao接口(不了解文件布局的可以先去看这里:https://www.cnblogs.com/cstdio1/p/11882953.html)下书写Sql语句
在这之前说一下我们测试功能都是建一个类Test在这里面进行单元测试
单元测试:
你必须在pom.xml进行配置才能使用:
查询所有:
单元测试代码:
细心的小伙伴可能已经发现这个测试代码怎么这么短,明明上个用Mybatis要有好几步呢。
其实我们将那几步进行了封装,写在两个函数中,一个用于测试前(Before)调用和一个测试后(After)调用。
用注解@Before和@After
测试前:
测试后:
之后的操作大概也是如此,不想罗嗦了·,还有一点需要说一下。
有些时候传入的参数不是简单类型而是一个类的对象,这个时候我们需要写对应类中的属性(并且通过这个属性可以找到最终查询对象的信息)
最简单的情况就是这个间接类有个属性的类型就是要查找的那个User类型
例如:
上面的user是Query类的一个变量(User类型的)然后通过user可以直接 .username,username是User类的一个属性
Query内部:
执行的SQL语句(占位符方式):
查询结果:
还有一种方式是:
执行的SQL语句(存在SQL注入):
查询结果:
因为Sql'注入问题所以一般就用第一种方式
UserDao源码:
package com.zyb.dao; import com.zyb.pojo.Query; import com.zyb.pojo.User; import org.apache.ibatis.annotations.*; import java.util.List; public interface UserDao { /** * 查询所有用户 * @return */ @Select("select * from my_user") List<User> selAll(); /** * 保存方法 */ @Insert("insert into my_user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})") void saveUser(User user); /** *更新操作 */ @Update("update my_user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}") void updateUser(User user); /** * 通过id删除记录 * @param */ @Delete("delete from my_user where id=#{uid}")//可以不叫uid,随便起名称 void deleUserById(Integer userId); /** * 根据id查询 * @param userId * @return */ @Select("select * from my_user where id=#{uid}")//可以不叫uid,随便起名称 User selById(Integer userId); /** * 根据姓名模糊查询 * @return */ //@Select("select * from my_user where username like #{name}")//这种方式需要在外面加% @Select("select * from my_user where username like '%${value}%' ")//不需要在外面加%,这里变量名必须是value List<User> selByName(String userName); /** * 查询总用户数 * @return */ @Select("select count(id) from my_user")//使用聚合函数 int selUserNums(); /** * 查询最后插入视频的id * @return */ @SelectKey(statement = "select last_insert_id()", keyProperty = "id", keyColumn = "id", before = false, resultType = int.class) int selLastInsertId(); /** * 根据Query的信息查询用户 * @param query * @return */ @Select("select * from my_user where username like #{user.username}") List<User> selByQuery_UserName(Query query); }
测试类源码:
package com.zyb.test; import com.zyb.dao.UserDao; import com.zyb.pojo.Query; import com.zyb.pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import java.io.IOException; import java.io.InputStream; import java.security.PublicKey; import java.util.Date; import java.util.List; public class Test { InputStream in; SqlSession session; UserDao userDao; @Before public void init() throws IOException { //1.读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 session = factory.openSession(); //4.使用SqlSession创建Dao接口的代理对象 userDao = session.getMapper(UserDao.class); } @After public void destory() throws IOException { session.commit(); //6.释放资源 session.close(); in.close(); } /** * 测试查询所有 * @throws IOException */ @org.junit.Test public void testSelAll() throws IOException { //5.使用代理对象执行方法 List<User> users = userDao.selAll(); for(User user : users){ System.out.println(user); } } /** * 测试保存操作 * @throws IOException */ @org.junit.Test public void testSave() throws IOException { User user = new User(); user.setAddress("成都市"); user.setBirthday(new Date()); user.setSex("男"); user.setUsername("zs"); //5.使用代理对象执行方法 userDao.saveUser(user); } /** * 测试更新操作 */ @org.junit.Test public void testUpdate(){ User user = new User(); user.setAddress("成都市"); user.setBirthday(new Date()); user.setSex("女"); user.setUsername("zj"); user.setId(51); userDao.updateUser(user); } /** * 测试删除操作 */ @org.junit.Test public void testDel(){ Integer id = new Integer(51); userDao.deleUserById(id); } @org.junit.Test /** * 测试查询操作 */ public void testSelOne(){ User user=userDao.selById(48); System.out.println(user); } /** * 测试模糊查询 */ @org.junit.Test public void testSelByName(){ List<User> users = userDao.selByName("王"); users.forEach(x-> System.out.println(x)); } /** * 测试总用户数 */ @org.junit.Test public void testSelUserNums(){ System.out.println("用户总数是:"+userDao.selUserNums()); } @org.junit.Test public void testSelByQuery(){ Query query = new Query(); User user = new User(); user.setUsername("%王%");//模糊查询 query.setUser(user); List<User> users=userDao.selByQuery_UserName(query); users.forEach(x-> System.out.println(x)); } }