1.typeAlias用于配置别名,配置文件不再区分大小写
按上述配置后,以后在配置文件里写该domain包下的类,就不用区分大小写,也能省略全限定类名前的目录
2. resource或者class省略的映射配置
配置结束后,不管是XML还是注解配置,都不用在写resource或class配置。
3. 各种CRUD操作
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的主配置文件-->
<configuration>
<!--使用typeAliases配置别名,它只能配置domain中类的别名 -->
<typeAliases>
<!--typeAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就再区分大小写
<typeAlias type="com.jh.domain.User" alias="user"></typeAlias>-->
<!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="com.jh.domain"></package>
</typeAliases>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="jh7851192"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<!--<mapper resource="com/jh/dao/IUserDao.xml"/>-->
<!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了 -->
<package name="com.jh.dao"></package>
</mappers>
</configuration>
IUserDao.xml
- 所有的SQL语句都在IUserDao.xml中编写,几个标签如下
< select>,< insert>,< update>,< delete>标签; - 各个标签中的属性:
id:id名要与IUserDao接口中的抽象方法名相同;
parameterType:接口中方法的参数类型;
resultType:接口中方法的返回值类型;
#{} 为各个属性名,大括号中写占位值?,即属性名。
<?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.jh.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="uSer">
select * from user
</select>
<!--保存用户:typeAliases配置别名,useR不再区分大小写-->
<insert id="saveUser" parameterType="useR">
<!--配置插入操作后,获取插入数据的id-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user (username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.jh.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="java.lang.Integer"><!--只要表示参数类型int就行,怎么写无所谓-->
delete from user where id=#{uid}
</delete>
<!--根据id查询用户-->
<select id="findById" parameterType="INT" resultType="com.jh.domain.User">
select * from user where id=#{Uid}<!--这里id命名无所谓-->
</select>
<!--根据名称模糊查询-->
<select id="findByName" parameterType="string" resultType="com.jh.domain.User">
<!--select * from user where username like #{name}-->
select * from user where username like '%${value}%'
</select>
<!-- 获取用户的总记录条数 -->
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
<!--根据queryVo的条件查询用户:#大括号里写对象.属性名,不再省略user对象了,
因为parameterType不再是com.jh.domain.User了-->
<select id="findUserByVo" parameterType="com.jh.domain.QueryVo" resultType="com.jh.domain.User">
select * from user where username like #{user.username}
</select>
</mapper>
模糊查询的2种方式:
IUserDao接口
package com.jh.dao;
import com.jh.domain.QueryVo;
import com.jh.domain.User;
import java.util.List;
/**
* 用户的持久层接口
* */
public interface IUserDao {
//1.查询所有用户
List<User>findAll();
//2.保存用户
void saveUser(User user);
//3.更新用户
void updateUser(User user);
//4.根据id删除用户
void deleteUser(Integer userId);
//5.根据id查询用户信息
User findById(Integer userId);
//6.根据名称模糊查询用户信息
List<User>findByName(String username);
//7.查询总用户数
int findTotal();
//8.根据queryVo中的条件查询用户
List<User> findUserByVo(QueryVo vo);
}
User.java
package com.jh.domain;
import java.io.Serializable;
import java.util.Date;
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 +
'}';
}
}
QueryVo.java
package com.jh.domain;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
MybatisTest.java
执行mybatis数据库操作6步可以用junit单元测试来写,如下:
package com.jh.test;
import com.jh.dao.IUserDao;
import com.jh.domain.QueryVo;
import com.jh.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.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* 测试mybatis的CRUD操作
* */
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工厂模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession=factory.openSession(true);//手动提交事务
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy() 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("mybatis last inserttid");
user.setAddress("北京市朝阳区");
user.setSex("男");
user.setBirthday(new Date());
System.out.println("保存插入id操作前:"+user);//保存插入id操作前:User{id=null, username='mybatis last inserttid', address='北京市朝阳区', sex='男', birthday=Mon Feb 10 19:29:59 CST 2020}
//5.执行保存方法
userDao.saveUser(user);
System.out.println("保存插入id操作后:"+user);//保存插入id操作后:User{id=53, username='mybatis last inserttid', address='北京市朝阳区', sex='男', birthday=Mon Feb 10 19:29:59 CST 2020}
}
/**
* 测试更新操作
* */
@Test
public void testUpdate(){
User user = new User();
user.setId(50);
user.setUsername("mybatis Update user");
user.setAddress("上海市");
user.setSex("女");
user.setBirthday(new Date());
//5.执行更新方法
userDao.updateUser(user);
}
/**
* 测试删除操作
* */
@Test
public void testDelete(){
//5.执行更新方法
userDao.deleteUser(52);
}
/**
* 根据id进行查询操作
* */
@Test
public void testFindOne(){
//5.执行查询一个方法
User user = userDao.findById(48);
System.out.println(user);
}
/**
* 测试模糊查询操作
* */
@Test
public void testFindByName(){
//5.执行查询一个方法
/*List<User>users=userDao.findByName("%王%");*/
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);//8
}
/**
* 测试使用QueryVo作为查询条件
*/
@Test
public void testFindQueryVo(){
QueryVo vo=new QueryVo();
User user=new User();
user.setUsername("%王%");
vo.setUser(user);
//5.执行查询一个方法
List<User>users=userDao.findUserByVo(vo);
for (User u:users){
System.out.println(u);
}
}
}