简单案例

  • 在src下创建package com.chengyang.test,在其中创建类HelloMyBatis.java 用来测试
package com.chengyang.test;

import java.io.IOException;
import java.io.InputStream;

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 com.chengyang.bean.User;

public class HelloMyBatis {



@Test
//入门程序 通过Id 查询用户
public void Test1() throws IOException {
String resource="sqlMapConfig.xml";
//读取配置文件
InputStream in = Resources.getResourceAsStream(resource);
//需要使用sqlSessionFactoryBuilder
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//创建sqlSessionfactory
SqlSessionFactory ssf = ssfb.build(in);
//生产一个sqlSession
SqlSession session = ssf.openSession();
System.out.println(1);
//操作数据库
//参数一:sql语句,参数二:sql语句的参数
User user = session.selectOne("UserMapper.selectUserById",2);
System.out.println(user);
}
}

  • 在对应的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="UserMapper">

<!-- 通过Id查询User ? 变成了#{id}-->
<select id="selectUserById" parameterType="Integer" resultType="com.chengyang.bean.User">
select * from user where u_id = #{id}
</select>
</mapper>

这样我们就鞥查询数据库user表中u_id=2的用户数据了

  • 然后我们在src下导入配置文件 log4j.properties 用于生成日志
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

完成其他几种操作的简单案例

  • HelloMyBatis.java
package com.chengyang.test;

import java.io.IOException;
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 com.chengyang.bean.User;

public class HelloMyBatis {

@Test
//入门程序 通过Id 查询用户
public void Test1() throws IOException {
String resource="sqlMapConfig.xml";
//读取配置文件
InputStream in = Resources.getResourceAsStream(resource);
//需要使用sqlSessionFactoryBuilder
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//创建sqlSessionfactory
SqlSessionFactory ssf = ssfb.build(in);
//生产一个sqlSession
SqlSession session = ssf.openSession();
System.out.println(1);
//操作数据库
User user = session.selectOne("UserMapper.selectUserById",2);
System.out.println(user);

}

//通过姓名模糊查询含有 王 的user
@Test
public void Test2() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(in);
SqlSession session = ssf.openSession();
//System.out.println(1);
List<User> list=session.selectList("UserMapper.selectUserByName", "王");

for(User u:list) {
System.out.println(u);
}
}

//将用户插入user表中
@Test
public void Test3() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(in);
SqlSession session = ssf.openSession();

User user=new User();
user.setU_username("常明瑞");
user.setU_password("521998");
user.setU_sex("1");
user.setU_createTime(new Date());
user.setU_cid(1);

session.insert("UserMapper.insertUser", user);
session.commit();
}
//更改u_id为13 的用户
@Test
public void Test4() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(in);
SqlSession session = ssf.openSession();

User user=new User();
user.setU_id(13);
user.setU_username("蔡志龙");

session.update("UserMapper.updateUser", user);
session.commit();
}

//删除 u_id 为13 的用户
@Test
public void Test5() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(in);
SqlSession session = ssf.openSession();


session.delete("UserMapper.deleteUserById",13);
session.commit();
}
}

需要注意的地方,除了在使用查询操作的时候,其他的操作都需要使用 session.commit(); 将事务关闭

  • 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="UserMapper">


<!-- 通过Id查询User ? 变成了#{id}-->
<select id="selectUserById" parameterType="Integer" resultType="com.chengyang.bean.User">
select * from user where u_id = #{id}
</select>

<!-- #{}占位符 尽量选用占位符解决问题 -->
<!-- ${} 字符串拼接 容易受到攻击,下面使用 "%"#{name}"%" 代替 '%${value}%'-->


<!-- 通过姓名模糊查询 ?变成了"%${value}%"-->
<select id="selectUserByName" parameterType="String" resultType="com.chengyang.bean.User">
<!-- select * from user where u_username like '%${value}%' -->
select * from user where u_username like "%"#{name}"%"
</select>

<!-- 添加USer对象 -->
<insert id="insertUser" parameterType="com.chengyang.bean.User">
insert into user values(null,#{u_username},#{u_password},#{u_sex},#{u_createTime},#{u_cid})
</insert>

<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.chengyang.bean.User">
update user set u_username=#{u_username} where u_id=#{u_id}
</update>

<delete id="deleteUserById" parameterType="Integer">
delete from user where u_id=#{u_id}
</delete>
</mapper>

需要注意的地方

  • 增删改查对应 insert delete update select
  • 包名(UserMapper)+id(selectUserById) 与HelloMyBatis中使用的方法的参数一一致
  • parameterType的值和参数二一致
  • resultType的值与返回值类型一致

使用MyBatis开发Dao层

这里我们仍然是使用 根据id查询用户大方法为例

  • 在src下创建package com.chengyang.dao ,在下面创建接口UserDao
package com.chengyang.dao;

import com.chengyang.bean.User;

public interface UserDao {


//根据id查询用户接口
public User getUserById(Integer id);
}

  • 创建UserDao的实现类UserDaoImpl.java
package com.chengyang.dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.chengyang.bean.User;

public class UserDaoImpl implements UserDao {


//sqlSession 工厂
private SqlSessionFactory ssf;

//通过构造器给ssf赋值
public UserDaoImpl(SqlSessionFactory ssf) {
this.ssf = ssf;
}

@Override
public User getUserById(Integer id) {


//生产一个sqlSession
SqlSession session = ssf.openSession();
//System.out.println(1);
//操作数据库
return session.selectOne("UserMapper.selectUserById",id);
}

}

我们把之前的根据用户id查询的Test方法稍微修改就可以得到一个Dao层的getUserById方法

  • 我们UserDaoImpl中的方法是需要 SqlSessionFactory实例的,我们将这个实例作为UserDaoImpl的构造器参数(单例模式),然后将SqlSessionFactory实例化的方法放进Service层,下面我们在test中创建UserDaoTest.java作为service层
package com.chengyang.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.chengyang.bean.User;
import com.chengyang.dao.UserDao;
import com.chengyang.dao.UserDaoImpl;

public class UserDaoTest {

//SqlSession 工厂
private static SqlSessionFactory ssf;

//利用静态代码块获取SqlSessionFactory
static {
String resource="sqlMapConfig.xml";
InputStream in;
try {
in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
ssf = ssfb.build(in);
//关闭流
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}


@Test
public void DaoTest() {
UserDao dao=new UserDaoImpl(ssf);
User user = dao.getUserById(1);
System.out.println(user);
}
}