Java之MyBatis的Dao方式以及Dao动态代理详解
MyBatis简介以及入门参见以下文章
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>class="lazy" data-src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<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 {
List<User> selectUserList(User user);
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 {
@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(){
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 {
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 {
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();
}
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341