spring整合mybatis 代理开发方式(重点掌握)
项目结构图:
1.导入依赖和过滤静态资源
<dependencies>
<!--junit测试类-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- c3p0依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!--spring操作数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.12</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--mybatis和spring集成的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--spring事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.9</version>
</dependency>
<!--阿里的连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.12</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- AOP-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
<!--过滤静态资源 解决以下问题:
没有把xml放到resource目录下边。idea 的maven项目不会加载非resource目录下边的xml文件。-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2.导入jdbc.properties 和 log4j.properties 在resources 目录下,编写mybatis和spring-mybatis的配置文件
jdbc.properties
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/tangshi?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.userName = root
passWord = 123456
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
myabtis-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>
<typeAliases>
<typeAlias type="com.hao.pojo.User" alias="User"/>
</typeAliases>
</configuration>
spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--
读取 jdbc.properties 中的内容 property-placeholder: 占位符
location: 属性文件的位置
-->
<context:property-placeholder location="jdbc.properties"/>
<!-- 1) 获得数据库连接池对象,并交由 spring 同一管理 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据库连接 -->
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${jdbc.userName}"/>
<property name="password" value="${passWord}" />
</bean>
<!-- 2) 获取 SqlSessionFactory 对象,并交由 spring 管理-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入连接池,给 sqlsessionFactory 的属性 dataSource 赋值,ref="引用该 spring容器
中的另一个 bean的id"-->
<property name="dataSource" ref="dataSource"/>
<!-- 别名包扫描 -->
<property name="typeAliasesPackage" value="com.hao.pojo" />
<!-- 注入 映射文件 mapper
给 sqlsessionFactory 的属性 mapperLocation 赋值
value="映射文件 XXXmapper.xml 的相对路径" -->
<property name="mapperLocations" value="classpath:com/hao/mapper/*.xml"/> <!--接口与xml在同一包-->
<property name="configLocation" value="classpath:mybatis-config.xml"/> <!--接口与xml在不同包-->
</bean>
<!--3. 扫描mapping文件对应dao文件所在的包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
<property name="basePackage" value="com.hao.mapper" />
</bean>
</beans>
3.编写实体类 User.java 实体类属性尽量与数据库表中列明相同(不同也没关系,可以在mapper映射文件中设置)
package com.hao.pojo;
public class User {
private Integer id;
private String name;
private String upwd;
private String phone;
private String email;
private Integer age;
private Integer status;
private Integer classNo;
public User() {
}
public User(Integer id, String name, String upwd, String phone,
String email, Integer age, Integer status, Integer classNo) {
this.id = id;
this.name = name;
this.upwd = upwd;
this.phone = phone;
this.email = email;
this.age = age;
this.status = status;
this.classNo = classNo;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", upwd='" + upwd + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", age=" + age +
", status=" + status +
", classNo=" + classNo +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public String getupwd() {
return upwd;
}
public void setupwd(String upwd) {
this.upwd = upwd;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getClassNo() {
return classNo;
}
public void setClassNo(Integer classNo) {
this.classNo = classNo;
}
}
4.接口类USerMapper.java 在接口中编写方法
public interface UserMapper {
List<User> findAllUser(); //查询全部用户
}
5.接口映射文件 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">
<!-- namespace 对应dao接口全称:包名+类名 -->
<mapper namespace="com.hao.mapper.UserMapper">
<!-- 属性名与列名不一致的解决办法 column 数据库列名 properrty 类里的属性名 -->
<resultMap type="User" id="user">
<result property="name" column="uname" javaType="String"></result>
</resultMap>
<!--查询全部用户-->
<select id="findAllUser" resultMap="user">
select *
from t_user;
</select>
</mapper>
6.测试
package com.hao.test;
import com.hao.mapper.UserMapper;
import com.hao.pojo.User;
import lombok.extern.log4j.Log4j;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.HashMap;
import java.util.List;
@Log4j
public class MyTest {
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
UserMapper um = context.getBean( UserMapper.class);
log.debug("开始执行SQL语句!");
//全部用户
List<User> list = um.findAllUser();
for (User user : list) {
System.out.println(user);
}
}
}