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包
包结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端