之前没接触过mybatis,这次公司做项目用的是mybatis连接数据库,自己回去学了后是xml配置的,但大家都说注解可能更明了一些,所以我就都总结一下。
准备工作:新建Java项目(新建web项目还是J2SE的都可以,我这边新建的是普通的Java项目),引入两个jar包:mybatis-3.4.5.jar 和 mysql-connector-java-5.1.44-bin.jar,并且add to Build Path。
一.xml配置:
介绍:
mybatis通过xml配置来连接数据库,其实主要是两个xml,第一个是数据库配置的xml,即config.xml文件,它是告诉程序,要连哪个数据库,数据库的地址用户名密码啥的都在这,数据库到时候会执行什么操作呢,这个它告诉你:我看的是哪个对应的mapper的xml文件说要干啥。那第二个xml文件当然就是我们自己配置的mapper的xml文件了,里面写我们到时候会要求数据库执行的操作。
步骤:
1.新建个文件夹,放xml这些配置文件(也可以不新建,主要是为了显得整齐点)【我的整个项目的目录结构如下:】
我使用到的数据库是:
2.新建config.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--这是说明引用的是mybatis框架,不用管这个 -->
<!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" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 映射文件定位 -->
<!--这个就是说一下,要执行的sql语句的xml文件在哪,这里可以写相对路径也可以写绝对路径,绝对路径就是url,相对路径使用resource-->
<mappers>
<mapper url = "file:Users/knight/letian-workspace/testMybatis/conf/mapper.xml" />
</mappers>
</configuration>
3.新建mapper.xml文件:
(这里面就是写sql语句,然后说明它的传入参数的类型,返回参数的类型,在程序中调用这个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语,需要通过其唯一标识访问到 唯一标识就是 namespace+id的组合 -->
<mapper namespace="com.knight.main.mapper">
<!-- mapper标签下有select、update、delete、insert,根据你要执行的sql语句选择正确的标签 -->
<select id="name" parameterType="int" resultType = "String">
select name from Person where id = #{id};
</select>
</mapper>
4.新建HelloMybatis.java文件,开始连接mysql:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class HelloMybatis {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "./conf/config.xml";
/**
* 然后把这个配置文件转成InputStream给SqlSessionFactory
*/
InputStream is = null;
try {
is = new FileInputStream(resource);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的标识字符串,
* com.knight.main.mapperr是mapper.xml文件中mapper标签的namespace属性的值,
* name是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "com.knight.main.mapper.name";//映射sql的标识字符串
//执行查询返回结果
String user = session.selectOne(statement, 3);
System.out.println(user);
}
}
二、注解:
我继续在这个项目里写了,然后新建个包就行:
(还是实现根据id查询用户名的功能)
注解呢,就是定义个接口,里面写好要执行的sql,然后以一个方法的方式来返回结果。
1.定义接口Mapper.java:
package com.knight.annotation;
import org.apache.ibatis.annotations.Select;
//定义sql映射的接口,使用注解指明方法要执行的SQL
public interface Mapper {
//使用@Select注解指明getName方法要执行的SQL
@Select("select name from Person where id = #{id};")
public String getName(int id);
}
2.在config.xml文件里去注册,也就是告诉程序这个接口在哪,在原先的config.xml文件的mappers标签里加上:
<!-- 注册Mapper映射接口-->
<mapper class = "com.knight.annotation.Mapper" />
完整的config.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" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 映射文件定位 -->
<!--这个就是说一下,要执行的sql语句的xml文件在哪,这里可以写相对路径也可以写绝对路径,绝对路径就是url,相对路径使用resource-->
<mappers>
<!-- <mapper url = "file:Users/knight/letian-workspace/testMybatis/conf/mapper.xml" /> -->
<!-- 注册Mapper映射接口-->
<mapper class = "com.knight.annotation.Mapper" />
</mappers>
</configuration>
3.编写AnnotationMybatis.java文件:
package com.knight.annotation;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class AnnotationMybatis {
public static SqlSession getSqlSession() {
String resource = "./conf/config.xml";
InputStream is = null;
try {
is = new FileInputStream(resource);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
return sessionFactory.openSession();
}
public static void main(String[] args) {
SqlSession sqlSession = getSqlSession();
//得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
Mapper mapper = sqlSession.getMapper(Mapper.class);
//执行查询操作,将查询结果自动封装成User返回
String name = mapper.getName(3);
//使用SqlSession执行完SQL之后需要关闭SqlSession
sqlSession.close();
System.out.println(name);
}
}
总结
其实xml配置和注解只是调用形式不一样罢了,不过注解确实看起来整齐一些。
以上两个例子是在写博客的时候,边写博客,边写例子的,所以都亲测可以运行通过。
欢迎大家交流沟通!