Mybatis(二)
关于命名空间的两种绑定方式
1.命名空间可以绑定接口 可以是持久化类
2.无论绑定接口还是绑定类 都以类路径的形式绑定
3.绑定接口:相当于把xml当作接口的实现类
4.<select>
等标签的 id必须与接口中的方法同名!!
绑定接口的案例
1.项目架构
2.编写实体类
package com.iflytek.domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "UserInfo [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
toString()方法可以省略!!
3.编写UserDao接口
package com.iflytek.dao;
import java.util.List;
import com.iflytek.domain.User;
public interface UserDao {
/* 接口中只承诺方法,不实现
* ��mybatis����Ҫ����ʵ���࣬implement�˽ӿ�
* ���Ǵ�����Ӧ��Mapper�ļ� �˴���Ӧ����UserDaoMapper.xml*/
List<User> getAllUser();
User getOneById(int id);
int insertNewUser(User user);
int deleteUserById(int id);
int updateUser(User user);
}
insertNewUser()、deleteUserById()、updateUser()返回值类型可以为void
4.编写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文件:键值对的形式 -->
<!-- 相对路径从src开始寻找 -->
<properties resource="db.properties"></properties>
<!-- 给类取别名 是一个集合 可以有多个typeAlias-->
<typeAliases>
<!-- type:类名+包名 建议直接复制限定名 -->
<typeAlias type="com.iflytek.domain.User" alias="User"/>
</typeAliases>
<!-- 配置多个环境 default:当前使用的环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/><!-- 事务管理 -->
<dataSource type="POOLED"> <!-- 配置数据库连接池:存放连接 对程序来说本质就是一个数据源 -->
<property name="driver" value="${driver}"/><!-- value="com.mysql.jdbc.Driver" 写法也可以-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 将 UserDaoMapper.xml包含到主配置文件中-->
<mappers>
<mapper resource="com/iflytek/mapper/UserDaoMapper.xml"/>
</mappers>
</configuration>
5.编写UserDaoMapper.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.iflytek.dao.UserDao"><!-- 命名空间为接口 可以是持久化类 -->
<!-- 此处为接口 以类路径的形式绑定 相当于把xml当作接口的实现类 -->
<!-- 返回结果集 -->
<!-- <resultMap type="User" id="UserList">
<id column="id" property="id"/>id代表主键 column:表中的字段 property:实体类的属性
result:普通字段
<result column="username" property="username"/>
<result column="password" property="password"/>
</resultMap> -->
<!-- id必须与接口中的方法同名!! resultType:返回值类型 在mybatis主配置文件中已经取郭别名,此处可以直接用User代替com.iflytek.domain.User-->
<select id="getAllUser" resultType="User">
select * from user_info
</select>
<!-- parameterType:参数类型 int 同Integer #{id}:占位符-->
<select id=" getOneById" parameterType="int" resultType="User">
select * from user_info where id=#{id}
</select>
<insert id="insertNewUser" parameterType="User">
insert into user_info(username,password) value (#{username},#{password})
</insert>
<update id="updateUser" parameterType="User">
update user_info set username=#{username} , password=#{password} where id=#{id}
</update>
<delete id="deleteUserById" parameterType="Integer">
delete from user_info where id=#{id}
</delete>
</mapper>
6.在主配置文件中包含mapper文件
使用文件路径的方式
<mapper resource="文件路径/子路径/XXX.xml"/>
也可以<mapper class=""/>
7.编写一个测试类
package com.iflytek.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.io.ResolverUtil.Test;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.iflytek.domain.User;
public class MybatisTest {
/*从src路径开始查找*/
private static final String PATH = "mybatis-config.xml";
/* 创建SqlSession对象*/
private SqlSession session = null;
/* 初始化方法*/
public void init() throws IOException {
//字符流
Reader reader = Resources.getResourceAsReader(PATH);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
session = sessionFactory.openSession();
}
public void updateUser(User user) {
int id=session.update("updateUser", user);
session.commit();
System.out.println(id);
}
public int insertNewUser(User user) {
int id= session.insert("insertNewUser", user);
session.commit();
System.out.println(id);
return id;
/*
* return session.insert("insertNewUser", user);
* 不能使用上述返回方法 因为insert()方法需要提交
* 否则只存在缓存区内,关闭程序会导致发生回滚
* */
}
public int deleteUserById(int id) {
int idx = session.delete("deleteUserById", id);
session.commit();
System.out.println(idx);
return idx;
}
public List<User> getAllUser(){
/* session.selectList()参数与mapper中id对应 */
List<User> list=session.selectList("getAllUser");
return list;
}
public User getOneById(int id) {
return session.selectOne("getOneById", id);
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
MybatisTest test=new MybatisTest();
test.init();
/* 查询用户列表
* List<User> list=test.getAllUser();
* System.out.println(list);
* */
/*插入一条数据
* User user=new User(); user.setUsername("王娜2"); user.setPassword("123"); int
* i=test.insertNewUser(user); if(i==1) { System.out.println("插入数据成功!!"); }
*/
/*根据id删除某条数据
* test.deleteUserById(3);
*
* */
/*更新一条数据
* User user=new User(); user.setUsername("zhang"); user.setPassword("123");
* user.setId(2);
*
* test.updateUser(user);
*/
List<User> list=test.getAllUser();
System.out.println(list);
}
}
绑定接口和绑定持久化类的区别
1.绑定接口:id与方法名相同
2.绑定类:id可以随便取
附1:数据库和表设计
user_info表设计:
附2:db.properties文件示例
#MySql infomation
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/train?useUnicode=true&characterEncoding=UTF-8
username=root
password=
换成自己的数据库登录信息等!!
我的联系方式:QQ:1207787189
如您有问题可与我联系