mybatis代理模式入门
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
最大的特点是:动态sql语句,缓存技术。(替代hibernate框架)。
-
mybatis两种开发模式
- 编写Dao接口和Dao实现类的传统开发对于这种开发方式: 是直接使用SqlSession提供的方法,通过传递statementId和params来操作数据库,完成与数据库的交互。但是这种方式不符合面向接口编程的特性,所以就有了后面的Mapper接口代理这种开发方式。
- mapper代理方式,只编写Dao接口,不编写Dao实现类,具体实现类写在mapper.xml映射文件里面:
-
今天具体写一下mybatis代理模式入门
-
具体实现步骤
-
maven环境下新建项目
-
配置pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.kgc</groupId> <artifactId>mybatisDate7_1</artifactId> <version>1.0-SNAPSHOT</version> <name>mybatisDate7_1</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
- 创建pojo实体类(实体类一定要有无参构造,否则mybatis代理无法创建对象)
package cn.kgc.pojo; /** *@author 李阳 *@date 2019/7/1 16:30 *@className User */ public class User { private long id; private String username; private String password; private long age; private String sex; private String address; //一定要给无参构造否则代理模式无法创建对象 public User() { } public User( String username, String password, long age, String sex, String address) { this.username = username; this.password = password; this.age = age; this.sex = sex; this.address = address; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public long getAge() { return age; } public void setAge(long age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", age=" + age + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
- 编写dao接口
package cn.kgc.dao; import cn.kgc.pojo.User; import java.util.List; /** * @author liyang * @create 2019/7/1 15:20 */ public interface UserDao { public List<User> findAll(); public void insertUser(User user); public User selectUserById(Integer id); public void updateUser(User user); public void deleteUser(Integer id); }
- jdbc配置文件jdbc.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/kgcnews username=root password=root
- 核心配置文件SqlMapperConfig.xml(注:类别名映射 <typeAliases type="cn.kgc.domai User" alias=User">
包的映射 引入包中所有的pojo 类型 配置别名 :简单类名 不区分大小写)<?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> <typeAliases> <package name="cn.kgc.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/kgc/dao/UserMapper.xml"/> </mappers> </configuration>
- 创建xxxMapper.xml(注: namespace值是dao接口全类名,id为接口方法名,resultType为类名不区分大小写
<?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="cn.kgc.dao.UserDao"> <select id="findAll" resultType="User"> select * from kgcnews.user </select> <select id="selectUserById" parameterType="int" resultType="User"> select * from kgcnews.user where id=#{value} </select> <insert id="insertUser" parameterType="User"> insert into kgcnews.user values (null, #{username} ,#{password} , #{age} , #{sex} , #{address} ); </insert> <update id="updateUser" parameterType="User"> UPDATE kgcnews.user SET username = #{username}, password = #{password}, age = #{age}, sex = #{sex}, address = #{address} where id = #{id} ; </update> <delete id="deleteUser" parameterType="int"> delete from kgcnews.user where id=#{value} </delete> </mapper>
- 编写测试类
package cn.kgc; import cn.kgc.dao.UserDao; import cn.kgc.pojo.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import java.util.List; /** * @author liyang * @create 2019/7/1 15:50 */ public class TestUserDao { private SqlSessionFactory sqlSessionFactory; @Before public void init() { sqlSessionFactory = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("SqlMapperConfig.xml")); } @Test public void testFindAll() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> usersList = mapper.findAll(); for (User user : usersList) { System.out.println(user); } } @Test public void testInsertUser() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); User user = new User("张飞", "aaaaa", 43, "男", "阉人"); mapper.insertUser(user); sqlSession.commit(); } @Test public void testSelectUserById() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); User user = new User(); user = mapper.selectUserById(5); System.out.println(user); } @Test public void testUpdateUser() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); User user = new User("张飞", "aaaaa", 43, "男", "燕人"); user.setId(5); mapper.updateUser(user); sqlSession.commit(); } @Test public void testDeleteUser() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.deleteUser(5); sqlSession.commit(); } }
目录结构
-