原始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包含“贾”的信息

 

posted on 2021-10-07 23:50  tom和mt  阅读(211)  评论(0)    收藏  举报