这里我新建了SqlMapConfig.xml文件。里面的代码如下(dtd外部文件头部的代码解释在第一节讲了就不重复了)
<?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-->
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/user?characterEncoding = UTF-8"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</properties>
<!--使用typeAliases配置别名-->
<typeAliases>
<!--typeAlias用于配置别名。type属性指定的是实体类全限定类名 alias属性指定别名-->
<!--<typeAlias type="com.demain.User" alias="user"></typeAlias>-->
<!--用于指定要配置别名的包 ,当指定之后,改包下的实体类都会注册别名,类名就是别名,不再区分大小写-->
<package name="com.demain" ></package>
</typeAliases>
<!--//配置环境-->
<environments default="mysql">
<!--//配置mysql的环境-->
<environment id="mysql">
<!--//配置事务-->
<transactionManager type="jdbc"></transactionManager>
<!--//配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
<!--配置映射文件的位置-->
<mappers>
<mapper resource="com/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
在其中我添加了两个标签,我现在解释一下,虽然注释都已经写出来了。
<properties></properties>
此标签是可以将属性名外部配置且可动态替换的,在这里主要将dataSource里的4个连接属性从外部引用,而在其他地方用到时也可以直接用${}来引用,更加的方便。
<typeAliases></typeAliases>
此标签是可以用来配置包的别名,在dao的配置文件中,有些属性需要用到全限定类名,而配置别名以后即可直接用自己定义的别名去代替所属的全限定类名,更加的方便。有三种配置方式,具体方式请参考下一节内容。
到此主配置文件已经是完成了
即是在主配置文件中这句话引用了配置文件
<!--配置映射文件的位置-->
<mappers>
<mapper resource="com/dao/IUserDao.xml"></mapper>
</mappers>
那么要在com包下创建dao包,再去新建一个file,名称写为IUserDao.xml,dtd头部信息将第一节讲过的代码复制到头部即可。将下面代码敲入
<?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.dao.IUserDao">
<!--配置查询结果的列名和实体类的属性名的对应关系-->
<resultMap id="userMap" type="com.demain.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>
<!--//查询所有-->
<select id="findAll" resultMap="userMap">
select * from user;
</select>
<!--保存配置-->
<insert id="saveUser" parameterType="user">
insert into user(username , address , sex , birthday) values(#{userName} , #{userAddress} ,
#{userSex} , #{userBirthday});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="user">
update user set username = #{userName} , address = #{userAddress} , sex = #{userSex} ,
birthday = #{userBirthday} where id = #{userId}
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id = #{id}
</delete>
<!--查询一个用户-->
<select id="findById" parameterType="Integer" resultMap="userMap">
select * from user where id = #{id}
</select>
<!--根据name模糊查询用户-->
<select id="findByName" parameterType="string" resultMap="userMap">
select * from user where username like concat ('%', #{userName}, '%')
<!--select * from user where username like '%{$username}%'-->
</select>
<!--获取用户的总记录条数-->
<select id="findTotal" resultType="int">
select count(id) from user
</select>
</mapper>
现在来讲一下其中用到的一些没讲过的标签和属性
<resultMap></resultMap>
这个标签是用来规范配置查询结果的列名和实体类的属性名的对应关系,在进行CRUD中的查询语句,具有的返回值是user类型的,就要引用这个resultMap来规范返回值的类型。id为主键,result为剩下表中元素。
resultType
这个属性是代表着返回值的类型
parameterType
这个属性是代表着参数的类型
resultMap
这个属性是代表着引用的resultMap的id
package com.demain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer userId;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
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 String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userAddress='" + userAddress + '\'' +
", userSex='" + userSex + '\'' +
", userBirthday=" + userBirthday +
'}';
}
}
package com.itheima.dao;
import com.demain.User;
import java.util.List;
//用户的持久层接口
public interface IUserDao {
//查询所有用户
List<User> findAll();
//保存方法
void saveUser(User user);
//更新操作
void updateUser(User user);
//删除操作
void deleteUser(Integer id);
//查询一个User
User findById(Integer id);
//根据名字模糊查询User
List<User> findByName(String username);
//查询总用户数
int findTotal();
}
里面包含了CURD的所有操作,增删改查外加利用ID查询,name模糊查询,以及查询总记录条数的方法接口。
package com.test;
import com.dao.IUserDao;
import com.demain.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;
//测试Mybatis的CRUD操作
public class MybatisTest {
private InputStream is;
private SqlSession sqlSession;
private IUserDao userDao;
//用于在测试方法执行之前执行
@Before
//通用工具方法
public void init()throws Exception{
//1.获取配置文件流
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.生成SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.生成SqlSession
sqlSession = factory.openSession();
//4.生成代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
//用于测试方法之后运行
@After
public void destroy()throws Exception{
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
is.close();
}
//查询所有
@Test
public void testFindAll(){
//执行查询所有方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
//测试保存方法
@Test
public void testSave(){
User user = new User();
user.setUserName("heihei");
user.setUserAddress("广东广州");
user.setUserSex("男");
user.setUserBirthday(new Date());
//5.执行保存方法
userDao.saveUser(user);
}
//测试更新方法
@Test
public void updateUser(){
User user = new User();
user.setUserId(53);
user.setUserName("wujunwei");
user.setUserAddress("广东非洲");
user.setUserSex("男");
user.setUserBirthday(new Date());
userDao.updateUser(user);
}
//测试删除方法
@Test
public void deleteUser(){
userDao.deleteUser(53);
}
//测试查询一个用户方法
@Test
public void findById(){
User user = userDao.findById(51);
System.out.println(user);
}
//根据name模糊查询
@Test
public void findByName(){
List<User> users = userDao.findByName("people");
for(User user : users){
System.out.println(user);
}
}
//查询总记录数
@Test
public void testFindTotal(){
int count = userDao.findTotal();
System.out.println(count);
}
}