Java--MyBatis的Dao方式以及Dao动态代理
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--MyBatis的Dao方式以及Dao动态代理相关的知识,希望对你有一定的参考价值。
MyBatis简介以及入门参见博文
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();
以上是关于Java--MyBatis的Dao方式以及Dao动态代理的主要内容,如果未能解决你的问题,请参考以下文章