MyBatis 专栏 - 进阶 (引入外部配置文件, 类型参数设置)
发布于: 2021 年 02 月 05 日

01.引入外部 properties 文件
1, 创建外部配置文件
在工程的 resources 目录下面创建关于数据库信息的 jdbc.properties 文件, 内容如下
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8jdbc.username=rootjdbc.password=root复制代码
2, 在主配置文件中引入文件
这里引入的是上面刚刚创建的 jdbc.properties 文件
主配置文件: SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 引入外部配置文件 --> <properties resource="jdbc.properties"></properties> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <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>
<mappers> <mapper resource="com/nengli51/UserDao.xml"></mapper> </mappers></configuration>复制代码
3. 测试
略(使用上一节编写的代码能够正常操作数据库)
02.设置类型别名
第一种方式: 单个定义
主配置文件: SqlMapConfig.xml
<!-- 进阶02.设置类型别名 --> <typeAliases> <typeAlias type="com.nengli51.pojo.User" alias="user"></typeAlias> </typeAliases>复制代码
Mapper 配置文件: resources/com/nengli51/UserDao.xml 文件
<mapper namespace="com.nengli51.dao.UserDao"> <!-- 进阶2: 在主配置文件设置的类型别名, 于是在当前文件可以简写作为替换 --> <select id="findUser" resultType="user" parameterType="int"> select * from user where uid = #{id}; </select> <select id="findAll" resultType="user"> select * from user </select>
<insert id="addUser" parameterType="user"> insert into user values (null, #{username}, #{sex}, #{birthday}, #{address}) </insert>
<delete id="deleteUser" parameterType="int"> delete from user where uid = #{uid} </delete>
<update id="updateUser" parameterType="user"> update user set username=#{username}, sex=#{sex}, birthday=#{birthday}, address=#{address} where uid = #{uid} </update></mapper>复制代码
第二种方式: 指定文件或者指定路径
原理: 设置 package 为别名, 则该 package 目录下的类型文件都可以被直接缩写使用
<mappers> <!-- 方式一:引入映射文件路径 --><!-- <mapper resource="com/nengli51/dao/UserDao.xml"></mapper>--> <!-- 方式二:扫描接口 单个Mapper配置文件制定--><!-- <mapper class="com.nengli51.dao.UserDao"></mapper>--> <!-- 方式三:扫描接口 批量Mapper配置文件制定--> <package name="com.nengli51.dao"/> </mappers>复制代码
03.抽取 SQLSessionFactory 为单例
package com.nengli51.utils;
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 java.io.IOException;import java.io.InputStream;
/** * @Date 2021/2/5 */public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null; static{ InputStream is = null; try { SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); is = Resources.getResourceAsStream("SqlMapConfig.xml"); sqlSessionFactory = sqlSessionFactoryBuilder.build(is); } catch (IOException e) { e.printStackTrace(); }finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } }
/** * 获取SqlSessionFactory */ public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; }
/** * 提交事务, 关闭SqlSession */
public static void commitAndClose(SqlSession sqlSession){ sqlSession.commit(); sqlSession.close(); }
public static void rollbackAndClose(SqlSession sqlSession){ sqlSession.rollback(); sqlSession.close(); }}复制代码
测试使用
@Testpublic void testSingleInstance(){ SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> all = userDao.findAll(); for (User user : all) { System.out.println(user); } MyBatisUtils.commitAndClose(sqlSession);}复制代码
04.parameterType 深入
1, SQL 语句需要一个参数: 使用简单数据类型参数
2, 多个参数: (1), 使用对象封装;(2), 使用 map 类型;(3), 如果参数复杂, 可以使用对象封装对象.
创建代表查询参数的 Bean
package com.nengli51.pojo;
import lombok.Data;
/** * @Date 2021/2/5 */@Datapublic class QueryBean { private int id;}复制代码
创建 Dao
package com.nengli51.dao;
import com.nengli51.pojo.QueryBean;import com.nengli51.pojo.User;
public interface UserDao2 { User findUser(QueryBean queryBean);}复制代码
创建配置文件
<?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.nengli51.dao.UserDao2"> <!-- 测试Parameter类型:2, 对象作为参数类型 --> <select id="findUser" resultType="user" parameterType="com.nengli51.pojo.QueryBean"> select * from user where uid = #{id}; </select></mapper>复制代码
修改核心配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 进阶01.引入外部配置文件 --> <properties resource="jdbc.properties"></properties> <!-- 进阶02.设置类型别名 --> <typeAliases> <!-- 方式1: 单个类型定义 <typeAlias type="com.nengli51.pojo.User" alias="user"></typeAlias> --> <!-- 方式2: 批量定义类型别名 --> <package name="com.nengli51.pojo"></package> </typeAliases> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <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>
<mappers> <!-- 方式一:引入映射文件路径 --><!-- <mapper resource="com/nengli51/dao/UserDao.xml"></mapper>--> <!-- 方式二:扫描接口 单个Mapper配置文件制定--><!-- <mapper class="com.nengli51.dao.UserDao"></mapper>--> <!-- 方式三:扫描接口 批量Mapper配置文件制定--> <package name="com.nengli51.dao"/> </mappers></configuration>复制代码
测试
package com.nengli51;
import com.nengli51.dao.UserDao2;import com.nengli51.pojo.QueryBean;import com.nengli51.pojo.User;import com.nengli51.utils.MyBatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Test;
/** * @Date 2021/2/5 */public class TestMybatisDemo3 { @Test public void testMethod(){
SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(); UserDao2 userDao = sqlSession.getMapper(UserDao2.class); QueryBean queryBean = new QueryBean();
queryBean.setId(1); User user = userDao.findUser(queryBean); System.out.println(user); }}复制代码
划线
评论
复制
发布于: 2021 年 02 月 05 日阅读数: 28
版权声明: 本文为 InfoQ 作者【小马哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/a41033550c6b005ab7f8e2416】。文章转载请联系作者。
小马哥
关注
自强不息,厚德载物 2018.12.22 加入
像一棵竹子那样, 不断的扎根积累, 活出节节高的人生!











评论