MyBatis环境搭建详细及执行增删改查操作
1、第一步
新建的maven项目中pom.xml文件中配置所需要jar包的以来坐标
- mybatis 包
- mysql-connector-java 包
- junit 测试包
- log4j 日志包
具体代码如下:
<?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">
<parent>
<artifactId>mybatis_01</artifactId>
<groupId>com.baoji.mybatis</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>mybatis_04_CRUD_insert</artifactId>
<!-- 导入mybatis相关jar包-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
2、第二步
按具体需求建目录结构
编写实体类和接口并创建对应数据库的表


1、编写实体类:User.java
package com.baoji.mybatis.entity;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userBirthday=" + userBirthday +
", userSex='" + userSex + '\'' +
", userAddress='" + userAddress + '\'' +
'}';
}
}
2、编写封装将实体类作为查询条件的类 QueryVo.java
package com.baoji.mybatis.entity;
/**
* QueryVo 作为参数查询,实际上是将对象作为属性。将对象包装起来作为查询条件
*/
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
编写接口类
package com.baoji.mybatis.dao;
import com.baoji.mybatis.entity.QueryVo;
import com.baoji.mybatis.entity.User;
import java.util.List;
public interface IUserDao {
//保存方法
public void saveUser(User user);
//修改方法
public void updateUser(User user);
//删除方法
public void deleteUser(Integer userId);
//根据id查询一个user对象
public User selectOne(Integer id);
//根据姓名模糊查询
public List<User> selectByName(String name);
//根据query evo条件查询
public List<User> findUserByVo(QueryVo vo);
//查询所有信息
public List<User> findAll();
}
3、第三步
在resources资源文件中配置mybatis主配置文件并导入log4j的配置文件
具体代码如下:config.xml
<!-- mybatis 主配置文件 -->
<?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 属性: 常用的 (resource="jdbcConfig.properties")
用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下。
url属性:
是要求按照url的属性来写地址
URL: 统一资源定位符,可以唯一标识一个资源的位置
例如 http://localhost:8080/mybatis/servlet
协议 主机 端口号 uri
uri: 统一资源标识符 ,在应用中可以唯一定位一个资源的
-->
<properties url="file:///H:/JDBC_config/">
<!--配置连接数据库的四个基本信息-->
<!--
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_user?characterEncoding=gbk"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
-->
</properties>
<!-- 使用typeAliases起别名,它只能配置entity中类的别名-->
<typeAliases>
<!-- typeAlias用于配置别名,type属性指的是实体类全限定类名,alias属性指定别名,当指定了别名就不再区分大小写-->
<!-- <typeAlias type="com.baoji.mybatis.entity.User" alias="user"></typeAlias> -->
<!-- 用于要配置起别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不区分大小写-->
<package name="com.baoji.mybatis.entity"/>
</typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的配置环境 -->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<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>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<!-- mybatis的映射配置文件位置必须和dao接口的文件位置相同,包名相同时,不需要实现dao接口 -->
<mappers>
<!-- <mapper resource="com/baoji/mybatis/dao/IUserDao.xml"></mapper> -->
<!-- package用于指定dao接口所在的包,当指定了之后就不需要再写mapper和resource以及class了-->
<package name="com/baoji/mybatis/dao"/>
</mappers>
</configuration>
JDBCconfig.properties jdbc配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/eesy_mybatis
username=root
password=root
log4j.properties 配置文件(了解即可)
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
4、第四步(使用xml方式配置映射文件)
配置位于resources资源文件下的映射文件mapper.xml(映射文件所放的目录位置要与接口所在位置一致,放在同一种包名下,可以不用写接口的实现类,使用代理对象自动实现代理类)
此处应注意:
当数据库中字段名与实体类中属性名一致时: 不需要配置resultMap,在resultType属性中填写需要返回类型所在的全路径名即可
当数据库中字段名与实体类中属性名一致时: 两种解决办法
第一种:在sql语句中起别名,将数据库的别名和实体类的属性名一致即可,执行效率高,非常推荐,但是太麻烦,开发效率低。
select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;
第二种:在配置中添加如下代码即可(最后将以前的resultType改为resultMap,值为上面定义的id值)
<!-- 配置查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="com.baoji.mybatis.entity.User">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!-- 非主键字段的对应 -->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
编写映射配置文件 IUserDao.xml
<?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.baoji.mybatis.dao.IUserDao">
<!-- 配置查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="com.baoji.mybatis.entity.User">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!-- 非主键字段的对应 -->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!-- parameterType为实体类的全路径 -->
<!-- 查询所有 -->
<insert id="saveUser" parameterType="com.baoji.mybatis.entity.User">
<!-- 配置插入操作后,获取插入操作的id-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select 1557543;
</selectKey>
insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
</insert>
<!-- 修改操作 -->
<update id="updateUser" parameterType="com.baoji.mybatis.entity.User">
update user set username = #{username}, address=#{address},sex = #{sex},birthday = #{birthday} where id = #{id};
</update>
<!-- 删除操作 -->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id};
</delete>
<!-- 根据id查询一个对象信息 -->
<select id="selectOne" parameterType="int" resultMap="userMap">
select * from user where id = #{id};
</select>
<!-- 根据姓名模糊查询 -->
<select id="selectByName" parameterType="String" resultMap="userMap">
<!-- 方式一:底层通过占位符来赋值,使用preparestatement对象,更安全。推荐使用-->
<!-- select * from user where username like #{name}; -->
<!-- 方式二:底层通过字符串拼接来赋值,使用statement对象,了解即可-->
select * from user where username like '%${value}%';
</select>
<!-- 根据query vo条件模糊查询 -->
<select id="findUserByVo" parameterType="com.baoji.mybatis.entity.QueryVo" resultType="com.baoji.mybatis.entity.User">
select * from user where username like #{user.username};
</select>
<!-- 查询所有信息-->
<select id="findAll" resultType="com.baoji.mybatis.entity.User">
select * from user;
</select>
</mapper>
(使用注解的方式配置映射文件)
在dao接口方法前加@servlet(sql语句)即可实现和xml同样的效果(简单开发效率高)
public interface IUserDao {
/**
* 查询所有操作
* @return
*/
@Select("select * from user")
List<User> findAll();
}
5、第五步
编写测试类
测试类: IUserDaoTest.java
package com.baoji.mybatis.test;
import com.baoji.mybatis.dao.IUserDao;
import com.baoji.mybatis.entity.QueryVo;
import com.baoji.mybatis.entity.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class IUserDaoTest {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession sqlSession;
private IUserDao dao;
//编写初始化方法(将重复代码封装至此)
@Before //此注解是在测试方法之前执行
public void init() throws IOException {
//1、读取配置文件
in = Resources.getResourceAsStream("Config.xml");
//2、创建sqlSessionFactory工厂
factory = new SqlSessionFactoryBuilder().build(in);
//3、使用工厂创建sqlSession对象
sqlSession = factory.openSession();
//4、使用sqlSession获取dao的代理对象
dao = sqlSession.getMapper(IUserDao.class);
}
@After //此注解实在测试方法之后执行
//创建关闭资源方法
public void destory() throws IOException {
//提交事务两种方式(只有提交事务,数据库才能插入成功)
//方式一:关闭资源前添加提交事务(sqlSession.commit();)
//方式二:在创建sqlSession时事务参数设置为true
sqlSession.commit();
sqlSession.close();
in.close();
}
//添加操作
@Test
public void saveTest(){
//创建user对象
User user = new User();
user.setUserName("张三");
user.setUserAddress("北京海淀区");
user.setUserSex("男");
user.setUserBirthday(new Date());
//执行添加操作
dao.saveUser(user);
}
//修改操作
@Test
public void updateTest(){
//创建user对象
User user = new User();
user.setUserId(50);
user.setUserName("李四");
user.setUserAddress("上海长虹区");
user.setUserSex("女");
user.setUserBirthday(new Date());
//执行添加操作
dao.updateUser(user);
}
//删除操作
@Test
public void deleteTest(){
//执行删除操作
dao.deleteUser(50);
}
//根据id查询一个对象信息
@Test
public void selectOneTest(){
//执行根据id查询操作
User user = dao.selectOne(51);
System.out.println(user);
}
//根据姓名模糊查询对象信息
@Test
public void selectByNameTest(){
//执行模糊查询操作
List<User> list = dao.selectByName("%王%"); //方式一
//List<User> list = dao.selectByName("王");
for(User users:list){
System.out.println(users);
}
}
//QueryVo 作为参数查询,实际上是将对象作为属性。将对象包装起来作为查询条件
@Test
public void findUserByVoTest(){
User user = new User();
user.setUserName("王五");
QueryVo vo = new QueryVo();
vo.setUser(user);
//执行按照query条件查询操作
List<User> list = dao.selectByName("%王%");
for(User users:list){
System.out.println(users);
}
}
//查询所有信息
public void findAllTest(){
List<User> list = dao.findAll();
for (User users : list) {
System.out.println(users);
}
}
}
到此就介绍完如何使用通过搭建mybatis环境完成CRUD操作了,惊不惊喜,意不意外,就是这么简单,用起来真的很爽!!!
写在最后
推荐作者的Github地址:github.com/Lmobject
感谢您的支持与鼓励,望能得到您的关注与点赞,写博客容易,坚持不易!!!加油。。。