一共三步完成基础操作
第一步 在IUserDao中增加方法
注意事项:方法要求的参数类型,在删除这一方法中是根据ID删除,数据类型为int/Integer都可以
/**
* 〈一句话功能简述〉<br>
* 〈用户的持久层接口〉
*
* @author Lucius
* @create 2020/2/8
* @since 1.0.0
*/
package com.lucius.dao;
import com.lucius.domain.User;
import java.util.List;
public interface IUserDao {
/**
* 提供一个方法,返回值是User,查询所有操作
*/
List<User>findAll();
/**
* 保存用户
* */
void saveUser(User user);
/**
* 更新用户
* */
void updateUser(User user);
/**
* 根据Id删除用户
* */
void deleteUser(Integer userId);
/**
* 根据Id查询用户
*返回值是一个User类型,在xml中自然也要配置resultType
* @return*/
User findById(Integer userId);
/**
* 模糊查询用户
*返回值是一个User类型的列表,在xml中自然也要配置resultType
* @return*/
List<User> findByName(String username);
/**
* 查询总用户数
* @return*/
int findTotal();
}
}
第二步 配置IUserDao.xml文件
注意事项:在删除操作中
delete from user where id=#{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.lucius.dao.IUserDao">
<!--映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名-->
<!--配置查询所有-->
<!--此处的名称不能随便写,要写之前的方法名称
映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名-->
<select id="findAll" resultType="com.lucius.domain.User">
select * from user
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="com.lucius.domain.User">
insert into user (username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.lucius.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday}where id=#{id}
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{Id}
</delete>
<!--查询一个用户-->
<select id="findById" parameterType="Integer" resultType="com.lucius.domain.User">
select * from user where id=#{Id}
</select>
<!--模糊查询用户-->
<select id="findByName" parameterType="String" resultType="com.lucius.domain.User">
select * from user where username like #{name}
</select>
<!--查询总用户数-->
<select id="findTotal" resultType="Integer">
/*select count(Id) from user;*/
select count(Id) from user;
</select>
</mapper>
第三步
写测试方法,为了避免重复,增加了初始化注解。
/**
* Copyright (C), Lucius
* FileName: MybatisTest
* Author:
* Date: 2020/2/8 13:55
* Description: Mybatis的入门案例
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.lucius.test;
import com.lucius.dao.IUserDao;
import com.lucius.domain.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.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//用于在测试方法之前执行
public void init() throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产一个SqlSession对象
sqlSession = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象(动态代理)
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用于在测试方法之后执行
public void destory() throws Exception {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 测试查询所有操作
*/
@Test
public void testFindAll() {
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
/**
* 测试保存操作
*/
@Test
public void testSave() {
User user = new User();
user.setUsername("mybatisTest");
user.setAddress("武汉市");
user.setSex("男");
user.setBirthday(new Date());
//5.执行保存方法
userDao.saveUser(user);
}
/**
* 测试更新操作
*/
@Test
public void testUpdate() {
User user = new User();
user.setId(49);
user.setUsername("mybatisTest");
user.setAddress("武汉市");
user.setSex("女");
user.setBirthday(new Date());
//5.执行保存方法
userDao.updateUser(user);
}
/**
* 测试删除操作
*/
@Test
public void testDelete() {
//5.执行删除方法
userDao.deleteUser(49);
}
/**
* 测试查询一个用户操作
*/
@Test
public void testFindOne() {
//5.执行查询一个用户方法
User user=userDao.findById(48);
System.out.println(user);
}
/**
* 测试模糊查询用户操作
*/
@Test
public void testFindByName() {
//5.模糊查询用户方法
//注意格式需要加入百分号
List<User> users=userDao.findByName("%王%");
for(User user:users){
System.out.println(user);
}
}
/**
* 测试查询总记录条数操作
*/
@Test
public void testFindTotal() {
//5.查询用户总记录方法
int count=userDao.findTotal();
System.out.println(count);
}
}
properties标签使用方法
为了使用properties标签,我们需要田间一个properties的配置文件取名jdbcConfig.properties,在其中我们设置了链接数据库的相关信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?&useSSL=true
jdbc.username=****
jdbc.password=****
然后在主配置文件中做出以下修改
改变1:
添加了properties属性,在其中resource参数指定了配置文件的地址(在此处还可以用url方式,但是麻烦不常用)
改变2:
注意要使用配置文件中相同的名称,并用${ }
<dataSource type="POOLED">
<!-- 配置链接数据库的四个基本信息-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
<?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的主配置文件-->
<configuration>
<!-- 配置properties
可以在标签内部配置链接数据库的信息。也可以通过属性引用外部配置文件信息
resource属性:常用的
用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下
urls属性:
是按照url的写法来写地址
URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置
-->
<properties resource="jdbcConfig.properties">
</properties>
<!-- 环境配置-->
<environments default="mysql">
<!-- 环境mysql配置-->
<environment id="mysql">
<!-- 配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池)-->
<dataSource type="POOLED">
<!-- 配置链接数据库的四个基本信息-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立配置文件-->
<mappers>
<mapper resource="com/lucius/dao/IUserDao.xml"/>
</mappers>
</configuration>
package标签的使用方法
目的是为了解决类和接口大小写的问题,可以使用别名提高效率
实体类
在主配置文件中添加以下代码
<!-- 使用typeAliases配置别名,他只能配置domain中类的别名-->
<typeAliases>
<!-- 使用typeAliases配置别名,type用于指定实体类的全限定类名,alias用于指定别名,指定后就不在区分大小写-->
<!-- 但是过多的时候就很麻烦,所以用package-->
<!--<typeAlias type="com.lucius.domain.User" alias="user"></typeAlias>-->
<!--用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="com.lucius.domain"></package>
</typeAliases>
此后我们在IUserDao.xml文件中使用该实体类名就能够直接使用user,无需再写全称,例如此处的resultType
<!--模糊查询用户-->
<select id="findByName" parameterType="String" resultType="user">
select * from user whuere username like #{name}
</select>
接口
既然实体类能够别名,那么接口也可以做到
<mappers>
<!--<mapper resource="com/lucius/dao/IUserDao.xml"/>-->
<!--此处的package标签是用于指定dao接口所在的包,指定之后就不需要再写mapper以及resource或者class了-->
<package name="com.lucius.dao"></package>
</mappers>
当数据库中的列名与实体类中的属性名对应不上的时候
1.起别名
select id as userId
2.resultmap 结果集映射
**resulyMap:**建立实体类和数据库表的对应关系
**id属性:**给定一个唯一标识,时查询select标签引用用的
**type属性:**指定实体类的全限定类型
<resultMap id="userMap" type="com.daniel.domain.User">
<!--主键字段的对应 property实体属性的id(严格区分大小写) column数据库列表中的id-->
<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>
<!--配置查询所有 使用resultMap的时候 这样写开发效率快!!但是运行效率慢-->
<select id="findAll" resultMap="userMap">
<!--select id as userId 这样起别名的方法 运行效率快-->
select * from user;
</select>
**id标签:**用于指定主键字段
**result标签:**用于指定非主键字段
**column属性:**用于指定数据库列名
**property属性:**用于指定实体类属性名称