原始dao开发方式
原始dao开发需要开发者编写dao接口和dao实现类。
1.编写dao接口和方法声明
2.编写dao实现类,实现dao接口,需要声明SqlSessionFactory且构造方法注入。
3.编写映射文件,且在配置文件中导入映射文件。
4.编程测试
代码实现:
目录结构:

dao接口(UserDao.java):
package com.mybatis02.dao;
import com.mybatis02.pojo.UserPojo;
import java.util.List;
public interface UserDao {
UserPojo selectById(Integer sno) throws Exception;
List<UserPojo> selectByName(String sname) throws Exception;
int insertUser(UserPojo user) throws Exception;
int updateUser(UserPojo user) throws Exception;
int deleteUser(Integer id) throws Exception;
}
dao的实现类(UserDaoImpl.java):
package com.mybatis02.impl;
import com.mybatis02.dao.UserDao;
import com.mybatis02.pojo.UserPojo;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
}
@Override
public UserPojo selectById(Integer sno) throws Exception {
SqlSession session = factory.openSession();
UserPojo userPojo = session.selectOne("user.selectById",sno);
session.close();
return userPojo;
}
@Override
public List<UserPojo> selectByName(String sname) throws Exception {
SqlSession session = factory.openSession();
List<UserPojo> user = session.selectList("user.selectByName",sname);
return user;
}
@Override
public int insertUser(UserPojo user) throws Exception {
SqlSession session = factory.openSession();
int a = session.insert("user.insertUser",user);
session.commit();
session.close();
return a;
}
@Override
public int updateUser(UserPojo user) throws Exception {
SqlSession session = factory.openSession();
int a = session.insert("user.updateUser",user);
session.commit();
session.close();
return a;
}
@Override
public int deleteUser(Integer sno) throws Exception {
SqlSession session = factory.openSession();
int a = session.insert("user.deleteUser",sno);
session.commit();
session.close();
return a;
}
}
映射文件(UerDao.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">
<!-- 分类sql语句,可以自定义 -->
<mapper namespace="user">
<!-- select标签写查询
id: 指定标签的唯一标识
parameterType:指定输入参数的类型
#{} : 向sql中注入参数值, 相当于 ps的? , 如果参数是简单类型 , 花括号中可以是任意值
resultType: 指定查询到的结果的输出映射.
-->
<select id="selectById" parameterType="java.lang.Integer" resultType="com.mybatis02.pojo.UserPojo">
SELECT * FROM student WHERE sno=#{sno}
</select>
<!--
${} : 把参数原封不动拼接到sql中 , 有sql注入问题.
${} : 参数值如果是简单类型 ,花括号中只能用value
resultType : 如果输出映射为集合,只指定集合中元素的类型
-->
<select id="selectByName" parameterType="java.lang.String" resultType="com.mybatis02.pojo.UserPojo">
SELECT * FROM student WHERE sname LIKE '%${value}%'
</select>
<!--
#{} : 如果参数是pojo类型 , 可以用pojo类的属性名获得属性值.
-->
<insert id="insertUser" parameterType="com.mybatis02.pojo.UserPojo">
<!-- 查询且返回主键
keyProperty:指定保存主键的属性名
order: 指定查询主键的sql语句在插入语句的前面还是后面执行
-->
<!--<selectKey keyProperty="sno" order="AFTER" resultType="java.lang.Integer">
/*SELECT tuser_id.NEXTVAL FROM dual*/
/*自增主键,因student表未设置主键,所以会报错*/
</selectKey>-->
INSERT INTO student VALUES (#{sno},#{sname},#{age},#{sex},#{addr})
</insert>
<update id="updateUser" parameterType="com.mybatis02.pojo.UserPojo">
UPDATE student SET
sname=#{sname},
age=#{age},
sex=#{sex},
addr=#{addr}
WHERE sno=#{sno}
</update>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from student where sno=#{sno}
</delete>
</mapper>
log4j.properties属性配置文件(log4j.properties):
# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
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
mybatis框架的核心配置文件(mybatis.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>
<!--数据库配置,default表示默认采用哪一个数据库环境-->
<environments default="development">
<!--id为development表示开发环境数据库,id为product表示生产环境数据库-->
<environment id="development">
<!--使用JDBC事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--连接池配置,type为POOLED采用连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql_test"/>
<property name="username" value="root"/>
<property name="password" value="13474501003"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="com.mybatis02.impl/UserDao.xml"></mapper>
</mappers>
</configuration>
junit测试(test.java):
package com.mybatis02.test;
import com.mybatis02.dao.UserDao;
import com.mybatis02.impl.UserDaoImpl;
import com.mybatis02.pojo.UserPojo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class test {
@Test
public void test() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
System.out.println(userDao.selectById(104));
}
}
数据库:

结果:
查询sno=104的信息

再次编写Junit单元测试(test.java):
package com.mybatis02.test;
import com.mybatis02.dao.UserDao;
import com.mybatis02.impl.UserDaoImpl;
import com.mybatis02.pojo.UserPojo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class test {
@Test
public void test() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//
System.out.println(userDao.selectByName("贾"));
}
}
结果:
模糊查询sname包含“贾”的信息

再次编写Junit单元测试(test.java):
结果:
向student表添加数据:sno=109,sname=贾迎春,sex=女,age=21,addr=缀锦楼

在查询数据库,数据库的值并没有变。。。

mapper代理开发方式
mapper代理开发方式,遵循规则前提下,让框架自动生成代理类对象,只需开发者编写dao接口,不用实现类。
1. mapper映射文件必须和mapper接口在同一个位置,且同名
2. mapper映射文件中namespace的值是mapper接口地址
3. mapper接口中的方法名和mapper映射文件中statement的id一致
4. mapper接口中的方法参数类型和mapper映射文件中statement的parameterType的类型一致
5. mapper接口中的方法返回值类型和mapper映射文件中statement的resultType指定的类型一致。
开发步骤:
1.编写mapper接口
2.编写mapper映射文件
3.在配置文件中导入mapper映射文件
<mapper class="com.mybatis03.mapper.UserMapper"></mapper>
4.编程测试
UserMapper userMapper = session.getMapper(UserMapper.class);
代码实现:
目录结构:

mapper接口(UserMapper.java):
package com.mybatis03.mapper;
import com.mybatis03.pojo.UserPojo;
import java.util.List;
public interface UserMapper {
UserPojo selectById(Integer sno) throws Exception;
List<UserPojo> selectByName(String sname) throws Exception;
int insertUser(UserPojo user) throws Exception;
int updateUser(UserPojo user) throws Exception;
int deleteUser(Integer id) throws Exception;
}
映射文件(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.mybatis03.mapper.UserMapper">
<!-- select标签写查询
id: 指定标签的唯一标识
parameterType:指定输入参数的类型
#{} : 向sql中注入参数值, 相当于 ps的? , 如果参数是简单类型 , 花括号中可以是任意值
resultType: 指定查询到的结果的输出映射.
-->
<select id="selectById" parameterType="java.lang.Integer" resultType="com.mybatis03.pojo.UserPojo">
SELECT sno,sname,age,sex,addr FROM student WHERE sno=#{sno}
</select>
<!--
${} : 把参数原封不动拼接到sql中 , 有sql注入问题.
${} : 参数值如果是简单类型 ,花括号中只能用value
resultType : 如果输出映射为集合,只指定集合中元素的类型
-->
<select id="selectByName" parameterType="java.lang.String" resultType="com.mybatis03.pojo.UserPojo">
SELECT sno,sname,sex,age,addr FROM student WHERE sname LIKE '%${value}%'
</select>
<!--
#{} : 如果参数是pojo类型 , 可以用pojo类的属性名获得属性值.
-->
<insert id="insertUser" parameterType="com.mybatis03.pojo.UserPojo">
<!-- 查询且返回主键
keyProperty:指定保存主键的属性名
order: 指定查询主键的sql语句在插入语句的前面还是后面执行
-->
<!--<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
SELECT tuser_id.NEXTVAL FROM dual
</selectKey>-->
INSERT INTO student VALUES (#{sno},#{sname},#{age},#{sex},#{addr})
</insert>
<update id="updateUser" parameterType="com.mybatis03.pojo.UserPojo">
UPDATE student SET
sname=#{sname},
age=#{age},
sex=#{sex},
addr=#{addr}
WHERE sno=#{sno}
</update>
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM student WHERE sno=#{sno}
</delete>
</mapper>
配置文件(mybatis.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>
<!--数据库配置,default表示默认采用哪一个数据库环境-->
<environments default="development">
<!--id为development表示开发环境数据库,id为product表示生产环境数据库-->
<environment id="development">
<!--使用JDBC事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--连接池配置,type为POOLED采用连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql_test"/>
<property name="username" value="root"/>
<property name="password" value="13474501003"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper class="com.mybatis03.mapper.UserMapper"></mapper>
</mappers>
</configuration>
log4j.properties属性配置文件(log4j.properties):
# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
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
UserPojo:
package com.mybatis03.pojo;
public class UserPojo {
private Integer sno;
private String sname;
private Character sex;
private Integer age;
private String addr;
//
public Integer getSno() {
return sno;
}
public void setSno(Integer sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Character getSex() {
return sex;
}
public void setSex(Character sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
//
@Override
public String toString() {
return "UserPo{" +
"sno=" + sno +
", sname='" + sname + '\'' +
", sex=" + sex +
", age=" + age +
", addr='" + addr + '\'' +
'}' + '\n';
}
}
数据库:

test测试:
package com.mybatis03.test;
import com.mybatis03.mapper.UserMapper;
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;
public class test {
@Test
public void test() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession session = sqlSessionFactory.openSession();
//
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.selectById(103));
}
}
结果:
查询sno=103的信息

在编写test测试:
package com.mybatis03.test;
import com.mybatis03.mapper.UserMapper;
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;
public class test {
@Test
public void test() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession session = sqlSessionFactory.openSession();
//
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.selectByName("贾"));
}
}
结果:
模糊查询sname包含“贾”的信息

浙公网安备 33010602011771号