User类
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User {
private int id;
private String username; // 用户姓名
private String sex; // 性别
private Date birthday; // 生日
private String address; // 地址
private List<Orders> ordersList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
配置User.xml
namespace
命名空间意于简单地用更长的完全限定名来隔离语句
<mapper namespace="test">
</mapper>
增、删、改、查
id:SQL语句的唯一标识符
parameterType:指定传入参数类型
resultType:返回结果类型
#{}:占位符,起占位作用,无SQL注入风险。如果传入的是基本数据类型String
,long
,double
,int
,boolean
等,#{}中的变量名称随意写;如果传入的是pojo类型,那么**#{}中的变量名称必须是pojo中对应的属性、属性...**
${}:拼接符,有SQL注入的风险。字符串原样拼接,如果传入的参数是String
,long
,double
等基本数据类型,那么**${}中的变量名必须是 value**
<insert id="insertUser" parameterType="wangfei910.pojo.User" >
<!-- 执行select LAST_INSERT_ID()数据库函数,返回自增的主键
keyProperty:将返回的主键传入参数的Id中保存
order:当前函数相对于insert语句的执行顺序,在insert前执行是BEFORE,在insert后执行是AFTER
resultType:id的类型,也就是keyProperties中属性的类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<delete id="delUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUserById" parameterType="wangfei910.pojo.User">
update user set username=#{username} where id=#{id}
</update>
<select id="findUserById" parameterType="java.lang.Integer" resultType="wangfei910.pojo.User">
select * from user where id=#{id}
</select>
<select id="findUserByUserName" parameterType="java.lang.String" resultType="wangfei910.pojo.User">
select * from user where username like '%${value}%'
</select>
配置SqlMapConfig.xml
配置环境environments
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<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>
尽管可以配置多个环境,每个SqlSessionFactory
实例只能选择其一,每个数据库对应一个SqlSessionFactory
实例
关键点:
- 默认的环境ID
default="development"
- 每个
environment
元素定义的环境IDid="development"
- 事务管理器
type="JDBC|MANAGED"
,在使用Spring+MyBatis时,Spring模块会使用自带的管理器 - 数据源的配置
type="POOLED|UNPOOLED|JNDI"
事务管理器:
-
事务工厂接口
public interface TransactionFactory { void setProperties(Properties props); Transaction newTransaction(Connection conn); Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit); }
-
XML中的配置在实例化后会被传递给
setProperties()
方法public interface Transaction { Connection getConnection() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; Integer getTimeout() throws SQLException; }
加载配置文件
<mappers>
<mapper resource="User.xml"/>
</mappers>
MyBatis配置加载顺序:
- 在
properties
元素体内的属性首先被读取 - 然后根据
properties
元素中的resource
属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性 - 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
测试
每个基于MyBatis的应用都是以一个SqlSessionFactory
的实例为中心的,SqlSessionFactory
可以通过SqlSessionFactoryBuilder
获得,SqlSessionFactoryBuilder
则可以从XML配置文件构建出SqlSessionFactory
的实例。
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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.Test;
import wangfei910.pojo.User;
public class UserTest {
@Test
public void testFindUserById() throws Exception{
String resource="SqlMapConfig.xml";
//通过核心配置将文件读取进来
InputStream inputStream= Resources.getResourceAsStream(resource);
//通过核心配置文件输入流来创建会话工厂
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession openSession=factory.openSession();
//所调用的SQL语句;namespace+.+SQL的ID
User user= openSession.selectOne("test.findUserById",1);
System.out.println(user);
//关闭会话
openSession.close();
}
下一篇:Mybatis学习笔记[4]之XML映射文件 https://blog.youkuaiyun.com/Rabbit_Judy/article/details/80849280