Mybatis学习笔记(一)
嗷嗷环境统一JDK1.8Mysql5.7maven3.6.1简介什么是mybatisMyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Jav
嗷嗷
环境统一
- JDK1.8
- Mysql5.7
- maven3.6.1
简介
什么是mybatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs->数据持久层对象)
- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。是Apache
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
如何获取Mybatis
-
maven仓库https://mvnrepository.com/artifact/org.mybatis/mybatis
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
-
github下载地址https://github.com/mybatis/mybatis-3
什么是持久化
持久化就是将数据从持久状态到瞬时状态转化的过程
持久层
完成持久化的代码
为什么需要Mybatis
因为传统的JDBC代码很麻烦,我们就有了框架把它简化一下
- 简单易学
- 解除sql与程序代码的耦合
- 提供xml标签
- 提供映射标签
- 使用的人多
第一个Mybatis程序
搭建环境->导入Mybatis->编写代码->测试
搭建环境
创建maven项目,删除src文件夹,导入依赖
mysql、mybatis、junit
创建子模块
创建一个模块(Model),这个 模块就自动成了mybatis的子模块就不用再配置了,爽哦!
配置子模块
官方文档说,MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
也就是说,我们需要在resources文件夹下创建名为mybatis-config.xml的文件
然后根据官方提示(《入门》这一章节),在文件中写入如下配置文件,使用idea打开数据库,方便定位database的url。
在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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
</environments>
<!--记得最后把Mapper配置文件放进来-->
<mappers>
<mapper resource="com/dao/UserMapper.xml"/>
</mappers>
</configuration>
编写工具类
官方介绍了,从 XML 中构建 SqlSessionFactory,从SqlSessionFactory中获取SqlSession,这很麻烦,我们就创建工具类,简化操作
package utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory=null;
static {
try {
//使用Mybatis第一步,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
* SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
* */
public static SqlSession getSqSession(){
return sqlSessionFactory.openSession();
}
}
编写代码
代码目录
-
实体类–>pojo文件夹下
command+n可以打开构造器,Getter、Setter等等
package pojo; public class User { String account; String name; String pwd; String phone; String type; public User() { } public User(String account, String name, String pwd) { this.account = account; this.name = name; this.pwd = pwd; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "User{" + "account='" + account + '\'' + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + ", phone='" + phone + '\'' + ", type='" + type + '\'' + '}'; } }
-
Dao接口–>dao文件夹下
public interface UserDao { List<User> getUserList(); }
-
接口实现类
我们需要建立xml配置文件,告诉SqlSession 和 Mapper 具体执行什么操作,配置文件可以写在任何地方,我就放在dao层了,但是需要在主配置文件添加build ,否则会被过滤,因为默认是放在resources目录下的
注意,命名空间为要绑定的Dao(Mapper)接口,其中id为对应的方法名字
<?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="com.dao.UserDao"> <select id="getUserList" resultType="com.pojo.User"> select * from test.user; </select> </mapper>
测试
尽量使用junit进行测试,写在绿色包里面
报错:类型接口在Mapper中心是未知的
org.apache.ibatis.binding.BindingException: Type interface com.dao.UserDao is not known to the MapperRegistry.
报错:xml找不到,在两个pom.xml配置文件中写上配置文件地址,因为没有放在rescourses文件夹下
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
测试类
package com.demo.dao;
import com.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
//获得sqSession
SqlSession sqSession = MybatisUtils.getSqSession();
//执行sqSession
//方式一:getmapper
UserDao mapper = sqSession.getMapper(UserDao.class);//获取对象
List<com.pojo.User> userList = mapper.getUserList();//执行对象的方法
for (com.pojo.User user : userList) {//userList.for即可得到这一部分代码
System.out.println(user.toString());
}
sqSession.close();
}
}
总结
数据库增删改查
namesppace
namespace中的包名要和Mapper的一至
SELECT
选择,查询语句
- id对应namespace中的方法名,相当于重写了方法啊
- resulttype。sql的返回值
- parameterType参数的类型
如果返回一个对象就使用类作为返回类型,这个返回值包含所有的信息,如果是字符串或者数字就指定类型。
如果通过传入的id没找到就会返回null,传入的id不存在也会返回null
<select id="getUserById" resultType="String" parameterType="String">
select pwd from test.user where account=#{id}
</select>
INSERT
创建一个新用户,在调用的时候直接new一个对象
<insert id="addUser" parameterType="com.demo.pojo.User">
insert into test.user (account,name,pwd,phone,type ) values (#{account},#{name},#{pwd},#{phone},#{type})
</insert>
注意:增删改需要提交事务
这是java的测试代码
@Test
public void addUserTest(){
//获得sqSession
SqlSession sqSession = MybatisUtils.getSqSession();
UserMapper mapper = sqSession.getMapper(UserMapper.class);//获取对象
int res = mapper.addUser(new User("2011","hahaha","1111","10086","adm"));
if(res>0){
System.out.println("完成");
}
// 提交事务
sqSession.commit();
sqSession.close();
}
DELETE
<delete id="removeUserById" parameterType="String">
delete from test.user where account=#{id}
</delete>
//删除用户
@Test
public void removeUserByIdTest(){
//获得sqSession
SqlSession sqSession = MybatisUtils.getSqSession();
UserMapper mapper = sqSession.getMapper(UserMapper.class);//获取对象
int res = mapper.removeUserById("2011");
if(res>0){
System.out.println("删除完成");
}
// 提交事务
sqSession.commit();
sqSession.close();
}
修改用户
//修改密码
@Test
public void changePwdTest(){
//获得sqSession
SqlSession sqSession = MybatisUtils.getSqSession();
//执行sqSession
//方式一:getmapper
UserMapper mapper = sqSession.getMapper(UserMapper.class);//获取对象
int res = mapper.changePwdByIdd(new User("2011","woaini"));//执行对象的方法
if (res>0){
System.out.println("密码已修改");
}
sqSession.commit();
sqSession.close();
}
使用万能的Map
接口
int addUser2(Map<String,String> map);
xml
<!-- 使用map的时候,添加 value需要和传入的map配套哦,我们上面取的都是类的属性-->
<insert id="addUser2" parameterType="Map">
insert into test.user (account,pwd) values (#{user_account},#{user_pwd});
</insert>
测试代码
//使用map添加
@Test
public void addUser2(){
SqlSession sqSession = MybatisUtils.getSqSession();
UserMapper mapper = sqSession.getMapper(UserMapper.class);
HashMap<String,String> map = new HashMap<String, String>();
map.put("user_account","1111");
map.put("user_pwd","1111");
mapper.addUser2(map);
sqSession.commit();
sqSession.close();
}
配置解析
属性优化
我们的属性:driver、password等等都可以写在properties中,嗯,这估计也是贵才哥考察的一个重点了。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
导入proprieties,要放在第一个位置
<configuration>
<!--导入properties文件-->
<properties resource="db.properties"/>
<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="mapper/UserMapper.xml"/>
</mappers>
</configuration>
别名优化
设置一个短的名字,有两种方式:
-
直接在mybatis配置文件里写,不过要放在第三个位置,没有第二个的话就放在properties下面就好
<typeAliases> <typeAlias type="com.demo.pojo.User" alias="User"/> </typeAliases>
-
读取写好的包,在使用的时候就直接使用实体类名
<typeAliases> <typeAlias package="com.demo.pojo"/> </typeAliases>
在实体类少的时候,就使用第一种,很多的话就使用第二种。
不过第一种可以DIY,如果我们也想使用第二种方法DIY的话,可以给类加一个注解,这个注解就是DIY后的名字
@Alias("hello")
public class User{
//code
}
/*这样我们就找不到hello了,只能使用hello*/
Mapper
方式一:绑定xml文件
- 没有限制
方式二:绑定class
- 配置文件要和class在同一个包下
- 配置文件要和class名字相同
方式三:绑定package
- 需要配置文件和包同名
一个半成品
注:第二部分随缘更新啦。。。我先把考核搞定再说嘿嘿
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)