mybatis 单框架实现数据库查询
1 准备工作
1.1 导入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<!--测试的范围 只能在test模块使用 单元测试必须要用4以上的版本-->
<scope>test</scope>
</dependency>
<!--加载日志的信息 log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
1.2 配置java文件夹和resource资源文件夹都能输出到target目录中
<build>
<!--配置xml文件能够编译输出到target java和resources文件夹都配置-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<!--**任意目录及其子目录 **任意文件-->
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<!--**任意目录及其子目录 **任意文件-->
<include>**/**</include>
</includes>
</resource>
</resources>
</build>
1.3 创建需要查询的实体类(全部引用数据类型)
package entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
//属性必须是引用数据类型 数据库Null值 动态sql都是判断属性是否为空
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private String hiredate;
private Double sal;
private Double comm;
private Integer deptno;
}
1.4 在resource资源文件夹下面创建jdbc.properties文件
# key-value 形式的文件 注意:笔者使用的mysql8版本的数据库
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/数据库名称
jdbc.username=账户
jdbc.password=密码
1.5 在resource资源文件夹下创建log4j.properties文件
#代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。
log4j.rootLogger=DEBUG,Console,D
#代表配置控制台的类。
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/mybatis.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
1.6 在resource资源文件夹下面创建mybatis-config.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>
<!--引入jdbc配置文件 引入文件后就能调用里面的值了-->
<properties resource="jdbc.properties"></properties>
<!--以类名作为别名 都是.的形式 让resultType写的短一些-->
<typeAliases>
<package name="entity"/>
</typeAliases>
<!--环境选择 default是谁 就选谁,只能选择一个-->
<environments default="mysql">
<!--多种环境之一 上面的id要与default里面的值要保持一致-->
<environment id="mysql">
<!--事物管理器 JDBC 使用JDBC管理事务(事物提交是自动的)
MANAGED Spring容器去提交-->
<transactionManager type="JDBC"/>
<!--dataSource数据源 连接数据库的对象
unPooled是没有连接池的
POOLED是连接池的 pool游泳
JNDi外部容器管理连接-->
<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>
<!--加载mapper文件-->
<mappers>
<!-- <mapper resource="mapper/EmpMapper.xml"/>-->
<!--扫描mapper接口的 该方式接口必须与mapper.xml文件名完全一致 且同一目录-->
<package name="mapper"/>
</mappers>
</configuration>
注意: mybatis-config.xml文件中导入jdbc.properties文件的指令
<!--引入jdbc配置文件 引入文件后就能调用里面的值了-->
<properties resource="jdbc.properties"></properties>
<!--若有多级目录,resource里面可以写成目录路径/文件名 如temp/jdbc.properties-->
1.7 创建SqlSessionFactoryFactory工具类
package util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class SqlSessionFactoryUtil {
/*加载主配置文件*/
private static String resource = "mybatis-config.xml";
/*定义在外面*/
private static SqlSessionFactory sf=null;
static {
/*加载主配置文件 得到SqlSessionFactory对象
* 该对象是一个连接工厂对象
* */
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sf = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory sf(){
return sf;
}
}
1.8 创建EmpMapper接口和EmpMapper.xml文件
1.9 主配置文件引入其他配置文件(扫描该配置文件的根目录)
<!--加载mapper文件 mappeer是EmpMapper.xml文件的根目录-->
<mappers>
<package name="mapper"/>
</mappers>
2 查询全部
2.1 在EmpMapper接口中的方法名
List<Emp> findAll();
2.2 在EmpMapper.xml中准备的sql语句
<select id="findAll" resultType="entity.Emp">
select * from emp
</select>
2.3 在test文件夹下写的测试代码
public void t1(){
//连接工厂
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
List<Emp> all = em.findAll();
for (Emp emp : all) {
System.out.println(emp);
}
sqlSession.close();
}
2.4 查询结果
2.5 知识点总结
接口里面的方法名必须与xml中select标签中的id值保持一致,不然查询的时候就会报错
select标签中必须要有id和resultType,其resultType是查询结果的返回类型,不支持多表多字段查询
3 带条件查询
3.1 在EmpMapper接口中的方法名
Emp findById(int id);
3.2 在EmpMapper.xml中准备的sql语句
<select id="findById" resultType="emp">
select * from emp WHERE empno=#{id}
</select>
3.3 在test文件夹下写的测试代码
@org.junit.Test
public void t2(){
//连接工厂
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
Emp byId = em.findById(7369);
System.out.println(byId);
sqlSession.close();
}
3.4 查询结果
3.5 知识点总结
<!--#{}等同?占位符 不会出现注入攻击(mybatis中),类似与jdbc中的preparestatement
${} 等同拼接 statement 可能出现注入攻击 一般模糊查询时使用
传入的参数只有一个时 参数名可以任意选 aaaaa和id效果是一样的,但是建议与接口里面定义的形参名保持一致
-->
4 模糊查询
4.1 单参数查询
4.1.1 在EmpMapper接口中的方法名
List<Emp> likeEname(String name);
4.1.2 在EmpMapper.xml中准备的sql语句
<select id="likeEname" resultType="emp">
/*模糊查询两个%拼接在一起*/
select * from emp WHERE ename like '%${
name}%'
</select>
4.1.3 在test文件夹下写的测试代码
public void t2(){
//连接工厂
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
EmpMapper em = sqlSession.getMapper(EmpMapper.class)
//模糊查找
List<Emp> a = em.likeEname("A");
for (Emp emp : a) {
System.out.println(emp);
}
sqlSession.close();
}
4.1.4 查询结果
4.1.5 知识点总结
模糊查找只能用${name}的形式
其是采用'%${模糊查找的值}%'去进行模糊查找的
虽然是一个参数,但是xml文件(mapper文件夹下)中的字段名必须与接口中方法的形参的字段名保持一致
4.2 多参数查询(采用@Para注解的方式)
4.2.1 在EmpMapper接口中的方法名
List<Emp> like(@Param("a")String name, @Param("b")String job);
4.2.2 在EmpMapper.xml中准备的sql语句
<select id="like" resultType="emp">
/*模糊查询两个%拼接在一起*/
select * from emp WHERE ename like '%${a}%' OR job like '%${b}%'
</select>
4.2.3 在test文件夹下写的测试代码
public void t2(){
//连接工厂
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
List<Emp> a = em.like("A","B");
for (Emp emp : a) {
System.out.println(emp);
}
sqlSession.close();
}
4.2.4 查询结果
4.2.5 知识点总结
mybatis有多个参数时,有以下三种方式
/*多个形参
方式一 arg0 表示第一个 arg1 表示第二个
方式二 param1 表示第一个 param2表示第二个
方式三 在接口里面使用注解@para,本次示例里面所采用的就是第三种
*/
转载:https://blog.csdn.net/SSS4362/article/details/127705039
查看评论