MyBatis 专栏 - 进阶 (引入外部配置文件, 类型参数设置)
发布于: 2021 年 02 月 05 日
01.引入外部 properties 文件
1, 创建外部配置文件
在工程的 resources 目录下面创建关于数据库信息的 jdbc.properties 文件, 内容如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.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();
}
}
复制代码
测试使用
@Test
public 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
*/
@Data
public 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 加入
像一棵竹子那样, 不断的扎根积累, 活出节节高的人生!
评论