mybatis:注意点
1:关联查询的时候在被动方必须写别名,
2:limit 分页必须¥{} 美元符号
3:在bean里面必须描述关联关系,说白了就是在一方bean里面写list<Obj> 或者在多方bean中写Obj obj属性并生成setter,getter方法
4:通过Bean的setter getter 方法设值值或者取值,必须注意:必须要和数据库字段保持一致,否则就必须写写别名或者在property中映射
<id column="t_id" property= "teaId"/>
<result column ="t_name" property="teaName"/>
===============================================================================================
<select id= "findStudents" resultType ="Student" >
select
stu_id as stuId,
stu_name as stuName,
stu_class as stuClass
from student
</select>
一、返回值类型:1、返回Bean的情况下 如果数据库表的字段于bean对象属性不一致的时候必须 设置两者保持一致
2、返回java.util.Map之类的东西时,只要却包数据库字段正确就OK
二、
<!-- 别名映射的另外一种配置 -->
< typeAliases>
<package name ="com.shubiao.mybatis.bean"/> <!-- 这样配置他的默认别名就是:类名 -->
</ typeAliases>
凡是用到用到比如:com.shubiao.mybatis.bean.User 的时候都用类名代替
三、
<!-- 事物类型 -->
<transactionManager type ="MANAGED"/> <!-- MANAGED/JDBC:注如果使用MANAGED,则无需关心事物提交和关闭的情况
如果使用JDBC的话需要手动提交事物,和关闭连接,否则它会一直被占用 -->
四、
<!-- sql配置文件的解析和注入 -->
< mappers>
<mapper resource= "com/shubiao/mybatis/dao/UserMapper.xml" />
<mapper resource= "com/shubiao/mybatis/dao/StudentCourseMapper.xml" />
<mapper resource= "com/shubiao/mybatis/dao/StudentTeacherMapper.xml" />
</ mappers>
五、
<select id= "findUser2" resultType ="User" parameterType="User">
select userId,userUsername,userPassword,user_email as userEmail from user where userId=#{userId}
</select>
<!-- 增,删,改 -->
<!-- useGeneratedKeys="true"
keyProperty="id"
以上参数的作用:如果有需求需要返回id的时候,并且表里面也是自动增长的情况下,保存数据需要设置这两个属性 -->
<insert id= "saveUser" parameterType ="User" useGeneratedKeys="true"
keyProperty="id">
insert into user (
userUsername,
userPassword,
userEmail)
values(
#{userUsername},
#{userPassword},<!-- 由于此处是用User对象的get方法得到的数据,所以名称一定要与对象属性保持严格一致 -->
#{userEmail})
</insert>
六、在不想影响Bean的情况下可以建一个Params参数类来解决参数注入的问题
<!-- 模糊查询加排序 ,返回User-->
<select id= "findUser" parameterType ="Params" resultType= "User"><!-- 下面的模糊查询条件和排序都必须使用美元符号,切记:使用#就是? 号,使用$就是替换 -->
select userId,userUsername,userPassword,user_email as userEmail from user where userUsername like '%${userUsername}%'
and userPassword=#{userPassword} order by ${userId}
</select>
<!-- 模糊查询加排序,返回Map -->
<select id= "findUserMap" parameterType ="Params" resultType= "java.util.Map"><!-- 下面的模糊查询条件和排序都必须使用美元符号,切记:使用#就是? 号,使用$就是替换 -->
select userId,userUsername,userPassword,user_email as userEmail from user where userUsername like '%${userUsername}%'
and userPassword=#{userPassword} order by ${userId}
</select>
<!-- count求总数 -->
<select id= "findCount" resultType ="int">
select count(0) from user; <!-- 此处可以写第几个参数,可以写表中的某个字段:推荐使用唯一字段 -->
</select>
第一步: 导入数据库的驱动包和
mybatis-3.3.0-SNAPSHOT.jar
mybatis-spring-1.2.1.jar
第二步:
<?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 resource="com/config/db/db.properties"></properties> -->
<!-- 资源文件的引入 -->
<properties resource="db.properties"></properties>
<!-- 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。 -->
<settings>
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
<!-- 别名的映射 -->
<typeAliases>
<!--<typeAlias type="com.tz.bean.User" alias="User"/> -->
<package name="com.tz.bean"/><!-- 那么它的默认别名:就是类名 -->
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 事务类型 增,删,改-->
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
<!-- 数据源 POOLED,它是一个线程池(放入全部都是连接对象),监听连接的获取,关闭-->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- sql配置文件的解析和注入,放入sqlsessionFactory,就 放入map,就放入内存中 -->
<mappers>
<mapper resource="com/tz/dao/UserMapper.xml"/>
</mappers>
</configuration>
第三步:
/**
* tzdesk系统平台
* mybatis
* com.tz.bean
* User.java
* 创建人:xuchengfei
* 时间:2015年11月18日-下午10:13:38
* 2015潭州教育公司-版权所有
*/
package com.tz.bean;
import java.util.Date;
/**
*
* User 创建人:xuchengfei 时间:2015年11月18日-下午10:13:38
*
* @version 1.0.0
*
*/
public class User {
/* 主键 */
private Integer id;
// 用户名
private String username;
// 密码
private String password;
// 账号
private String account;
// 手机
private String telephone;
// 身份证
private String idcard;
// 性别:0女1男
private Integer male;
// 生日
private Date birthday;
// 邮箱
private String email;
// 地址
private String address;
// 年龄
private Integer age;
// 创建时间
private Date createTime;
// 删除状态0未删除1删除
private Integer isDelete;
// 更新时间
private Date updateTime;
// 报名老师
private Integer teacherId;
// 学科ID
private Integer subjectId;
// 状态 0未发布1发布
private Integer status;
// 1老师2学生
private Integer type;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getIdcard() {
return idcard;
}
public void setIdcard(String idcard) {
this.idcard = idcard;
}
public Integer getMale() {
return male;
}
public void setMale(Integer male) {
this.male = male;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Integer getIsDelete() {
return isDelete;
}
public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Integer getTeacherId() {
return teacherId;
}
public void setTeacherId(Integer teacherId) {
this.teacherId = teacherId;
}
public Integer getSubjectId() {
return subjectId;
}
public void setSubjectId(Integer subjectId) {
this.subjectId = subjectId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
}
第四步:建立一个bean对应的sql配置文件 UserMapper.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.tz.bean.userMapper">
<!-- 所有的增,删,查,改都在这里进行定义 -->
<select id="findUsers" resultType="User">
SELECT id,username,password FROM tz_user
</select>
<!-- 增,删,改 int-->
<insert id="saveUser" useGeneratedKeys="true" keyProperty="id" parameterType="User">
INSERT tz_user(
username,
password,
account,
telephone,
idcard,
is_delete,
male,
birthday,
email,
address,
teacher_id,
subject_id,
age,
status,
type
)VALUES(
#{username},
#{password},
#{account},
#{telephone},
#{idcard},
#{isDelete},
#{male},
#{birthday},
#{email},
#{address},
#{teacherId},
#{subjectId},
#{age},
#{status},
#{type}
)
</insert>
<!-- 更新 -->
<update id="updateUser" parameterType="User">
UPDATE tz_user SET username = #{username} WHERE id = #{id}
</update>
<!-- 删除 -->
<!-- <delete id="deleteUser" parameterType="int"> -->
<!-- delete from tz_user where id = #{0} -->
<!-- </delete> -->
<delete id="deleteUser" parameterType="User">
delete from tz_user where id = #{id}
</delete>
<delete id="deleteUser2" parameterType="java.util.Map">
delete from tz_user where username=#{username} and account=#{account}
</delete>
</mapper>
第五步:定义测试类:
/**
* tzdesk系统平台
* mybatis
* com.test.mybatis
* TestMyatisSessionFactory.java
* 创建人:xuchengfei
* 时间:2015年11月18日-下午10:02:51
* 2015潭州教育公司-版权所有
*/
package com.test.mybatis;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.Before;
import org.junit.Test;
import com.tz.bean.User;
/**
*
* TestMyatisSessionFactory
* 创建人:xuchengfei
* 时间:2015年11月18日-下午10:02:51
* @version 1.0.0
*
*/
public class TestMyatisSessionFactory {
private SqlSessionFactory sessionFactory;
@Before
public void before() throws IOException{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void handler() throws IOException{
SqlSession session = sessionFactory.openSession();
List<User> users = session.selectList("com.tz.bean.userMapper.findUsers");
for (User user : users) {
System.out.println("==============="+user.getUsername());
}
}
@Test
public void saveUser(){
SqlSession session = sessionFactory.openSession();
User user = new User();
user.setUsername("keke");
user.setPassword("111111");
user.setAccount("keke");
user.setTelephone("23423423423423");
user.setIdcard("324565543");
user.setIsDelete(0);
user.setMale(1);
user.setBirthday(new Date());
user.setEmail("2346546@qq.com");
user.setAddress("是打发是打发大");
user.setTeacherId(1);
user.setSubjectId(1);
user.setAge(30);
user.setStatus(1);
user.setType(2);
int count =session.insert("com.tz.bean.userMapper.saveUser", user);
System.out.println(count>0?"保存成功":"保存失败");
//session.close();
}
@Test
public void updateUser(){
SqlSession session = sessionFactory.openSession();
User user = new User();
user.setId(1);
user.setUsername("柯柯");
int count =session.insert("com.tz.bean.userMapper.updateUser", user);
System.out.println(count>0?"更新成功":"更新失败");
//session.close();
}
@Test
public void deleteUser(){
SqlSession session = sessionFactory.openSession();
// int count =session.delete("com.tz.bean.userMapper.deleteUser", 13);
// System.out.println(count>0?"删除成功":"删除失败");
// User user = new User();
// user.setId(14);
// int count =session.delete("com.tz.bean.userMapper.deleteUser", user);
// System.out.println(count>0?"删除成功":"删除失败");
//session.close();
Map<String, Object> map = new HashMap<String, Object>();
map.put("username","keke");
map.put("account", "keke");
int count = session.delete("com.tz.bean.userMapper.deleteUser2", map);
System.out.println(count>0?"删除成功":"删除失败");
}
}
注意点:
mybatis它是一个半面向对象orm框架,让我们重新回归sql最本真的写法。通过一个配置文件。去定义数据的连接的
相关信息,比如事件,插件,配置装载,事务的自动提交,缓存,数据类型处理等。通过解析配置装载到SqlsessionFactory
进行初始化,然后通过sqlsessionFactory获取会话对象SqlSession,获取连接对象,通过sqlSession中定义的api方法
和Mapper对象进行关联处理数据中增,删,查,改。比如
//查询单个实体
T session.selectOne(String mapperKey)
T session.selectOne(String mapperKey,Object params)
//查询返回多个实体
List<T> selectList(String mapperKey)
List<T> selectList(String mapperKey,Object params)
//保存方法
int insert(String mapperKey)
int insert(String mapperKey,Object params)
//修改方法
int update(String mapperKey)
int update(String mapperKey,Object params)
//删除方法
int delete(String mapperKey)
int delete(String mapperKey,Object params)
//返回map
Map<T,K> selectMap(String mapperKey)
Map<T,K> selectMap(String mapperKey,Object params)
mapperKey=是sql配置文件的命名空间+id
通过以后一些可以实现实现增删查改操作。如果你配置事务管理器是JDBC的话,在打开连接的时候,比如收到设置自动事务提交,sessionFactory.openSession(true),如果
你设置的是 MANAGED,自动事务提交.
<!-- 事务类型 增,删,改-->
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>