MyBatis整合Spring,DAO开发(传统DAO&动态代理DAO)

整合思路:

1.SQLSessionFactory对象应该放到Spring中作为单例存在

2.传统dao开发方式中,应该从Spring容器中获得SqlSession对象

3.Mapper代理行驶中,应该从Spring容器中直接获得Mapper的代理对象

4.数据库的连接以及数据库连接池事务管理交给Spring容器来完成

  

 

整合步骤:

  • 创建工程,导入jar包
  • 创建mybatis的配置文件sqlmapConfig.xml
  • 编写Sring配置文件
  •                      数据库连接以及连接池
  •                      sqlSessionFactory对象,配置到Spring容器中
  •                      Spring配置文件 applicaitonContext.xml
  • jdbc.properties
  • 日志记录log4j.properties

 

Dao开发:传统DAO与动态代理DAO

传统Dao开发:

创建user.xml,并在sqlSessionConfig中配置加载

复制代码
<?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:命名空间,用于隔离sql语句,后继有重要作用 #{}:占位符,相当于jdbc的?? -->
<mapper namespace="user">

    <!-- id:sql id, 语句的唯一标识 parameterType:入参数据类型 resultType:返回结果的数据类型 -->
    <select id="getUserById" parameterType="int" resultType="com.mybaits03.pojo.User">
        SELECT *
        FROM `user` WHERE id = #{id2};
    </select>

    <!-- 模糊查询用户,结果为集合,设置resultType为pojo路径即可 -->
    <select id="getUserByUserName" parameterType="String"
        resultType="com.mybaits03.pojo.User">
        SELECT
        `id`,
        `username`,
        `birthday`,
        `sex`,
        `address`
        FROM
        `user`
        <!-- WHERE username LIKE #{name}; -->
        WHERE username LIKE '%${value}%';
    </select>
    
    <!-- 插入用户,如果用户id为自增,则删去id.入参为user pojo -->
    <insert id="insertUser" parameterType="com.mybaits03.pojo.User" useGeneratedKeys="true" keyProperty="id" >
    <!-- 
       selectKey:主键返回
       keyProperty:user中的主键属性
       resultType:主键的数据类型
       order:指定selectKey何时执行(在插入语句之前还是之后设置属性) 
     -->
        INSERT INTO `user` (
        `username`,
        `birthday`,
        `sex`,
        `address`,
        `uuid2`
        )
        VALUES
        (
        #{username},
        #{birthday},
        #{sex},
        #{address},
        #{uuid2}
        );
    </insert>
</mapper>
复制代码

 

创建UserDao接口

创建UserDaoImpl,继承SqlSessionDaoSupport

复制代码
package com.mybaits03.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.mybaits03.dao.UserDao;
import com.mybaits03.pojo.User;

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

    @Override
    public User getUserById(Integer id) {
        SqlSession sqlSession = super.getSqlSession();
        User user = sqlSession.selectOne("user.getUserById", id);
        //不能关闭,由Spring管理
        return user;
    }

    @Override
    public List<User> getUserByUsername(String username) {
        SqlSession sqlSession = super.getSqlSession();
        List<User> list = sqlSession.selectList("user.getUserByUsername", username);
        return list;
    }

    @Override
    public void insertUser(User user) {
        SqlSession sqlSession = super.getSqlSession();
        sqlSession.insert("user.insertUser",user);
    }

}
复制代码

单元测试:

复制代码
package com.mybaits03.test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mybaits03.dao.UserDao;
import com.mybaits03.pojo.User;

public class UserDaoTest {
   
    private ApplicationContext applicaitonContext;
    
    @Before
    public void init() {
        applicaitonContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    }
    
    @Test
    public void testGetUserById() {
        UserDao userDao = applicaitonContext.getBean(UserDao.class);
        User user = userDao.getUserById(1);
        System.out.println(user);
    }

    @Test
    public void testGetUserByUsername() {
          
    }

    @Test
    public void testInsertUser() {

    }

}
复制代码

 

动态代理DAO:

UserMapper.java

复制代码
package com.mybaits03.mapper;

import java.util.List;

import com.mybaits03.pojo.User;



public interface UserMapper {
    /**
     *  根据用户ID查询用户信息
     * @param id
     * @return
     */
     User getUserById(Integer id);

     /**
      * 根据用户名查找用户列表
      * @param username
      * @return
      */
     List<User> getUserByUsername(String username);

     /**
      * 添加用户
      * @param user
      */
     void insertUser(User user);

}
复制代码

 

UserMapper.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">

 <mapper namespace="com.mybaits03.mapper.UserMapper">
        <!-- id: sql id
             parameterType:入参类型
             resultMap:返回结果的数据类型
            #{}:占位符号,相当于jdbc 的  ?
            ${}:字符串拼接指令,如果入参为普通数据类型{}内部只写value
         -->
         
         <!-- sql片段的抽取定义 -->
         <sql id="user_sql">
                `id`,
                `username`,
                `birthday`,
                `sex`,
                `address`
         </sql>
         
         <select id="getUserById" parameterType="int" resultType="User">
               select 
               <!-- sql片段的使用  refid: 引用调用好的sql id -->
               <include refid="user_sql"></include> 
               from user where id = #{id}
         </select>
         
         <select id="getUserByUsername" parameterType="string" resultType="user">
               select * from user where username like '%${value}%'
         </select>

         <!-- keyProperty:主键 -->
         <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
                 insert into user (username,birthday,sex,address,uuid2) 
                 values (#{username},#{birthday},#{sex},#{address},#{uuid2})
         </insert>
         
        
 </mapper>
复制代码

 

编写Sring配置文件

  • 数据库连接以及连接池
  • sqlSessionFactory对象,配置到Spring容器中
  • Dao,传统、动态代理
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

   <!-- 加载配置文件 -->
   <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${name}" />
        <property name="password" value="${password}" />
        <!-- 连接池的最大数据库连接数 -->
        <property name="maxActive" value="10" />
        <!-- 最大空闲数 -->
        <property name="maxIdle" value="5" />
    </bean>
    
    <!--SqlSessionFactory配置  -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 数据库连接池,加载mybatis核心配置文件,配置别名包扫描 -->
      <property name="dataSource" ref="dataSource"/>
      <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
      <property name="typeAliasesPackage" value="com.mybaits03.pojo"/>      
    </bean>
    
    <!-- 传统Dao配置 -->
    <bean class="com.mybaits03.dao.impl.UserDaoImpl">
    <!-- 注入sqlSessionFactory -->
       <property name="sqlSessionFactory"  ref="sqlSessionFactory"/>
    </bean>
    
    <!-- 动态代理第一种方式:配置单个接口 -->
    <!-- <bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">
     <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
    配置一个接口
    <bean  parent="baseMapper">
      <property name="mapperInterface" value="com.mybaits03.mapper.UserMapper" />
    </bean> -->
    
    <!-- 动态代理第二种方式:包扫描 -->  
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <property name="basePackage" value="com.mybaits03.mapper" />
    </bean>
</beans>
复制代码

 

 jar包

 

包结构

 

posted @   IslandZzzz  阅读(646)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示