Mybatis: 在JDBC的基础上进行完美的封装,保留了JDBC动态sql的编写,优化了参数的绑定和返回指的封装
sqlMapperConfig.xml
<?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>
<!---声明数据库连接配置-->
<environments default="development">
<environment id="development">
<!--事务管理 : 默认 取消了单条事物提交-->
<transactionManager type="JDBC"/>
<!--数据源配置-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_gm?useSSL=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--
单独采用 mapper文件实现数据库操作
<mapper resource="com/zhongruan/mapper/*.xml"/>-->
<!--需要根据引用接口的形式进行调用-->
<mapper class="com.zhongruan.dao.StudentDao"/>
<mapper class="com.zhongruan.dao.UserDao"/>
</mappers>
</configuration>
实体类
package com.zhongruan.bean;
public class Student {
private int id;
// mapper 文件中的{}里与这里一样
private String name;
private String sex;
private String age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Student() {
}
public Student(int id, String name, String sex, String age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
'}';
}
}
mapper文件的增删改查
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--当不连接dao层时,命名空间是本身-->
<mapper namespace="StudentMapper" >
<!-- 测试student增加
动态sql: id值是sql引用名
参数的绑定 1、需要制定参数的类型
-->
<insert id="addStu" parameterType="com.zhongruan.bean.Student">
insert into tb_student(id,name ,sex,age)values (#{id},#{name},#{sex},#{age})
</insert>
<delete id="delStu" parameterType="Integer">
delete from tb_student where id = #{id}
</delete>
<update id="updStu" parameterType="com.zhongruan.bean.Student">
update tb_student set name=#{name},sex=#{sex},age=#{age} where id = #{id}
</update>
<select id="getStuById" parameterType="Integer" resultType="com.zhongruan.bean.Student">
-- select id, name as StuName, sex as StuSex,age as StuAge
select * from tb_Student where id =#{id}
</select>
</mapper>
测试
package com.zhongruan.test;
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 java.io.IOException;
import java.io.InputStream;
public class Test1 {
@Test
public void test01() throws IOException {
// 1、先获取会话工厂构造器 sqlSessionFactorybuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 指定连接配置信息文件
InputStream is = Resources.getResourceAsStream("sqlMapperConfig.xml");
// 2、根据构造器, 获取会话工厂
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
System.out.println("连接 "+session);
}
@Test
public void test02() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream is = Resources.getResourceAsStream("sqlMapperConfig.xml");
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
System.out.println("连接 "+session);
// 如何测试 id = "addStu" 这个动态sql
int r1 = session.insert("StudentMapper.addStu");
if (r1>0){
System.out.println("增加成功");
}
else {
System.out.println("增加失败");
}
System.out.println("结果为:"+r1);
session.commit();
session.close();
}
}
dao层
package com.zhongruan.dao;
import com.zhongruan.bean.Student;
import org.apache.ibatis.annotations.Param;
import java.awt.*;
import java.util.List;
import java.util.Map;
public interface StudentDao {
// 对学生类的 增删改查
int addStu(Student student);
int delStu(Integer id);
int updStu(Student student);
Student getStuById(Integer id);
// 测试参数绑定
int addStu2(@Param(“id”) int id, @Param(“name”) String name,
@Param(“sex”) String sex, @Param(“age”) String age);
int addStu3(List list);
int addStu4(Map map);
}
当只使用mybatis框架时,mapper文件与dao层平级都处于dao包下
动态sql语句根据不同的参数类型,编写sql语句
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--给Mapper绑定接口-->
<mapper namespace="com.zhongruan.dao.StudentDao" >
<!-- 测试student增加
动态sql: id值是sql引用名
参数的绑定 1、需要制定参数的类型
-->
<insert id="addStu" parameterType="com.zhongruan.bean.Student">
insert into tb_student(id,name ,sex,age)values (#{id},#{name},#{sex},#{age})
</insert>
<delete id="delStu" parameterType="Integer">
delete from tb_student where id = #{id}
</delete>
<update id="updStu" parameterType="com.zhongruan.bean.Student">
update tb_student set name=#{name},sex=#{sex},age=#{age} where id = #{id}
</update>
<select id="getStuById" parameterType="Integer" resultType="com.zhongruan.bean.Student">
-- select id, name as StuName, sex as StuSex,age as StuAge
select * from tb_Student where id =#{id}
</select>
<!-- Mapper中动态sql各种参数形式的绑定传递
1、基本类型:单个 或者 多个
单个参数的传递声明 parameterType ="java.lang.Integer"
多个参数的声明: ibatis 注解 @Param.
2、引用类型: 单个对象 或者 多个对象
单个对象的声明 parameterType="com.zhongruan.bean.Student"
多个对象的声明也可以使用注解
3、数组 或者 集合:单个数组 单个List 或者Map
-->
<insert id="addStu2">
/*#{@Param()}*/
insert into tb_student (id,name,sex,age) values (#{id},#{name},#{sex},#{age})
</insert>
<insert id="addStu3" parameterType="java.util.ArrayList">
insert into tb_student (id,name,sex,age)
values (
<foreach collection="list" item="item1" separator=",">
#{item1}
</foreach>
)
</insert>
<insert id="addStu4" parameterType="Map">
insert into tb_student(id,name,sex,age)
values (
#{id},#{name},#{sex},#{age}
)
</insert>
</mapper>
测试类
package com.zhongruan.test;
import com.zhongruan.bean.Student;
import com.zhongruan.dao.StudentDao;
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 java.io.IOException;
import java.io.InputStream;
import java.util.*;
public class Test3 {
@Test
public void test01() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream is = Resources.getResourceAsStream("sqlMapperConfig.xml");
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
Student student = new Student(4,"小学","男","18");
int i = studentDao.addStu(student);
session.commit();
session.close();
System.out.println(i);
}
@Test
public void test02() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream is = Resources.getResourceAsStream("sqlMapperConfig.xml");
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
int i = studentDao.addStu2(5,"小鱼","男","18");
session.commit();
session.close();
System.out.println(i);
}
@Test
public void test03() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream is = Resources.getResourceAsStream("sqlMapperConfig.xml");
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
List stuList = new ArrayList();
stuList.add(8);
stuList.add("小站");
stuList.add("男");
stuList.add("18");
int i = studentDao.addStu3(stuList);
session.commit();
session.close();
System.out.println(i);
}
@Test
public void test04() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream is = Resources.getResourceAsStream("sqlMapperConfig.xml");
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
Map map = new HashMap();
map.put("id","9");
map.put("nam","笑花");
map.put("sex","男");
map.put("age","18");
int i = studentDao.addStu4(map);
session.commit();
session.close();
System.out.println(i);
}
}
新建User类,编写根据返回值类型不同的动态sql语句
package com.zhongruan.bean;
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserDao层
package com.zhongruan.dao;
import com.zhongruan.bean.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserDao {
// 查询功能 针对 User
int getCount();
User getUserById(@Param("id") int id);
List<User> getUsers();
}
mapper文件
一定要用 注释否则会被解读
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--给Mapper绑定接口-->
<mapper namespace="com.zhongruan.dao.UserDao" >
<!-- 分别编写dao的动态sql-->
<select id="getCount" resultType="Integer">
select count(*) from tb_user
</select>
<select id="getUserById" resultType="com.zhongruan.bean.User">
select id,username,password
from tb_user
where id = #{id}
</select>
<select id="getUsers" resultMap="RM_Users">
select id,username,password from tb_user
</select>
<!--定义封装集合模型-->
<resultMap id="RM_Users" type="com.zhongruan.bean.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
</resultMap>
</mapper>
测试类
package com.zhongruan.test;
import com.zhongruan.bean.User;
import com.zhongruan.dao.UserDao;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test4 {
private SqlSessionFactoryBuilder builder;
private InputStream is;
private SqlSessionFactory factory;
private SqlSession session ;
private UserDao userDao;
@Before
public void before() throws IOException {
builder = new SqlSessionFactoryBuilder();
is = Resources.getResourceAsStream("sqlMapperConfig.xml");
factory = builder.build(is);
session = factory.openSession();
userDao = session.getMapper(UserDao.class);
}
@Test
public void test01() throws IOException {
before();
int i = userDao.getCount();
User user = userDao.getUserById(7);
System.out.println("结果为"+i+"。。。"+user.getId()+user.getUsername()+user.getPassword());
List<User> usersList = userDao.getUsers();
for (User user1:usersList) {
System.out.println(user1);
}
}
}
MyBatis编写完成