Mybatis
什么是Mybatis?
MyBatis源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis。它是一个优秀的持久层框架。
官网地址:http://www.mybatis.org/mybatis-3/
为什么使用MyBatis? 降低耦合度
为了和数据库进行交互,通常的做法是将SQL语句写在Java代码中,SQL语句和Java代码耦合在一起不利于后期维护修改,而MyBatis能够帮助我们将SQL语句和Java代码分离,方便了后期因需求变动而对SQL语句进行修改。(联系properties文件的作用)
关于Mybatis更多具体信息可以看之前的Mybatis面试总结
https://blog.csdn.net/qq_15740137/article/details/104236724
Mybatis的使用
一。使用前的准备工作
①、准备
(1)
a、下载MyBatis相应jar包:https://github.com/mybatis/mybatis-3/releases
b、创建Java工程,导入MyBatis jar包(mybatis-3.4.4.jar)和数据库驱动包
(2)maven工程 直接在pom加入代码
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
Mybatis的使用一共有三种方法(在这里只写上去了最常用的一种方法)
Mybatis的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="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/manager" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="config/user_Info.xml"></mapper>
</mappers>
</configuration>
配置数据库信息时
<environments>
里面可以有多个<environment>
但是里面的default属性的值为哪个<environment>
的id 那么所采用的就是哪一个<environment>
引入sql语句的xml文件(有多少个sql语句的xml文件就要写入几个mapper标签去配置)
<mappers>
<mapper resource="config/user_Info.xml"></mapper>
</mappers>
此时的user_Info.xml
在同一个xml里面 id是不可以重复的,注意命名空间是一个接口,而对应想要执行的操作便让 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.zcc.mybatis.user.dao.userDao">
<resultMap type="com.zcc.mybatis.user.entity.UserInfo" id="userInfo">
<id property="userName" column="user_name"></id>
<result property="userId" column="user_id"/>
</resultMap>
<!-- id:唯一标识;resultType:返回值类型; -->
<select id="getUserName" resultMap="userInfo">
<!-- #{id}:从传递过来的参数中取出id值 -->
select user_name from sys_user where user_id = #{userId}
</select>
<select id="getUserById" resultMap="userInfo">
<!-- #{id}:从传递过来的参数中取出id值 -->
select user_name,passwd,user_id from sys_user where user_id = #{userId}
</select>
<insert id="add" >
<!-- #{id}:从传递过来的参数中取出id值 -->
insert into sys_user (user_name,passwd) values(#{us.userName}, #{us.passwd})
</insert>
<delete id="del">
delete from sys_user where user_id=#{id}
</delete>
</mapper>
一个测试类
public static void main(String[] args) {
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream("config/mybatis_config.xml");
//sqlSession对象代指一次数据库连接
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
userDao ud = sqlSession.getMapper(userDao.class);
//System.out.println(ud.getClass().getName());
String userName = ud.getUserName(1170);
System.out.println(userName);
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
配置文件(配置文件有先后顺序 如果顺序不对,会自动提示)
类型别名 网站地址
https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases
名字转化的问题(三种方法)
一
如果要让数据库中的名字自动匹配驼峰命名法需要再mybatis配置文件中加入(例如user_name 和userName)
<!-- 让属性 mapUnderscoreToCamelCase的值为true(默认为false) 也就是可以将——自动转化为驼峰命名法 不过一般还是用别名比较多-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>
二
利用别名
三 在sql的xml文件的mapper下配置,但是必须在实现接口方法的标签中加上resultMap(并且resultMap和resultType只能使用一个)返回list的时候和一个对象的时候一样的类型
id标签和result标签都可以改名
<resultMap type="com.zcc.mybatis.user.entity.UserInfo" id="userInfo">
<id property="userName" column="user_name"></id>
<result property="userId" column="user_id"/>
</resultMap>
mybatis配置文件中的typeAliases标签(可以定义自定义类型,在sql配置文件中可以直接用alias)不建议使用,不方便维护和观看
<typeAliases>
<typeAlias type="com.zcc.mybatis.user.entity.UserInfo" alias="UserInfo"></typeAlias>
</typeAliases>
引入文件(properties标签 )
<properties resource="config/db.properties"></properties>