Java之MyBatis的Dao方式以及Dao动态代理详解
MinggeQingchun 人气:0MyBatis简介以及入门参见以下文章
1、新建一个数据库,以及一张表user
CREATE TABLE `user` ( `user_id` int(10) NOT NULL COMMENT '用户名ID', `user_name` varchar(100) DEFAULT NULL COMMENT '用户名', `email` varchar(80) DEFAULT NULL COMMENT '用户邮箱', `age` int(5) DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、创建maven的普通Java工程,加入maven的mybatis坐标,mysql驱动坐标
其中,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>com.mycompany</groupId> <artifactId>mybatis-1</artifactId> <version>1.0.0</version> <properties> <!-- 项目构建使用的编码,避免中文乱码 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 源码编译 jdk 版本 --> <maven.compiler.source>1.8</maven.compiler.source> <!-- 运行代码的 jdk 版本 --> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- 单元测试依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!-- filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 --> <filtering>false</filtering> </resource> </resources> </build> </project>
3、创建Java实体类User--保存表中的一行数据
package com.mycompany.domain; public class User { private int userId; private String userName; private String email; private int age; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
4、创建持久层的dao接口,定义操作数据库的方法
package com.mycompany.dao; import com.mycompany.domain.User; import java.util.List; public interface UserDao { /** * 查询user列表 * @param user 单个user用户 * @return user的list */ List<User> selectUserList(User user); /** * 插入user * @param user * @return */ int insertUser(User user); }
5、创建一个mybatis使用的配置文件 SQL映射文件
编写SQL语句,一般一个表对应一个SQL映射文件,这个文件就是xml文件
sql映射文件(sql mapper):编写SQL语句,mybatis负责执行这些SQL语句
<?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"> <!-- sql映射文件(sql mapper):编写SQL语句,mybatis负责执行这些SQL语句 1、指定约束文件 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> mybatis-3-mapper.dtd:约束文件名称 2、约束文件作用:限制,检查当前文件中出现的标签,属性必须符合mybatis的要求 3、<mapper>:当前文件根标签(必须的) namespace:命名空间(唯一值,自定义字符串;要求使用dao接口的全限定名称) 全限定类名:就是类名全称,带包路径的用点隔开,如: java.lang.String 即全限定名 = 包名 + 类型 非限定类名也叫短名,就是我们平时说的类名,不带包的,如:String 4、数据库增删改查特定标签 <select>:查询,select语句 <update>:更新,update语句 <insert>:插入,insert语句 <delete>:删除,delete语句 --> <mapper namespace="com.mycompany.dao.UserDao"> <!-- <select>标签:查询操作 id:执行SQL语法的唯一标识,mybatis会根据这个id的值来找到要执行的SQL语句 可以自定义,一般要求使用接口中的方法名称 resultType:表示结果类型,SQL语句执行后得到ResultSet结果集,遍历这个结果集得到的Java对象类型 值写Java对象的全限定名称 --> <select id="selectUserList" resultType="com.mycompany.domain.User"> select user_Id,user_Name,email,age from user order by user_Id asc </select> <!--插入操作,字段名和Java实体类中字段保持一致--> <insert id="insertUser"> insert into user values(#{userId},#{userName},#{email},#{age}) </insert> </mapper>
6、创建mybatis的主配置文件 ,一个项目一个主配置文件
主配置文件提供了数据库的连接信息和SQL映射文件的位置信息
<?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"> <!-- mybatis的主配置文件:主要定义了数据库的配置信息,SQL映射文件的位置 1、约束文件 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> mybatis-3-config.dtd:约束文件名称 2、configuration:根标签 --> <configuration> <!-- settings:mybatis全局行为 --> <settings> <!-- 设置mybatis输出日志 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <!-- 环境配置:数据库的连接信息 default:必须和某个environment的id值一样 告诉mybatis使用哪个数据库的连接信息(访问哪个数据库) --> <environments default="development"> <!-- environment:一个数据库的配置,环境 id:一个唯一值(可自定义,表示环境的名称) --> <environment id="development"> <!-- transactionManaer:mybatis的事务类型 type:JDBC(表示使用JDBC中的Connection对象的commit,rollback做事务处理) --> <transactionManager type="JDBC"/> <!-- dataSource:表示数据源,连接数据库的 type:表述数据源的类型,POOLED表示使用连接池 --> <dataSource type="POOLED"> <!-- driver, user, username, password 是固定的,不能自定义。 --> <!-- 数据库驱动类名 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 连接数据库的URL字符串 --> <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <!-- 访问数据库的用户名 --> <property name="username" value="root"/> <!-- 访问数据库的密码 --> <property name="password" value="123456"/> </dataSource> </environment> <!--表示线上的数据库,是项目真实使用的库--> <environment id="online"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- sql mapper(SQL映射文件)的位置 --> <mappers> <!-- 一个mapper标签指定一个文件的位置 从类路径开始的路径信息(target/classes)类路径 --> <mapper resource="com/mycompany/dao/UserDao.xml"/> </mappers> </configuration>
将SqlSession提取为工具类MyBatisUtil
public class MyBatisUtil { public MyBatisUtil() { } public static SqlSession getSqlSession() throws IOException { String config = "mybatis-config.xml"; InputStream ins = Resources.getResourceAsStream(config); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(ins); SqlSession sqlSession = factory.openSession(); return sqlSession; } }
MyBatis传统Dao方式以及Dao动态代理
创建user表以及maven的Java普通工程,Java实体类,dao持久层接口,SQL映射文件以及主配置文件如上步骤
MyBatis传统Dao方式
7、创建类实现UserDao接口
public class UserDaoImpl implements UserDao { /** * 查询user列表 * @param user 单个user用户 * @return user的list */ @Override public List<User> selectUserList(User user) { List<User> userList = null; try { //获取SqlSession对象 SqlSession sqlSession = MyBatisUtil.getSqlSession(); String sqlId = "com.mycompany.dao.UserDao.selectUserList"; userList = sqlSession.selectList(sqlId); //关闭 sqlSession.close(); } catch (IOException e) { e.printStackTrace(); } return userList; } @Override public int insertUser(User user) { int nums = 0; try { SqlSession sqlSession = MyBatisUtil.getSqlSession(); String sqlId = "com.mycompany.dao.UserDao.insertUser"; nums = sqlSession.insert(sqlId,user); //mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务 sqlSession.commit(); //关闭 sqlSession.close(); } catch (IOException e) { e.printStackTrace(); } return nums; } }
8、创建测试类
public class TestMyBatis { @Test public void testSelectUsers(){ /** * List<User> userList = userDao.selectUserList(null); 调用 * 1、dao对象,UserDao,全限定名称是:com.mycompany.dao.UserDao * 全限定名称 和 namespace 是一样的 * * 2、方法名称, selectUserList * 这个方法就是 mapper文件中的 id值 selectUserList * * 3、通过dao中方法的返回值也可以确定MyBatis要调用的SqlSession的方法 * 如果返回值是List ,调用的是SqlSession.selectList()方法 * 如果返回值 int ,或是非List的, 看mapper文件中的 标签是<insert>,<update> 就会 调用 * SqlSession的insert, update等方法 * * mybatis的动态代理: * mybatis根据 dao的方法调用,获取执行sql语句的信息 * mybatis根据你的dao接口,创建出一个dao接口的实现类, 并创建这个类的对象 * 完成SqlSession调用方法, 访问数据库 */ UserDaoImpl userDao = new UserDaoImpl(); List<User> userList = userDao.selectUserList(null); for (User user:userList){ System.out.println("查询到的用户="+user); } } @Test public void testInsertUser(){ UserDaoImpl userDao = new UserDaoImpl(); User user = new User(); user.setUserId(6); user.setUserName("zhaoyunchang"); user.setEmail("zhaoyunchang@163.com"); user.setAge(18); int nums = userDao.insertUser(user); System.out.println("添加对象的数量:"+nums); } }
MyBatis之Dao动态代理
使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)
getMapper能获取dao接口对于的实现类对象
public class TestMyBatis { @Test public void testSelectUsers(){ try { /** * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口) * getMapper能获取dao接口对于的实现类对象 */ SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); //com.sun.proxy.$Proxy2 : jdk的动态代理 System.out.println("userDao="+userDao.getClass().getName()); //调用dao的方法, 执行数据库的操作 List<User> userList = userDao.selectUserList(null); for(User user: userList){ System.out.println("用户="+user); } } catch (IOException e) { e.printStackTrace(); } } @Test public void testInsertUser(){ try { /** * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口) * getMapper能获取dao接口对于的实现类对象 */ SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); //com.sun.proxy.$Proxy2 : jdk的动态代理 System.out.println("userDao="+userDao.getClass().getName()); //调用dao的方法, 执行数据库的操作 User user = new User(); user.setUserId(7); user.setUserName("zhugeliang"); user.setEmail("zhugeliang@163.com"); user.setAge(18); int nums = userDao.insertUser(user); sqlSession.commit(); System.out.println("添加对象的数量:"+nums); } catch (IOException e) { e.printStackTrace(); } } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容