1、MyBatis简介
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
2、MyBatis配置
2.1 准备工作
此次配置mybatis是在idea中,在maven的基础之上实现的。
(1) 添加依赖
打开maven中的pom.xml文件,添加以下依赖。(若只配置mybatis框架,只导入mybatis依赖和mysql依赖)
<dependencies>
<!--test测试方法依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<!--log4j日志依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
(2) 目录结构准备
(3) 新建mybatis主配置文件
在resources目录下,右键新建文件mybatis-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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>-->
<!-- ------------------------------------------------------------------------------------------------------------------- -->
<?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>
<!-- 属性配置,数据库配置文件 -->
<properties resource="db.properties"/>
<!--引用外部的db.properties,如果只有一个文件,可以用/结束-->
<!-- 配置别名,三种方式-->
<typeAliases>
<!--1:将指定对象 更改成别名 dao-->
<typeAlias type="com.ujy.db.dao.IUserDao" alias="dao"></typeAlias>
<!--2:包,此包下的所有类都可以用本文件的类名作为别名(可以不区分大小写)-->
<package name="com.ujy.db.bean"/>
<!-- 3:可以使用注解显示某个类的别名,在类文件上写-->
</typeAliases>
<!-- 可以配置多个environment,每一个id要不同,默认是default-->
<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>
<!-- 关联map隐射文件-->
<mappers>
<!-- 设置隐射文件的位置和名称-->
<mapper resource="com/ujy/db/dao/UserMapping.xml"/>
</mappers>
</configuration>
(4) 获取SqlSession对象
在utils工具包中新建类,该类用于获取SqlSession对象
public class Sqlsession {
private static SqlSessionFactory factory =null;
static{
// 加载主配置文件
String file = "mybatis-config.xml";
try {
InputStream resourceAsStream = Resources.getResourceAsStream(file);
factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
// 从factory中获取session对象
return factory.openSession();
}
}
(5) 配置mysql数据库
1、在resources下新建db.properties,写入以下数据,相关数据更换成自己的。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/person
username=root
password=xxxx
2、在主配置文件中关联db.properties。(关联代码已经写在主配置文件中)
2.2 实现增删改查类
(1)创建数据表
(2)创建实体类
在bean文件夹下,创建一个User类
@Getter@Setter@ToString
@AllArgsConstructor@NoArgsConstructor
@Alias("MyUser")
public class User {
private String id;
private String name;
private String passwd;
}
(3)创建dao的接口
在dao目录下新建一个接口,定义增删改查方法,其中查询分为两种情况,全部查询和部分查询。
public interface IUserDao {
int add(User user);
int update(User user);
int delete(int id);
List<User> select();
User selectone(int id);
}
(4)创建dao的实现类
在dao下新建一个文件夹Imp,用来存放接口的实现类。新建一个实现类。
public class UserDao implements IUserDao {
public int add(User user) {
//增加数据
SqlSession session = Sqlsession.getSession();
int fin = session.insert("com.ujy.db.dao.IUserDao.add", user);
/*别名: int fin = session.insert("dao.add", user);*/
session.commit();
session.close();
return fin;
}
public int update(User user) {
//修改数据
SqlSession session = Sqlsession.getSession();
int fin = session.update("com.ujy.db.dao.IUserDao.update", user);
session.commit();
session.close();
return fin;
}
public int delete(int id) {
//删除数据
SqlSession session = Sqlsession.getSession();
int fin = session.delete("com.ujy.db.dao.IUserDao.delete", id);
session.commit();
session.close();
return fin;
}
public List<User> select() {
//查询全部数据,查询不需要提交事务
SqlSession session = Sqlsession.getSession();
List<User> user = session.selectList("com.ujy.db.dao.IUserDao.select");
return user;
}
public User selectone(int id) {
//查询单条数据
SqlSession session = Sqlsession.getSession();
Object user = session.selectOne("com.ujy.db.dao.IUserDao.selectone", id);
return (User) user;
}
}
2.3 创建mapper的映射文件
在resources文件夹下,新建一个文件夹com/ujy/db/dao,在文件夹下新建映射文件UserMapping.xml ,用来存放已经映射的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">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>-->
<!-- --------------------------------------------------------------------------------------------------------------- -->
<?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">
<!--主配置文件可以将com.ujy.db.dao.IUserDao别名成dao-->
<!--<mapper namespace="dao">-->
<mapper namespace="com.ujy.db.dao.IUserDao">
<!-- 增-->
<!--自动获取插入数据主键的值
useGeneratedKeys:是否获取主键值,默认为false
keyProperty:把获取到的主键值,赋给此对象,引号中只能写主键名,写其他为null
keyColumn:从哪一列获取主键,可以不写,没啥用-->
<insert id="add" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into users value (null,#{name},#{passwd})
</insert>
<!-- 改-->
<update id="update">
update users set name=#{name},passwd=#{passwd} where id=#{id}
</update>
<!-- 删-->
<delete id="delete">
delete from users where id=#{suibian}
</delete>
<!--查询全部,resultType指定返回值类型
<别名:select id="select" resultType="User">-->
<select id="select" resultType="com.ujy.db.bean.User">
select * from users
</select>
<!-- 查询单条数据-->
<!--别名:<select id="selectone" resultType="MyUser">-->
<select id="selectone" resultType="com.ujy.db.bean.User" resultMap="UserMap">
select * from users where id=#{id}
</select>
<!--结果集隐射标签,用于实体类中属性名和数据库字段名不匹配的情况,写一个转换的过程
id:当前结果集隐射的唯一标识,要把id写到select中的resultMap!!!
type:对象类型-->
<resultMap id="UserMap" type="com.ujy.db.bean.User">
<!--property是实体类属性名,column是数据库字段名,
当前是查询,是把column转成property-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="passwd" property="passwd"/>
</resultMap>
</mapper>
!!!主配置文件关联映射文件!!!
主配置文件已经加入。
2.4 测试
在test下的java文件夹中,创建一个测试类TestRun,分配测试crud方法是否可行。
public class TestRun {
@Test
public void testadd() {
User user = new User(null,"zhangsan","222");
UserDao ud = new UserDao();
int fin = ud.add(user);
String id = user.getId();
System.out.println(id);
if (fin>0){
System.out.println("写入成功!!!");
}
}
@Test
public void testupdate(){
User user = new User("8","张三","000");
UserDao ud = new UserDao();
int fin = ud.update(user);
if (fin>0){
System.out.println("修改成功");
}
}
@Test
public void testdelete(){
UserDao ud = new UserDao();
int fin = ud.delete(7);
if(fin>0){
System.out.println("删除成功");
}
}
@Test
public void testselect(){
UserDao ud = new UserDao();
List<User> user = ud.select();
System.out.println(user);
}
@Test
public void testselectone(){
UserDao ud = new UserDao();
User user = ud.selectone(1);
if(user!=null){
System.out.println(user.getId()+"\t"+user.getName()+"\t"+user.getPasswd());
}
}
}