一、首先搭建项目运行环境:使用IDEA创建普通javawe的maven项目
二、在创建好的项目中引入jar包依赖
项目文件结构:
三、新建mybatis主配置xml文件,一般命名为SqlMapConfig.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">
<!-- 配置mybatis环境(mybatis的主配置文件) -->
<configuration>
<environments default="mysql">
<!-- 配置mysql环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- mysql数据库注册驱动,注意:
这里如果你用的是mysql8.0以上的话,驱动需要修改为:
com.mysql.cj.jdbc.Driver
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- mysql数据库连接地址 -->
<property name="url" value="jdbc:mysql://localhost:3306/你的数据库名"/>
<!-- mysql数据库连接用户名 -->
<property name="username" value="你的连接数据库用户名"/>
<!-- mysql数据库连接密码 -->
<property name="password" value="你的连接密码"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置,具体参见下面举例 -->
<mappers>
<mapper resource="mybatis/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
附:
这里如果想使用log4j的日志功能,需要在resources文件夹下创建日志配置信息文件---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:\\JetBrains\\IdeaProjects\\MyBatisProject\\logs\\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
四、下面可以正式配置使用了:这里以用户表为例,步骤如下:
1.新建一个数据库,创建用户表并添加几条数据
2.创建用户表user实体类,成员变量名以及类型保持与数据库表一致
import java.io.Serializable;
import java.util.Date;
/**
* \* Created with IntelliJ IDEA.
* \* Author: Poison
* \* Date: 2020/2/4
* \* CreateTime: 12:47
* \
*/
public class User implements Serializable {
private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
'}';
}
}
3.创建Dao接口,我一般喜欢以“I”开头命名,表示接口的意思,IUserDao,只需要在接口中创建增删改查的方法
package cn.poison.dao;
import cn.poison.pojo.QueryVo;
import cn.poison.pojo.User;
import java.util.List;
/**
* \*用户表持久层接口
* \* Created with IntelliJ IDEA.
* \* Author: Poison
* \* Date: 2020/2/4
* \* CreateTime: 14:36
* \
*/
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
/**
* 查询所有用户2
* @return
*/
List<User> findAll2();
/**
* 保存用户
* @param user
* @return
*/
int saveUser(User user);
/**
* 更新用户
* @param user
* @return
*/
int updateUser(User user);
/**
* 根据id删除用户
* @param userId
* @return
*/
int deleteUser(Integer userId);
/**
* 根据id查询用户
* @param id
* @return
*/
User findUserById(Integer id);
/**
* 根据用户名模糊查询用户,使用CONCAT()聚合函数
* @param name
* @return
*/
List<User> findUserByName1(String name);
/**
* 根据用户名模糊查询用户,'%${value}%'
* @param name
* @return
*/
List<User> findUserByName2(String name);
/**
* 查询总记录数
* @return
*/
int findTotal();
/**
* 根据QueryVo查询用户
* @param queryVo
* @return
*/
List<User> findUserByQueryVo(QueryVo queryVo);
}
4.在resource资源文件夹下创建IUserDao.xml的映射文件,文件名与上面dao接口名保持一致,并在文件中配置接口中对应的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="cn.poison.dao.IUserDao">
<!-- 配置查询结果集,查询结果的列名与实体类的属性名的对应关系 -->
<resultMap id="userMap" type="cn.poison.pojo.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
</resultMap>
<!-- 查询所有用户2 -->
<select id="findAll2" resultMap="userMap">
select * from user
</select>
<!-- 配置查询所有SQl -->
<select id="findAll" resultType="cn.poison.pojo.User">
select * from user
</select>
<!-- 保存用户 -->
<insert id="saveUser" parameterType="cn.poison.pojo.User">
<selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER" >
select last_insert_id()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="cn.poison.pojo.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{userId}
</delete>
<!-- 根据id查询用户 -->
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.poison.pojo.User">
select * from user where id=#{id}
</select>
<!-- 根据用户名模糊查询用户信息,方式一使用聚合函数 -->
<select id="findUserByName1" parameterType="java.lang.String" resultType="cn.poison.pojo.User">
select * from user where username like CONCAT('%',#{name},'%')
</select>
<!-- 根据用户名模糊查询用户信息,方式二使用'%${value}%',value是固定写法 -->
<select id="findUserByName2" parameterType="java.lang.String" resultType="cn.poison.pojo.User">
select * from user where username like '%${value}%'
</select>
<!-- 根据QueryVo模糊查询用户信息 -->
<select id="findUserByQueryVo" parameterType="cn.poison.pojo.QueryVo" resultType="cn.poison.pojo.User">
select * from user where username like #{user.username}
</select>
<!-- 查询总记录数 -->
<select id="findTotal" resultType="java.lang.Integer">
select count(*) from user
</select>
</mapper>
讲解:
5、至此,mybatis的配置基本完成,编写测试类测试mybatis使用,
在未结合其他java框架使用之前,都需要通过原生java代码,读取mybatis的主配置文件,完成数据库连接的相关操作
import cn.poison.dao.IUserDao;
import cn.poison.pojo.QueryVo;
import cn.poison.pojo.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;
/**
* \*测试类
* \* Created with IntelliJ IDEA.
* \* Author: Poison
* \* Date: 2020/2/4
* \* CreateTime: 14:41
* \
*/
public class TestMybatis {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//在测试方法执行之前执行
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("mybatis/SqlMapConfig.xml");
//2.获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//在测试方法执行完之后执行
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 测试查询所有
*/
@Test
public void testQuery() throws Exception{
//5.执行查询所有的方法
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println("------->"+user);
}
}
/**
* 测试查询所有2
*/
@Test
public void testQuery2() throws Exception{
//5.执行查询所有的方法
List<User> userList = userDao.findAll2();
for (User user : userList) {
System.out.println("------->"+user);
}
}
/**
* 测试保存用户
*/
@Test
public void testSave(){
User user = new User();
user.setUsername("mybatis last insertid");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("东莞松山湖");
int i = userDao.saveUser(user);
if(i>0){
System.out.println("保存成功!");
System.out.println(user);
}
}
/**
* 测试更新操作
*/
@Test
public void testUpdate(){
User user = new User();
user.setId(42);
user.setUsername("宫本武藏");
user.setAddress("茂名化州");
user.setSex("男");
user.setBirthday(new Date());
int i = userDao.updateUser(user);
if(i>0){
System.out.println("修改成功!");
}
}
/**
* 测试删除用户
*/
@Test
public void testDelete(){
int i = userDao.deleteUser(51);
if(i>0){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
}
/**
* 测试根据id查询用户
*/
@Test
public void testSelectUser(){
User user = userDao.findUserById(42);
if(user!=null){
System.out.println("查询的用户为——-----"+user);
}
}
/**
* 测试根据用户名模糊查询---方式一
*/
@Test
public void testfindByName1(){
List<User> list = userDao.findUserByName1("王");
for (User user : list) {
System.out.println("---------->"+user);
}
}
/**
* 测试根据用户名模糊查询---方式一
*/
@Test
public void testfindByName2(){
List<User> list = userDao.findUserByName2("王");
for (User user : list) {
System.out.println("---------->"+user);
}
}
/**
* 测试根据QueryVo查询用户
*/
@Test
public void testQueryByQueryVo(){
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUsername("%王%");
queryVo.setUser(user);
List<User> userList = userDao.findUserByQueryVo(queryVo);
for (User user1 : userList) {
System.out.println("-------->"+user1);
}
}
/**
* 查询总记录数
*/
@Test
public void testfindTotal(){
int total = userDao.findTotal();
System.out.println("总记录数为"+total);
}
}
执行结果: