mybatis开发Dao

简介: 参考文献:https://blog.csdn.net/u013036274/article/details/55668317原始dao方式需要写dao接口和dao实现类。

参考文献:https://blog.csdn.net/u013036274/article/details/55668317

原始dao方式

需要写dao接口和dao实现类。

  • 创建dao接口:UserDao.java
package cn.itcast.mybatis.dao;
import cn.itcast.mybatis.po.Employee;
public interface UserDao {
    public Employee findUserById(int id) throws Exception;
    public void insertUser(Employee employee) throws Exception;
    public void deleteUser(int id) throws Exception;
}
  • 创建dao实现类:UserDaoImpl.java
package cn.itcast.mybatis.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.itcast.mybatis.po.Employee;
public class UserDaoImpl implements UserDao{
    private SqlSessionFactory sqlSessionFactory;
    public  UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    @Override
    public Employee findUserById(int id) throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        Employee employee = sqlSession.selectOne("test.findUserById",id);
        sqlSession.close();
        return employee;
    }
    @Override
    public void insertUser(Employee employee) throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        sqlSession.insert("test.insertUser",employee);
        sqlSession.commit();
        sqlSession.close(); 
    }
    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        sqlSession.delete("test.deleteUser",id);
        sqlSession.commit();
        sqlSession.close(); 
    }
}
  • 测试方法:
package cn.itcast.mybatis.dao;
import static org.junit.Assert.*;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.Employee;
public class UserDaoImplTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception{
        String resource="SqlMapConfig.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test() throws Exception {
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        Employee employee = userDao.findUserById(3);
        System.out.println(employee);
    }
}

缺点:

接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来。
另外调用SqlSession方法时,将Statement的id硬编码了。
调用SqlSession方法时,传入的变量,由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于开发。

mapper代理方法

  • xml映射文件 (UserMapper.xml)
    ①在mapper.xml中namespace等于mapper接口地址
    ②mapper.java接口中的方法名和mapper.xml中的Statement的id一致
    ③mapper.java接口中的方法输入参数类型和mapper.xml中Statement的parameterType指定类型一致
    ④mapper.java接口中的方法返回值类型和mapper.xml中Statement的resultType指定的类型一致
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
     <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.Employee">
         select id,username,sex,address from users where id=#{id};
     </select>
  • mapper接口,相当于dao接口(UserMapper.java)
package cn.itcast.mybatis.mapper;
import cn.itcast.mybatis.po.Employee;
public interface UserMapper {
    public Employee findUserById(int id) throws Exception;
        public java.util.List<Employee> findUserByName(String name) throws Exception;
    public void insertUser(Employee employee ) throws Exception;
    public void deleteUser(int id) throws Exception;

}
  • 还需在SqlMapConfig.xml加载映射文件
<mapper resource="mapper/UserMapper.xml"/>
  • 测试文件
package cn.itcast.mybatis.mapper;
import static org.junit.Assert.*;
import java.io.InputStream;
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.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.Employee;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception{
        String resource="SqlMapConfig.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test() throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Employee employee =userMapper.findUserById(2);
        System.out.println(employee);
    }
        @Test
    public void test1() throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        java.util.List<Employee> list =userMapper.findUserByName("zhao");
        sqlSession.close();
        System.out.println(list);
    }
}

通过调用单独的文件连接数据库

  • SqlMapConfig.xml
<properties resource="db.properties"></properties>
<environments default="development">  
<environment id="development">
 <transactionManager type="JDBC"/> 
 <dataSource type="POOLED">
 <property name="driver" value="${jdbc.driver}"/> 
 <property name="url" value="${jdbc.url}"/> 
 <property name="username" value="${jdbc.username}"/> 
 <property name="password" value="${jdbc.password}"/> 
 </dataSource>
 </environment>
</environments> 
  • db.properties(和SqlMapConfig.xml在同一目录下)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=

pojo包装类型实现

  • UserMapper.xml(定义用户信息综合查询,查询条件复杂)
 <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.EmployeeCustom">
         select id,username,sex,address from users where sex= #{employeeCustom.sex} and username like '%${employeeCustom.username}%';
     </select>
  • UserQueryVo.java(包装对象)
package cn.itcast.mybatis.po;
public class UserQueryVo {
    private EmployeeCustom employeeCustom;
    public EmployeeCustom getEmployeeCustom() {
        return employeeCustom;
    }
    public void setEmployeeCustom(EmployeeCustom employeeCustom) {
        this.employeeCustom = employeeCustom;
    }
}
  • EmployeeCustom.java
package cn.itcast.mybatis.po;
public class EmployeeCustom extends Employee{   
}
  • 测试文件
@Test
    public void test1() throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                //创建包装对象,设置查询条件
        UserQueryVo userQueryVo= new UserQueryVo();
        EmployeeCustom employeeCustom=new EmployeeCustom();
        employeeCustom.setSex("nv");
        employeeCustom.setUsername("zhou");
        userQueryVo.setEmployeeCustom(employeeCustom);
               //调用userMapper的方法
        java.util.List<EmployeeCustom> list =userMapper.findUserList(userQueryVo);
        sqlSession.close(); 
        System.out.println(list);
    }

动态sql判断

  • UserMapper.xml(判断传入的sex和username是否为空,若是空则不进行拼接)
 <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.EmployeeCustom">
         select id,username,sex,address from users 
         <where>
              <if test="employeeCustom!=null">
                 <if test="employeeCustom.sex!=null and employeeCustom.sex!=''">
                      and sex= #{employeeCustom.sex}
                 </if>
                 <if test="employeeCustom.username!=null and employeeCustom.username!=''">
                       and username like '%${employeeCustom.username}%';
                 </if>
               </if>
         </where>  
          
     </select>
  • 测试文件
@Test
    public void test1() throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserQueryVo userQueryVo= new UserQueryVo();
        EmployeeCustom employeeCustom=new EmployeeCustom();
        //employeeCustom.setSex("nv");//注释此句后,查询语句中没有sex这个条件
        employeeCustom.setUsername("zhou");
        userQueryVo.setEmployeeCustom(employeeCustom);
        java.util.List<EmployeeCustom> list =userMapper.findUserList(userQueryVo);
        sqlSession.close(); 
        System.out.println(list);
    }

** 进行select * from users where id=1 or id=10 or id=11 ;**

  • 在上面的UserMapper.xml中添加
<if test="ids!=null">
                 <!-- collection:指定输入对象中集合属性 item:每个遍历生成对象中 open:开始遍历时拼接串 
                 close:结束遍历时拼接的串 separator:遍历两个对象须拼接的串
                                实现拼接 AND (id=1 or id=10 or id=13) -->
                 <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
                      id=#{user_id}
                 </foreach>
  • 测试文件
@Test
    public void test1() throws Exception {
        SqlSession sqlSession =sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserQueryVo userQueryVo= new UserQueryVo();
        EmployeeCustom employeeCustom=new EmployeeCustom();
        //employeeCustom.setSex("nv");
        employeeCustom.setUsername("zhou");
        java.util.List<Integer> ids =new ArrayList<Integer>();
        ids.add(1);
        ids.add(10);
        ids.add(14);
        userQueryVo.setIds(ids);
        userQueryVo.setEmployeeCustom(employeeCustom);
        java.util.List<EmployeeCustom> list =userMapper.findUserList(userQueryVo);
        sqlSession.close(); 
        System.out.println(list);
    }
目录
相关文章
|
8天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
23天前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
54 0
|
1月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
2月前
|
Java 数据库连接 mybatis
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
|
3月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
57 3
|
3月前
|
Java 数据库连接 API
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
49 3
|
3月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
56 2
|
3月前
|
SQL Java 数据库连接
Mybatis如何使用mapper代理开发
Mybatis如何使用mapper代理开发
|
3月前
|
存储 Java 数据库连接
SSMP整合案例第三步 业务层service开发及基于Mybatis的接口功能拓展
SSMP整合案例第三步 业务层service开发及基于Mybatis的接口功能拓展
27 0
|
4月前
|
SQL Java 关系型数据库
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
53 2